# 簡易程式運行
- Python
- C#
- Java
- C++
- Proto
- JavaScript
# Python 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 Python API
方式一:在 cmd 中直接使用 pip 安裝。
- 初次安裝:Windows 系統
$ pip install futu-api,Linux/Mac系統$ pip3 install futu-api。 - 二次升級:Windows 系統
$ pip install futu-api --upgrade,Linux/Mac系統$ pip3 install futu-api --upgrade。
- 初次安裝:Windows 系統
方式二:點擊下載最新版本的 Python API 安裝包。
# 第三步:建立新專案
打開 PyCharm,在 Welcome to PyCharm 視窗中,點擊 New Project。如果你已經建立了一個專案,可以選擇打開該專案。

# 第四步:建立新檔案
在該專案下,建立新 Python 檔案,並把下面的範例程式碼複製到檔案裏。
範例程式碼功能包括查看行情快照、模擬交易下單。
from futu import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111) # 建立行情對象
print(quote_ctx.get_market_snapshot('HK.00700')) # 獲取港股 HK.00700 的快照數據
quote_ctx.close() # 關閉對象,防止連接條數用盡
trd_ctx = OpenSecTradeContext(host='127.0.0.1', port=11111) # 建立交易對象
print(trd_ctx.place_order(price=500.0, qty=100, code="HK.00700", trd_side=TrdSide.BUY, trd_env=TrdEnv.SIMULATE)) # 模擬交易,下單(如果是真實環境交易,在此之前需要先解鎖交易密碼)
trd_ctx.close() # 關閉對象,防止連接條數用盡
2
3
4
5
6
7
8
9
10
11
# 第五步:運行檔案
右鍵點擊運行,可以看到運行成功的返回資訊如下:
2020-11-05 17:09:29,705 [open_context_base.py] _socket_reconnect_and_wait_ready:255: Start connecting: host=127.0.0.1; port=11111;
2020-11-05 17:09:29,705 [open_context_base.py] on_connected:344: Connected : conn_id=1;
2020-11-05 17:09:29,706 [open_context_base.py] _handle_init_connect:445: InitConnect ok: conn_id=1; info={'server_version': 218, 'login_user_id': 7157878, 'conn_id': 6730043337026687703, 'conn_key': '3F17CF3EEF912C92', 'conn_iv': 'C119DDDD6314F18A', 'keep_alive_interval': 10, 'is_encrypt': False};
(0, code update_time last_price open_price high_price ... after_high_price after_low_price after_change_val after_change_rate after_amplitude
0 HK.00700 2020-11-05 16:08:06 625.0 610.0 625.0 ... N/A N/A N/A N/A N/A
[1 rows x 132 columns])
2020-11-05 17:09:29,739 [open_context_base.py] _socket_reconnect_and_wait_ready:255: Start connecting: host=127.0.0.1; port=11111;
2020-11-05 17:09:29,739 [network_manager.py] work:366: Close: conn_id=1
2020-11-05 17:09:29,739 [open_context_base.py] on_connected:344: Connected : conn_id=2;
2020-11-05 17:09:29,740 [open_context_base.py] _handle_init_connect:445: InitConnect ok: conn_id=2; info={'server_version': 218, 'login_user_id': 7157878, 'conn_id': 6730043337169705045, 'conn_key': 'A624CF3EEF91703C', 'conn_iv': 'BF1FF3806414617B', 'keep_alive_interval': 10, 'is_encrypt': False};
(0, code stock_name trd_side order_type order_status ... dealt_avg_price last_err_msg remark time_in_force fill_outside_rth
0 HK.00700 騰訊控股 BUY NORMAL SUBMITTING ... 0.0 DAY N/A
[1 rows x 16 columns])
2020-11-05 17:09:32,843 [network_manager.py] work:366: Close: conn_id=2
(0, code stock_name trd_side order_type order_status ... dealt_avg_price last_err_msg remark time_in_force fill_outside_rth
0 HK.00700 騰訊控股 BUY ABSOLUTE_LIMIT SUBMITTED ... 0.0 DAY N/A
[1 rows x 16 columns])
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# C# 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 C# API
我們提供了兩種方式下載和升級 C# API,您可以任選其一:
方式一:在 cmd 中直接使用 nuget 下載或升級
$ dotnet add package futu-api(nuget 僅支援 C# API 原始碼下載,如需獲取更多的範例程式碼,請參考方式二)。方式二:點擊下載最新版本的 C# API 安裝包。解壓縮下載好的 FTAPI 檔案,
/FTAPI4NET是 C# API 的目錄,具體目錄結構請參見 FTAPI4NET 目錄結構。
# FTAPI4NET 目錄結構
+---FTAPI4Net FTAPI4NET 的原始碼。如果所用 .NET 版本不兼容,可以用原始碼重新編譯出 FTAPI4Net.dll
+---lib
+---net4.5 .NET 4.5 下依賴的庫
| FTAPI4Net.dll OpenAPI 的 C# 版本
| Google.ProtocolBuffers.dll 第三方庫,用於解析 protobuf 數據
| Google.ProtocolBuffers.Serialization.dll 第三方庫,用於解析 protobuf 數據
|
+---netcore2.1 .NET Core 2.1 下依賴的庫
| FTAPI4Net.dll OpenAPI 的 C# 版本
| Google.ProtocolBuffers.dll 第三方庫,用於解析 protobuf 數據
| Google.ProtocolBuffers.Serialization.dll 第三方庫,用於解析 protobuf 數據
|
FTAPIChannel FTAPI4NET 依賴的 C 動態庫,用於 API 與 OpenD 通訊,存放於各個作業系統命名的目錄下。運行 .NET 程式前,需要將對應平台下的動態庫複製到程式運行的當前目錄中。
+---Sample 範例工程
+---tools 第三方工具,用於將 proto 協議轉為 C# 程式碼,詳見此目錄下的 readme.md 説明
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 第三步:匯入範例專案
打開 Visual Studio 開發環境,匯入目錄下的專案檔案 FTAPI4NetCore.sln。
# 第四步:運行
首先,檢查檔案中跑的範例程式中使用的接口配置是否跟 OpenD 的配置一致。
其次,檢查 Sample 專案下的 Program.cs 檔案中 Main 函數里需要運行的功能。運行後,可以看到如下輸出資訊:
InitConnected
Send QotGetUserSecurity: 3
{"staticInfoList":[{"basic":{"security":{"market":1,"code":"08311"},"id":69179038244983,"lotSize":10000,"secType":3,"name":"\u5706\u7f8e\u5149\u7535","listTime":"2014-02-07","delisting":false,"listTimestamp":1391702400}},{"basic":{"security":{"market":1,"code":"02127"},"id":79925046413391,"lotSize":2000,"secType":3,"name":"\u6c47\u68ee\u5bb6\u5c45","listTime":"2020-12-
29","delisting":false,"listTimestamp":1609171200}},{"basic":{"security":{"market":1,"code":"EVG2101"},"id":71002729,"lotSize":2000,"secType":10,"name":"\u4e2d\u56fd\u6052\u5927\u96c6\u56e22101","listTime":"","delisting":false},"futureExData":{"lastTradeTime":"2021-01-28","lastTradeTimestamp":1611820800,"isMainContract":false}},{"basic":{"security":{"market":1,"code":"0
2333"},"id":53257594472733,"lotSize":500,"secType":3,"name":"\u957f\u57ce\u6c7d\u8f66","listTime":"2003-12-15","delisting":false,"listTimestamp":1071417600}},{"basic":{"security":{"market":1,"code":"06993"},"id":79882096745297,"lotSize":500,"secType":3,"name":"\u84dd\u6708\u4eae\u96c6\u56e2","listTime":"2020-12-16","delisting":false,"listTimestamp":1608048000}},{"basic
":{"security":{"market":1,"code":"01810"},"id":76033806042898,"lotSize":200,"secType":3,"name":"\u5c0f\u7c73\u96c6\u56e2-W","listTime":"2018-07-09","delisting":false,"listTimestamp":1531065600}},{"basic":{"security":{"market":1,"code":"09992"},"id":79869211846408,"lotSize":200,"secType":3,"name":"\u6ce1\u6ce1\u739b\u7279","listTime":"2020-12-11","delisting":false,"list
Timestamp":1607616000}},{"basic":{"security":{"market":1,"code":"03948"},"id":66709432045420,"lotSize":100,"secType":3,"name":"\u4f0a\u6cf0\u7164\u70ad","listTime":"2012-07-12","delisting":false,"listTimestamp":1342022400}},{"basic":{"security":{"market":1,"code":"01398"},"id":57754425230710,"lotSize":1000,"secType":3,"name":"\u5de5\u5546\u94f6\u884c","listTime":"2006-
10-27","delisting":false,"listTimestamp":1161878400}},{"basic":{"security":{"market":1,"code":"06618"},"id":79843442039258,"lotSize":50,"secType":3,"name":"\u4eac\u4e1c\u5065\u5eb7","listTime":"2020-12-08","delisting":false,"listTimestamp":1607356800}},{"basic":{"security":{"market":1,"code":"09698"},"id":79693118186978,"lotSize":100,"secType":3,"name":"\u4e07\u56fd\u6
570\u636e-SW","listTime":"2020-11-02","delisting":false,"listTimestamp":1604246400}},{"basic":{"security":{"market":1,"code":"03690"},"id":76364518526570,"lotSize":100,"secType":3,"name":"\u7f8e\u56e2-W","listTime":"2018-09-20","delisting":false,"listTimestamp":1537372800}},{"basic":{"security":{"market":1,"code":"09988"},"id":78224239372036,"lotSize":100,"secType":3,"
name":"\u963f\u91cc\u5df4\u5df4-SW","listTime":"2019-11-26","delisting":false,"listTimestamp":1574697600}},{"basic":{"security":{"market":1,"code":"800000"},"id":800000,"lotSize":0,"secType":6,"name":"\u6052\u751f\u6307\u6570","listTime":"1970-01-01","delisting":false,"listTimestamp":0}},{"basic":{"security":{"market":1,"code":"00005"},"id":5,"lotSize":400,"secType":3,
"name":"\u6c47\u4e30\u63a7\u80a1","listTime":"1970-01-01","delisting":false,"listTimestamp":0}},{"basic":{"security":{"market":1,"code":"00175"},"id":4930622455983,"lotSize":1000,"secType":3,"name":"\u5409\u5229\u6c7d\u8f66","listTime":"1973-02-23","delisting":false,"listTimestamp":99244800}},{"basic":{"security":{"market":1,"code":"09677"},"id":79598628906445,"lotSize
":1000,"secType":3,"name":"\u5a01\u6d77\u94f6\u884c","listTime":"2020-10-12","delisting":false,"listTimestamp":1602432000}},{"basic":{"security":{"market":1,"code":"06055"},"id":77494094927783,"lotSize":1000,"secType":3,"name":"\u4e2d\u70df\u9999\u6e2f","listTime":"2019-06-12","delisting":false,"listTimestamp":1560268800}},{"basic":{"security":{"market":1,"code":"00788
"},"id":76175539962644,"lotSize":2000,"secType":3,"name":"\u4e2d\u56fd\u94c1\u5854","listTime":"2018-08-08","delisting":false,"listTimestamp":1533657600}},{"basic":{"security":{"market":1,"code":"02318"},"id":54082228193550,"lotSize":500,"secType":3,"name":"\u4e2d\u56fd\u5e73\u5b89","listTime":"2004-06-24","delisting":false,"listTimestamp":1088006400}},{"basic":{"secur
ity":{"market":1,"code":"BK1011"},"id":10001011,"lotSize":0,"secType":7,"name":"\u5316\u80a5\u53ca\u519c\u7528\u5316\u5408\u7269","listTime":"1970-01-01","delisting":false,"listTimestamp":0}},{"basic":{"security":{"market":1,"code":"BK1095"},"id":10001095,"lotSize":0,"secType":7,"name":"\u697c\u5b87\u5efa\u9020","listTime":"1970-01-01","delisting":false,"listTimestamp"
:0}},{"basic":{"security":{"market":1,"code":"01328"},"id":59274843653424,"lotSize":10000,"secType":3,"name":"\u91d1\u6d8c\u6295\u8d44","listTime":"2007-10-16","delisting":false,"listTimestamp":1192464000}},{"basic":{"security":{"market":1,"code":"00900"},"id":40312563041156,"lotSize":2000,"secType":3,"name":"AEON\u4fe1\u8d37","listTime":"1995-09-14","delisting":false,
"listTimestamp":811008000}},{"basic":{"security":{"market":1,"code":"00030"},"id":34144990003230,"lotSize":2000,"secType":3,"name":"\u4e07\u9686\u63a7\u80a1\u96c6\u56e2","listTime":"1991-10-09","delisting":false,"listTimestamp":686937600}},{"basic":{"security":{"market":1,"code":"00028"},"id":26989574488092,"lotSize":1000,"secType":3,"name":"\u5929\u5b89","listTime":"1
987-03-18","delisting":false,"listTimestamp":542995200}},{"basic":{"security":{"market":1,"code":"00519"},"id":25447681229319,"lotSize":5000,"secType":3,"name":"\u5b9e\u529b\u5efa\u4e1a","listTime":"1986-03-24","delisting":false,"listTimestamp":511977600}},{"basic":{"security":{"market":1,"code":"00276"},"id":4140348473620,"lotSize":3000,"secType":3,"name":"\u8499\u53e
4\u80fd\u6e90","listTime":"1972-08-23","delisting":false,"listTimestamp":83347200}},{"basic":{"security":{"market":1,"code":"06862"},"id":76385993366222,"lotSize":1000,"secType":3,"name":"\u6d77\u5e95\u635e","listTime":"2018-09-26","delisting":false,"listTimestamp":1537891200}},{"basic":{"security":{"market":1,"code":"00451"},"id":34866544509379,"lotSize":2000,"secType
":3,"name":"\u534f\u946b\u65b0\u80fd\u6e90","listTime":"1992-03-25","delisting":false,"listTimestamp":701452800}},{"basic":{"security":{"market":1,"code":"02899"},"id":53291954211667,"lotSize":2000,"secType":3,"name":"\u7d2b\u91d1\u77ff\u4e1a","listTime":"2003-12-23","delisting":false,"listTimestamp":1072108800}},{"basic":{"security":{"market":1,"code":"08133"},"id":71
098888626117,"lotSize":20000,"secType":3,"name":"\u94f8\u80fd\u63a7\u80a1","listTime":"2015-04-30","delisting":false,"listTimestamp":1430323200}},{"basic":{"security":{"market":1,"code":"01432"},"id":69857643070872,"lotSize":1000,"secType":3,"name":"\u4e2d\u56fd\u5723\u7267","listTime":"2014-07-15","delisting":false,"listTimestamp":1405353600}},{"basic":{"security":{"m
arket":1,"code":"09933"},"id":78426102834893,"lotSize":4000,"secType":3,"name":"GHW INTL","listTime":"2020-01-21","delisting":false,"listTimestamp":1579536000}},{"basic":{"security":{"market":1,"code":"07500"},"id":77494094929228,"lotSize":100,"secType":4,"name":"\u5357\u65b9\u4e24\u500d\u770b\u7a7a\u6052\u6307","listTime":"2019-05-28","delisting":false,"listTimestamp"
:1558972800}},{"basic":{"security":{"market":1,"code":"00981"},"id":53661321397205,"lotSize":500,"secType":3,"name":"\u4e2d\u82af\u56fd\u9645","listTime":"2004-03-18","delisting":false,"listTimestamp":1079539200}}]}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
提示
- 如果遇到找不到 FTAPIChannel 動態庫檔案,需要從 lib 資料夾裏的對應平台的 FTAPIChannel 檔案,複製到程式運行的當前目錄下。
# Java 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 Java API
我們提供了兩種方式下載和升級 Java API,您可以任選其一:
# 方式一:通過 maven 倉庫配置
- 在 maven 中選擇最新的 futu-api 版本,點擊進入。
- 將網頁右側的相關配置複製添加至您的工程設置中。
舉例:使用 Apache Maven 來管理專案的用户,可以將下圖紅框中的程式碼複製至您的工程設置中。
# 方式二:下載 Java API
- 點擊下載最新版本的 Java API 安裝包。
- 解壓縮下載好的 FTAPI 檔案,
/FTAPI4J是 Java API 的目錄,將 FTAPI4J 目錄結構 中的/lib/futu-api-.x.y.z.jar添加到您的工程設置中。
# FTAPI4J 目錄結構
+---ftapi4j futu-api 原始碼,如果所用 JDK 版本不兼容,您可以用這裏的工程重新編譯出 futu-api.jar
+---lib 存放公共庫文件
| futu-api-x.y.z.jar Futu API 的 Java 版本
| bcprov-jdk15on-1.68.jar 第三方庫,用於加解密
| bcpkix-jdk15on-1.68.jar 第三方庫,用於加解密
| protobuf-java-3.5.1.jar 第三方庫,用於解析 protobuf 數據
+---sample 範例工程
+---resources maven 工程預設生成的目錄
2
3
4
5
6
7
8
# 第三步:建立 futu-api 工程
以 IntelliJ IDEA 為例:
新建工程:

選擇 maven 專案:

選擇專案路徑:

選擇 maven 工具,這裏採用 IDEA 的自帶工具:

進入專案,等待專案初始化完成,完成後下方視窗出現 “BUILD SUCCESS” 字樣:

配置 futu-api
若您是通過 maven 倉庫進行配置:
直接編輯 pom.xml 檔案,在 dependencies 中插入futu-api 依賴(x.y.z 替換為版本號):

若您是通過官網下載 Java API:
(1)在專案下建立 /lib/ 目錄,將 /FTAPI4J/lib/futu-api-x.y.z.jar 檔案複製到 /lib/ 目錄下(例如:下圖中的 futu-api-5.4.1607.jar)。
(2)編輯 pom.xml 檔案,在 dependencies 中插入 futu-api 依賴。

# 第四步:匯入範例專案
範例提供了 maven 編譯腳本,可以用支援 maven 的 IDE 匯入 /sample 目錄下的工程。
# 第五步:運行
檢查 main.java 檔案中跑的範例程式中使用的配置是否跟 OpenD 的配置一致。
運行
/sample目錄下的 main.java 檔案,可以看到運行成功的返回資訊如下:
Qot onInitConnect: ret=true desc=Succeed! connID=6750011030360491012
onReply_GetMarketState: retType: 0
retMsg: ""
errCode: 0
s2c {
marketInfoList {
security {
market: 1
code: "00700"
}
name: "\350\205\276\350\256\257\346\216\247\350\202\241"
marketState: 6
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
提示
- 如果遇到找不到 FTAPIChannel 動態庫檔案,需要將
/lib資料夾裏的對應平台的 FTAPIChannel 檔案,複製到程式運行的當前目錄下。
# C++ 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 C++ API
下載最新版本的 C++ API 安裝包。
解壓縮下載好的 FTAPI 檔案,/FTAPI4CPP 是 C++ API 的目錄,具體目錄結構請參見 FTAPI4CPP 目錄結構。
# FTAPI4CPP 目錄結構
+---Bin 存放各種系統預設編譯環境編譯出的公共庫文件
+---Include 存放公共頭文件,以及 proto 協議生成的 .h/.cc 文件的目錄
+---Sample 範例工程
+---Src 原始碼
+---FTAPI FTAPI 原始碼
+---protobuf protobuf 原始碼
2
3
4
5
6
# 第三步:匯入範例專案
範例提供了 Visual Studio 和 XCode 的工程檔案,可以用 Visual Studio 或 XCode 開發環境匯入 Sample 專案。
# 第四步:運行
檢查 simpleSample.cpp 檔案中跑的範例程式中使用的接口配置是否跟 OpenD 的配置一致。
運行後,可以看到運行成功的返回資訊如下:
Run GetSecuritySnapshotDemo
InitQot, suc = 1
GetHKEqtySecList, count = 2698
GetSecuritySnapshot, i = 0
GetSecuritySnapshot, i = 1
GetSecuritySnapshot, i = 2
GetSecuritySnapshot, i = 3
GetSecuritySnapshot, i = 4
GetSecuritySnapshot, i = 5
GetSecuritySnapshot, i = 6
GetSecuritySnapshot, i = 7
GetSecuritySnapshot, i = 8
GetSecuritySnapshot, i = 9
GetSecuritySnapshot, i = 10
GetSecuritySnapshot, i = 11
GetSecuritySnapshot, i = 12
GetSecuritySnapshot, i = 13
ParseHKEqtySecQot, first = (HK.00001, 56.65)
GetSecuritySnapshotDemo End
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
點擊下載最新版本的Protobuf API 安裝包。
# JavaScript 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 JavaScript API
方式一:在 cmd 中直接使用 npm 安裝或升級(npm 僅支援 JavaScript API 原始碼的下載,如需獲取更多的範例程式碼,請參考方式二)。
- 初次安裝:
$ npm install --save futu-api。 - 二次升級:
$ npm update futu-api。
- 初次安裝:
方式二:點擊下載最新版本的 JavaScript API 安裝包。
解壓縮下載好的 FTAPI 檔案,/FTAPI4JS是 JavaScript API 的目錄,具體目錄結構請參見 FTAPI4JS 目錄結構。
# FTAPI4JS 目錄結構
+---Sample 範例工程
+---src 原始碼
2
# 第三步:運行範例
使用 Visual Studio Code 打開範例程式碼目錄
FTAPI4JS/sample。找到每個 Demo 檔案中啓動 WebSocket 相關程式碼,如下圖,修改成 OpenD 對應的配置(注意:可視化 OpenD 預設會啓動 WebSocket,命令行 OpenD 則需要 配置參數 自行啓動 WebSocket)。

在 Visual Studio Code 控制台中輸入
npm install安裝專案依賴。
在 Visual Studio Code 控制台中輸
npm run serve運行專案。
專案運行成功後,打開對應的服務地址。

在頁面上體驗相關功能。

- Python
- C#
- Java
- C++
- Proto
- JavaScript
# Python 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 Python API
方式一:在 cmd 中直接使用 pip 安裝。
- 初次安裝:Windows 系統
$ pip install moomoo-api,Linux/Mac系統$ pip3 install moomoo-api。 - 二次升級:Windows 系統
$ pip install moomoo-api --upgrade,Linux/Mac系統$ pip3 install moomoo-api --upgrade。
- 初次安裝:Windows 系統
方式二:通過 moomoo 官網 下載最新版本的 Python API。
# 第三步:建立新專案
打開 PyCharm,在 Welcome to PyCharm 視窗中,點擊 New Project。如果你已經建立了一個專案,可以選擇打開該專案。

# 第四步:建立新檔案
在該專案下,建立新 Python 檔案,並把下面的範例程式碼複製到檔案裏。
範例程式碼功能包括查看行情快照、模擬交易下單。
from moomoo import *
quote_ctx = OpenQuoteContext(host='127.0.0.1', port=11111) # 建立行情對象
print(quote_ctx.get_market_snapshot('HK.00700')) # 獲取港股 HK.00700 的快照數據
quote_ctx.close() # 關閉對象,防止連接條數用盡
trd_ctx = OpenSecTradeContext(host='127.0.0.1', port=11111) # 建立交易對象
print(trd_ctx.place_order(price=500.0, qty=100, code="HK.00700", trd_side=TrdSide.BUY, trd_env=TrdEnv.SIMULATE)) # 模擬交易,下單(如果是真實環境交易,在此之前需要先解鎖交易密碼)
trd_ctx.close() # 關閉對象,防止連接條數用盡
2
3
4
5
6
7
8
9
10
11
# 第五步:運行檔案
右鍵點擊運行,可以看到運行成功的返回資訊如下:
2020-11-05 17:09:29,705 [open_context_base.py] _socket_reconnect_and_wait_ready:255: Start connecting: host=127.0.0.1; port=11111;
2020-11-05 17:09:29,705 [open_context_base.py] on_connected:344: Connected : conn_id=1;
2020-11-05 17:09:29,706 [open_context_base.py] _handle_init_connect:445: InitConnect ok: conn_id=1; info={'server_version': 218, 'login_user_id': 7157878, 'conn_id': 6730043337026687703, 'conn_key': '3F17CF3EEF912C92', 'conn_iv': 'C119DDDD6314F18A', 'keep_alive_interval': 10, 'is_encrypt': False};
(0, code update_time last_price open_price high_price ... after_high_price after_low_price after_change_val after_change_rate after_amplitude
0 HK.00700 2020-11-05 16:08:06 625.0 610.0 625.0 ... N/A N/A N/A N/A N/A
[1 rows x 132 columns])
2020-11-05 17:09:29,739 [open_context_base.py] _socket_reconnect_and_wait_ready:255: Start connecting: host=127.0.0.1; port=11111;
2020-11-05 17:09:29,739 [network_manager.py] work:366: Close: conn_id=1
2020-11-05 17:09:29,739 [open_context_base.py] on_connected:344: Connected : conn_id=2;
2020-11-05 17:09:29,740 [open_context_base.py] _handle_init_connect:445: InitConnect ok: conn_id=2; info={'server_version': 218, 'login_user_id': 7157878, 'conn_id': 6730043337169705045, 'conn_key': 'A624CF3EEF91703C', 'conn_iv': 'BF1FF3806414617B', 'keep_alive_interval': 10, 'is_encrypt': False};
(0, code stock_name trd_side order_type order_status ... dealt_avg_price last_err_msg remark time_in_force fill_outside_rth
0 HK.00700 騰訊控股 BUY NORMAL SUBMITTING ... 0.0 DAY N/A
[1 rows x 16 columns])
2020-11-05 17:09:32,843 [network_manager.py] work:366: Close: conn_id=2
(0, code stock_name trd_side order_type order_status ... dealt_avg_price last_err_msg remark time_in_force fill_outside_rth
0 HK.00700 騰訊控股 BUY ABSOLUTE_LIMIT SUBMITTED ... 0.0 DAY N/A
[1 rows x 16 columns])
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# C# 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 C# API
我們提供了兩種方式下載和升級 C# API,您可以任選其一:
方式一:在 cmd 中直接使用 nuget 下載或升級
$ dotnet add package moomoo-api(nuget 僅支援 C# API 原始碼下載,如需獲取更多的範例程式碼,請參考方式二)。方式二:通過 moomoo 官網 下載最新版本的 C# API。解壓縮下載好的 MMAPI 檔案,
/MMAPI4NET是 C# API 的目錄,具體目錄結構請參見 MMAPI4NET 目錄結構。
# MMAPI4NET 目錄結構
+---MMAPI4Net MMAPI4NET 的原始碼。如果所用 .NET 版本不兼容,可以用原始碼重新編譯出 MMAPI4Net.dll
+---lib
+---net4.5 .NET 4.5 下依賴的庫
| MMAPI4Net.dll OpenAPI 的 C# 版本
| Google.ProtocolBuffers.dll 第三方庫,用於解析 protobuf 數據
| Google.ProtocolBuffers.Serialization.dll 第三方庫,用於解析 protobuf 數據
|
+---netcore2.1 .NET Core 2.1 下依賴的庫
| MMAPI4Net.dll OpenAPI 的 C# 版本
| Google.ProtocolBuffers.dll 第三方庫,用於解析 protobuf 數據
| Google.ProtocolBuffers.Serialization.dll 第三方庫,用於解析 protobuf 數據
|
MMAPIChannel MMAPI4NET 依賴的 C 動態庫,用於 API 與 OpenD 通訊,存放於各個作業系統命名的目錄下。運行 .NET 程式前,需要將對應平台下的動態庫複製到程式運行的當前目錄中。
+---Sample 範例工程
+---tools 第三方工具,用於將 proto 協議轉為 C# 程式碼,詳見此目錄下的 readme.md 説明
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 第三步:匯入範例專案
打開 Visual Studio 開發環境,匯入目錄下的專案檔案 mmAPI4NetCore.sln。
# 第四步:運行
首先,檢查檔案中跑的範例程式中使用的接口配置是否跟 OpenD 的配置一致。
其次,檢查 Sample 專案下的 Program.cs 檔案中 Main 函數里需要運行的功能。運行後,可以看到如下輸出資訊:
InitConnected
Send QotGetUserSecurity: 3
{"staticInfoList":[{"basic":{"security":{"market":1,"code":"08311"},"id":69179038244983,"lotSize":10000,"secType":3,"name":"\u5706\u7f8e\u5149\u7535","listTime":"2014-02-07","delisting":false,"listTimestamp":1391702400}},{"basic":{"security":{"market":1,"code":"02127"},"id":79925046413391,"lotSize":2000,"secType":3,"name":"\u6c47\u68ee\u5bb6\u5c45","listTime":"2020-12-
29","delisting":false,"listTimestamp":1609171200}},{"basic":{"security":{"market":1,"code":"EVG2101"},"id":71002729,"lotSize":2000,"secType":10,"name":"\u4e2d\u56fd\u6052\u5927\u96c6\u56e22101","listTime":"","delisting":false},"futureExData":{"lastTradeTime":"2021-01-28","lastTradeTimestamp":1611820800,"isMainContract":false}},{"basic":{"security":{"market":1,"code":"0
2333"},"id":53257594472733,"lotSize":500,"secType":3,"name":"\u957f\u57ce\u6c7d\u8f66","listTime":"2003-12-15","delisting":false,"listTimestamp":1071417600}},{"basic":{"security":{"market":1,"code":"06993"},"id":79882096745297,"lotSize":500,"secType":3,"name":"\u84dd\u6708\u4eae\u96c6\u56e2","listTime":"2020-12-16","delisting":false,"listTimestamp":1608048000}},{"basic
":{"security":{"market":1,"code":"01810"},"id":76033806042898,"lotSize":200,"secType":3,"name":"\u5c0f\u7c73\u96c6\u56e2-W","listTime":"2018-07-09","delisting":false,"listTimestamp":1531065600}},{"basic":{"security":{"market":1,"code":"09992"},"id":79869211846408,"lotSize":200,"secType":3,"name":"\u6ce1\u6ce1\u739b\u7279","listTime":"2020-12-11","delisting":false,"list
Timestamp":1607616000}},{"basic":{"security":{"market":1,"code":"03948"},"id":66709432045420,"lotSize":100,"secType":3,"name":"\u4f0a\u6cf0\u7164\u70ad","listTime":"2012-07-12","delisting":false,"listTimestamp":1342022400}},{"basic":{"security":{"market":1,"code":"01398"},"id":57754425230710,"lotSize":1000,"secType":3,"name":"\u5de5\u5546\u94f6\u884c","listTime":"2006-
10-27","delisting":false,"listTimestamp":1161878400}},{"basic":{"security":{"market":1,"code":"06618"},"id":79843442039258,"lotSize":50,"secType":3,"name":"\u4eac\u4e1c\u5065\u5eb7","listTime":"2020-12-08","delisting":false,"listTimestamp":1607356800}},{"basic":{"security":{"market":1,"code":"09698"},"id":79693118186978,"lotSize":100,"secType":3,"name":"\u4e07\u56fd\u6
570\u636e-SW","listTime":"2020-11-02","delisting":false,"listTimestamp":1604246400}},{"basic":{"security":{"market":1,"code":"03690"},"id":76364518526570,"lotSize":100,"secType":3,"name":"\u7f8e\u56e2-W","listTime":"2018-09-20","delisting":false,"listTimestamp":1537372800}},{"basic":{"security":{"market":1,"code":"09988"},"id":78224239372036,"lotSize":100,"secType":3,"
name":"\u963f\u91cc\u5df4\u5df4-SW","listTime":"2019-11-26","delisting":false,"listTimestamp":1574697600}},{"basic":{"security":{"market":1,"code":"800000"},"id":800000,"lotSize":0,"secType":6,"name":"\u6052\u751f\u6307\u6570","listTime":"1970-01-01","delisting":false,"listTimestamp":0}},{"basic":{"security":{"market":1,"code":"00005"},"id":5,"lotSize":400,"secType":3,
"name":"\u6c47\u4e30\u63a7\u80a1","listTime":"1970-01-01","delisting":false,"listTimestamp":0}},{"basic":{"security":{"market":1,"code":"00175"},"id":4930622455983,"lotSize":1000,"secType":3,"name":"\u5409\u5229\u6c7d\u8f66","listTime":"1973-02-23","delisting":false,"listTimestamp":99244800}},{"basic":{"security":{"market":1,"code":"09677"},"id":79598628906445,"lotSize
":1000,"secType":3,"name":"\u5a01\u6d77\u94f6\u884c","listTime":"2020-10-12","delisting":false,"listTimestamp":1602432000}},{"basic":{"security":{"market":1,"code":"06055"},"id":77494094927783,"lotSize":1000,"secType":3,"name":"\u4e2d\u70df\u9999\u6e2f","listTime":"2019-06-12","delisting":false,"listTimestamp":1560268800}},{"basic":{"security":{"market":1,"code":"00788
"},"id":76175539962644,"lotSize":2000,"secType":3,"name":"\u4e2d\u56fd\u94c1\u5854","listTime":"2018-08-08","delisting":false,"listTimestamp":1533657600}},{"basic":{"security":{"market":1,"code":"02318"},"id":54082228193550,"lotSize":500,"secType":3,"name":"\u4e2d\u56fd\u5e73\u5b89","listTime":"2004-06-24","delisting":false,"listTimestamp":1088006400}},{"basic":{"secur
ity":{"market":1,"code":"BK1011"},"id":10001011,"lotSize":0,"secType":7,"name":"\u5316\u80a5\u53ca\u519c\u7528\u5316\u5408\u7269","listTime":"1970-01-01","delisting":false,"listTimestamp":0}},{"basic":{"security":{"market":1,"code":"BK1095"},"id":10001095,"lotSize":0,"secType":7,"name":"\u697c\u5b87\u5efa\u9020","listTime":"1970-01-01","delisting":false,"listTimestamp"
:0}},{"basic":{"security":{"market":1,"code":"01328"},"id":59274843653424,"lotSize":10000,"secType":3,"name":"\u91d1\u6d8c\u6295\u8d44","listTime":"2007-10-16","delisting":false,"listTimestamp":1192464000}},{"basic":{"security":{"market":1,"code":"00900"},"id":40312563041156,"lotSize":2000,"secType":3,"name":"AEON\u4fe1\u8d37","listTime":"1995-09-14","delisting":false,
"listTimestamp":811008000}},{"basic":{"security":{"market":1,"code":"00030"},"id":34144990003230,"lotSize":2000,"secType":3,"name":"\u4e07\u9686\u63a7\u80a1\u96c6\u56e2","listTime":"1991-10-09","delisting":false,"listTimestamp":686937600}},{"basic":{"security":{"market":1,"code":"00028"},"id":26989574488092,"lotSize":1000,"secType":3,"name":"\u5929\u5b89","listTime":"1
987-03-18","delisting":false,"listTimestamp":542995200}},{"basic":{"security":{"market":1,"code":"00519"},"id":25447681229319,"lotSize":5000,"secType":3,"name":"\u5b9e\u529b\u5efa\u4e1a","listTime":"1986-03-24","delisting":false,"listTimestamp":511977600}},{"basic":{"security":{"market":1,"code":"00276"},"id":4140348473620,"lotSize":3000,"secType":3,"name":"\u8499\u53e
4\u80fd\u6e90","listTime":"1972-08-23","delisting":false,"listTimestamp":83347200}},{"basic":{"security":{"market":1,"code":"06862"},"id":76385993366222,"lotSize":1000,"secType":3,"name":"\u6d77\u5e95\u635e","listTime":"2018-09-26","delisting":false,"listTimestamp":1537891200}},{"basic":{"security":{"market":1,"code":"00451"},"id":34866544509379,"lotSize":2000,"secType
":3,"name":"\u534f\u946b\u65b0\u80fd\u6e90","listTime":"1992-03-25","delisting":false,"listTimestamp":701452800}},{"basic":{"security":{"market":1,"code":"02899"},"id":53291954211667,"lotSize":2000,"secType":3,"name":"\u7d2b\u91d1\u77ff\u4e1a","listTime":"2003-12-23","delisting":false,"listTimestamp":1072108800}},{"basic":{"security":{"market":1,"code":"08133"},"id":71
098888626117,"lotSize":20000,"secType":3,"name":"\u94f8\u80fd\u63a7\u80a1","listTime":"2015-04-30","delisting":false,"listTimestamp":1430323200}},{"basic":{"security":{"market":1,"code":"01432"},"id":69857643070872,"lotSize":1000,"secType":3,"name":"\u4e2d\u56fd\u5723\u7267","listTime":"2014-07-15","delisting":false,"listTimestamp":1405353600}},{"basic":{"security":{"m
arket":1,"code":"09933"},"id":78426102834893,"lotSize":4000,"secType":3,"name":"GHW INTL","listTime":"2020-01-21","delisting":false,"listTimestamp":1579536000}},{"basic":{"security":{"market":1,"code":"07500"},"id":77494094929228,"lotSize":100,"secType":4,"name":"\u5357\u65b9\u4e24\u500d\u770b\u7a7a\u6052\u6307","listTime":"2019-05-28","delisting":false,"listTimestamp"
:1558972800}},{"basic":{"security":{"market":1,"code":"00981"},"id":53661321397205,"lotSize":500,"secType":3,"name":"\u4e2d\u82af\u56fd\u9645","listTime":"2004-03-18","delisting":false,"listTimestamp":1079539200}}]}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
提示
- 如果遇到找不到 MMAPIChannel 動態庫檔案,需要從 lib 資料夾裏的對應平台的 MMAPIChannel 檔案,複製到程式運行的當前目錄下。
# Java 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 Java API
我們提供了兩種方式下載和升級 Java API,您可以任選其一:
# 方式一:通過 maven 倉庫配置
- 在 maven 中選擇最新的 moomoo-api 版本,點擊進入。
- 將網頁右側的相關配置複製添加至您的工程設置中。
舉例:使用 Apache Maven 來管理專案的用户,可以將下圖紅框中的程式碼複製至您的工程設置中。
# 方式二:通過官網下載 Java API
- 進入 moomoo 官網 下載最新版本的 Java API。
- 解壓縮下載好的 MMAPI 檔案,
/MMAPI4J是 Java API 的目錄,將 MMAPI4J 目錄結構 中的/lib/moomoo-api-.x.y.z.jar添加到您的工程設置中。
# MMAPI4J 目錄結構
+---mmapi4j moomoo-api 原始碼,如果所用 JDK 版本不兼容,您可以用這裏的工程重新編譯出 moomoo-api.jar
+---lib 存放公共庫文件
| moomoo-api-x.y.z.jar moomoo API 的 Java 版本
| bcprov-jdk15on-1.68.jar 第三方庫,用於加解密
| bcpkix-jdk15on-1.68.jar 第三方庫,用於加解密
| protobuf-java-3.5.1.jar 第三方庫,用於解析 protobuf 數據
+---sample 範例工程
+---resources maven 工程預設生成的目錄
2
3
4
5
6
7
8
# 第三步:建立 moomoo-api 工程
以 IntelliJ IDEA 為例:
新建工程:

選擇 maven 專案:

選擇專案路徑:

選擇 maven 工具,這裏採用 IDEA 的自帶工具:

進入專案,等待專案初始化完成,完成後下方視窗出現 “BUILD SUCCESS” 字樣:

配置 moomoo-api
若您是通過 maven 倉庫進行配置:
直接編輯 pom.xml 檔案,在 dependencies 中插入moomoo-api 依賴(x.y.z 替換為版本號):

若您是通過官網下載 Java API:
(1)在專案下建立 /lib/ 目錄,將 /MMAPI4J/lib/moomoo-api-x.y.z.jar 檔案複製到 /lib/ 目錄下(例如:下圖中的 moomoo-api-5.4.1607.jar)。
(2)編輯 pom.xml 檔案,在 dependencies 中插入 moomoo-api 依賴。

# 第四步:匯入範例專案
範例提供了 maven 編譯腳本,可以用支援 maven 的 IDE 匯入 /sample 目錄下的工程。
# 第五步:運行
檢查 main.java 檔案中跑的範例程式中使用的配置是否跟 OpenD 的配置一致。
運行
/sample目錄下的 main.java 檔案,可以看到運行成功的返回資訊如下:
Qot onInitConnect: ret=true desc=Succeed! connID=6750011030360491012
onReply_GetMarketState: retType: 0
retMsg: ""
errCode: 0
s2c {
marketInfoList {
security {
market: 1
code: "00700"
}
name: "\350\205\276\350\256\257\346\216\247\350\202\241"
marketState: 6
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
提示
- 如果遇到找不到 MMAPIChannel 動態庫檔案,需要將
/lib資料夾裏的對應平台的 MMAPIChannel 檔案,複製到程式運行的當前目錄下。
# C++ 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 C++ API
通過 moomoo 官網 下載最新版本的 C++ API。
解壓縮下載好的 MMAPI 檔案,/MMAPI4CPP 是 C++ API 的目錄,具體目錄結構請參見 MMAPI4CPP 目錄結構。
# MMAPI4CPP 目錄結構
+---Bin 存放各種系統預設編譯環境編譯出的公共庫文件
+---Include 存放公共頭文件,以及 proto 協議生成的 .h/.cc 文件的目錄
+---Sample 範例工程
+---Src 原始碼
+---MMAPI MMAPI 原始碼
+---protobuf protobuf 原始碼
2
3
4
5
6
# 第三步:匯入範例專案
範例提供了 Visual Studio 和 XCode 的工程檔案,可以用 Visual Studio 或 XCode 開發環境匯入 Sample 專案。
# 第四步:運行
檢查 simpleSample.cpp 檔案中跑的範例程式中使用的接口配置是否跟 OpenD 的配置一致。
運行後,可以看到運行成功的返回資訊如下:
Run GetSecuritySnapshotDemo
InitQot, suc = 1
GetHKEqtySecList, count = 2698
GetSecuritySnapshot, i = 0
GetSecuritySnapshot, i = 1
GetSecuritySnapshot, i = 2
GetSecuritySnapshot, i = 3
GetSecuritySnapshot, i = 4
GetSecuritySnapshot, i = 5
GetSecuritySnapshot, i = 6
GetSecuritySnapshot, i = 7
GetSecuritySnapshot, i = 8
GetSecuritySnapshot, i = 9
GetSecuritySnapshot, i = 10
GetSecuritySnapshot, i = 11
GetSecuritySnapshot, i = 12
GetSecuritySnapshot, i = 13
ParseHKEqtySecQot, first = (HK.00001, 56.65)
GetSecuritySnapshotDemo End
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
您可以通過 moomoo 官網 下載最新版本的 Protobuf API。
# JavaScript 範例
# 第一步:下載安裝登入 OpenD
請參考 這裏,完成 OpenD 的下載、安裝和登入。
# 第二步:下載 JavaScript API
方式一:在 cmd 中直接使用 npm 安裝或升級(npm 僅支援 JavaScript API 原始碼的下載,如需獲取更多的範例程式碼,請參考方式二)。
- 初次安裝:
$ npm install --save moomoo-api。 - 二次升級:
$ npm update moomoo-api。
- 初次安裝:
方式二:通過 moomoo 官網 下載最新版本的 JavaScript API。
解壓縮下載好的 MMAPI 檔案,/MMAPI4JS是 JavaScript API 的目錄,具體目錄結構請參見 MMAPI4JS 目錄結構。
# MMAPI4JS 目錄結構
+---Sample 範例工程
+---src 原始碼
2
# 第三步:運行範例
使用 Visual Studio Code 打開範例程式碼目錄
MMAPI4JS/sample。找到每個 Demo 檔案中啓動 WebSocket 相關程式碼,如下圖,修改成 OpenD 對應的配置(注意:可視化 OpenD 預設會啓動 WebSocket,命令行 OpenD 則需要 配置參數 自行啓動 WebSocket)。

在 Visual Studio Code 控制台中輸入
npm install安裝專案依賴。
在 Visual Studio Code 控制台中輸
npm run serve運行專案。
專案運行成功後,打開對應的服務地址。

在頁面上體驗相關功能。
