# 其他

# Q1:如何編譯C++ API?

A: moomoo api c++ SDK支持Windows/MacOS/Linux,每個系統提供了以下編譯環境生成的程式庫檔案:

操作系統 編譯工具
Windows Visual Studio 2013
Centos 7 g++ 4.8.5
Ubuntu 16.04 g++ 5.4.0
MacOS XCode 11

如果編譯器版本不同,或相依性項的protobuf版本不同,則可能需要自己使用原始碼重新編譯MMAPI和protobuf,原始碼位置見下圖目錄:

MMAPI目錄結構:
+---Bin                               存放各個系統預設編譯環境編譯出的相依性項庫
+---Include                           存放公共標頭檔,以及proto協議生成的.h/.cc文件
+---Sample                            示例專案
\---Src
    +---MMAPI                         MMAPI原始碼
    +---protobuf-all-3.5.1.tar.gz     protobuf原始碼
1
2
3
4
5
6
7

# 編譯步驟:

  1. 重新編譯protobuf:生成libprotobuf靜態程式庫
  2. 從協議proto檔案中生成C++檔案
  3. 重新編譯MMAPI: 原始碼在Src/MMAPI,生成libMMAPI靜態程式庫

# 步驟1: 重新編譯protobuf:

  • Windows:
    • 安裝CMake
    • 打開VS命令行工具,cd到protobuf/cmake目錄
    • 執行:cmake -G "Visual Studio 12 2019" -DCMAKE_INSTALL_PREFIX=install -Dprotobuf_BUILD_TESTS=OFF  這樣會生成Visual Studio 2019的項目檔案,其它版本Visual Studio請修改-G參數
    • 打開生成的Visual Studio項目檔案,平台工具組設置為v120_xp,編譯即可
  • Linux(參考protobuf/src/README)
    • 執行 ./autogen.sh
    • 執行 CXXFLAGS="-std=gnu++11" ./configure --disable-shared
    • 執行 make
    • 將生成的libprotobuf.a放入Bin/Linux目錄
  • MacOS(參考protobuf/src/README)
    • 使用brew安裝這些相依性項庫:autoconf automake libtool
    • 執行./configure CC=clang CXX="clang++ -std=gnu++11 -stdlib=libc++" --disable-shared

# 步驟2: 重新生成proto代碼

  • 上面編譯Protobuf後會同時生成可執行檔案protoc。用protoc將Include/Proto下面的.proto檔案生成對應的.h和.cc檔案。例如命令以下命令會從Common.proto生成對應的Common.pb.h和Common.pb.cc
    • protoc -I="MMAPI路徑/Include/Proto" --cpp_out="." MMAPI路徑/Include/Proto/Common.proto
  • 將生成的.h和.cc檔案放到Include/Proto下面

# 步驟3: 重新編譯MMAPI

  • Windows:新建Visual Studio C++靜態程式庫專案,將Src/MMAPI和Include下的原始碼加入專案中,平台工具組設置為v120_xp,然後編譯
  • Mac:新建XCode C++靜態程式庫專案,將Src/MMAPI和Include下的原始碼加入專案中,然後編譯
  • Linux:使用CMake編譯MMAPI靜態程式庫,在MMAPI路徑/Src目錄下執行:
    • cmake -DTARGET_OS=Linux

# Q2:有沒有更完整的策略範例可以參考?

A:

  • Python 策略範例在 /moomoo/examples/ 資料夾下。您可以通過執行如下命令,找到 Python API 的安裝路徑:
    import moomoo
    print(moomoo.__file__)
    
    1
    2
  • C# 策略範例在 /MMAPI4NET/Sample/ 資料夾下
  • Java 策略範例在 /MMAPI4J/sample/ 資料夾下
  • C++ 策略範例在 /MMAPI4CPP/Sample/ 資料夾下
  • JavaScript 策略範例在 /MMAPI4JS/sample/ 資料夾下

# Q3:使用 python API 匯入異常

場景一:已經在 Python 環境中安裝了 moomoo 模組,仍然提示 No module named 'moomoo'?
很可能是因為當前 IDE 所使用的 interpreter 並不是你裝過 moomoo 模組的 interpreter。也就是説,您的電腦可能裝了兩個以上的 Python 環境。 您可以操作如下兩步:

  1. 在 Python 中運行如下代碼,得到當前 interpreter 的路徑:
import sys
print(sys.executable)
1
2

示例圖:
No module named 'moomoo'

  1. 在命令行中,執行 $ D:\software\anaconda3\python.exe -m pip install moomoo-api(其中前半部分的檔案路徑來自第 1 步打印的路徑)。 這樣就可以在當前的 interpreter 中也安裝一份 moomoo 模組。

# Q4: import 成功了,仍然調用不了相關接口?

A:通常遇到這種情況,需要確認一下:成功匯入的 moomoo,是不是真正的 moomoo API 模組。以下幾種場景也可能 import 成功。

場景一:存在與“moomoo”重名的檔案

  1. 當前檔案名是 moomoo.py
  2. 當前檔案所在目錄下存在另一個名為 moomoo.py 的檔案
  3. 當前檔案所在目錄下存在名為 /moomoo 的資料夾

因此,我們強烈建議您,在給檔案 / 資料夾 / 專案起名的時候,不要起名叫“moomoo”。重名一時爽,查 bug 兩行淚。

場景二:誤安裝了一個名為“moomoo”的第三方程式庫

moomoo API 的正確名稱為moomoo-api,而非“moomoo”。

如果您安裝過名為“moomoo”的第三方程式庫,請將其卸載,並 下載 moomoo-api

以 PyCharm 為例:查看第三方程式庫的安裝情況。

settings
moomooku

# Q5:協議加密相關

A:

# 概述

您可以使用非對稱加密演算法 RSA,對策略程式(moomoo API)與 OpenD 之間的請求和返回內容進行加密,以保證通信安全。
如果您的策略程式(moomoo API)與 OpenD 在同一台電腦上,則通常無需加密。

# 協議加密流程

您可以嘗試通過以下步驟解決此問題:

  1. 通過第三方 web 平台自動生成密鑰檔案。

    • 具體方法:在 baidu 或 google 上搜索“RSA 在線生成”,密鑰格式設置為 PKCS#1,密鑰長度設置為 1024 bit,不需要設置私鑰密碼,點擊生成密鑰對
      ui-config
  2. 將生成的 RSA 加密私鑰 複製粘貼至 txt 記事本,並保存至 OpenD 所在電腦的指定路徑。

  3. 在 OpenD 所在的電腦中,指定 RSA 加密私鑰 的路徑。

    • 方式一:在 可視化 OpenD 啟動界面右側的“加密私鑰”一欄,指定上一步驟中放置 RSA 加密私鑰 的路徑。如下圖所示:
      ui-config
    • 方式二:在 命令行 OpenD 啟動檔案 OpenD.xml 中,找到參數rsa_private_key,將其設定為第 2 步中 RSA 加密私鑰 的路徑。如下圖所示:
      ui-config
  4. 將第 2 步中 txt 檔案另存至策略程式(moomoo API)所在電腦的指定路徑, 並在策略程式中將此路徑 設置為私鑰路徑

  5. 在策略程式(moomoo API)中啟用協議加密。 啟用協議加密的方式有兩種,其中方式二的優先級更高。

    • 方式一:對單條的連接加密(通用)。在對 行情對象交易對象 創建連接時,通過 是否啟用加密 參數設置加密。
    • 方式二:對所有的連接加密(僅 Python)。通過enable_proto_encrypt接口設置加密,詳見 這裏

提示

  • 在 OpenD 或策略程式(moomoo API)中指定 RSA 加密私鑰 路徑時,需指定至 txt 檔案本身。
  • RSA 加密公鑰無需保存,可通過私鑰計算得到。

# Q6:為什麼我獲取的 DataFrame 數據,只能展示一部分 ?

A:打印 pandas.DataFrame 數據的時候,如果行列數過多,pandas 預設會將數據摺疊,導致看起來顯示不全。
因此,並不是接口返回數據真的不全。您只需要在 Python 程式前面加上如下代碼即可解決。

import pandas as pd
pd.options.display.max_rows=5000
pd.options.display.max_columns=5000
pd.options.display.width=1000
1
2
3
4

# Q7:Mac 機器使用 C++ 語言的 API,遇到 “無法打開 libFTAPIChannel.dylib” 的問題

A:在對應程式庫目錄中執行以下命令即可解決:$ xattr -r -d com.apple.quarantine libAPIChannel.dylib

# Q8:Python 用戶,為什麼在 OpenD 設定檔中設置了日誌級別為 no 後,log 資料夾下仍然持續產生超大容量的日誌檔案?

A:OpenD 設定檔中的日誌級別參數,只用來控制 OpenD 產生的日誌。而 Python API 預設也會產生日誌,如果您不希望希望 Python API 產生日誌,可以在 Python 程式加上如下語句:

logger.file_level = logging.FATAL  # 用於關閉 Python API 日誌
logger.console_level = logging.FATAL  # 用於關閉 Python 運行時的控制台日誌
1
2

# Q9:對於 5.4 及以上的版本,Java API 的程式庫名稱和設定方式的變更

A: * 如果您是 Java API 5.3 及以下版本的用戶,在更新版本時,請注意以下變更:

設定流程的變更

  1. 通過 moomoo 官網 下載 moomoo API。
  2. 解壓下載好的 mmAPI 檔案,/MMAPI4J 是 Java API 的目錄,將目錄結構中的 /lib/moomoo-api-.x.y.z.jar 添加到您的專案設置中。創建 moomoo-api 專案請參考 這裏

目錄結構的變更

  1. moomoo API 的 Java 版本,程式庫名稱由之前的 mmapi4j.jar 變更為 moomoo-api-x.y.z.jar,其中 “x.y.z” 表示版本編號。
  2. 第三方程式庫的引用中,去掉了 /lib/jna.jar 和 /lib/jna-platform.jar 相依性項,增加了 /lib/bcprov-jdk15on-1.68.jar/lib/bcpkix-jdk15on-1.68.jar 相依性項。
```
+---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 專案預設生成的目錄
```
  • 如果您第一次接觸 moomoo API,我們提供了更便捷的通過 maven 倉庫設定 Java API 的方式。設定流程請參考 這裏

# Q10:Python 用戶,使用 pyinstaller 打包程式時報錯:找不到 Common_pb2 模組

A:你可以嘗試通過以下步驟解決此問題:

  1. 假設你需要對 main.py 進行打包。使用命令行語句,運行代碼:pyinstaller main.py,不要加參數 “- F”(path 為 main.py 的所在路徑)
pyinstaller path\main.py
1

打包成功後,main.py 所在目錄下的 /dist 中,會生成 /main 資料夾,main.exe 就在這個資料夾中。
dist
2. 運行以下代碼,找到 moomoo-api 的安裝目錄。

import moomoo
print(moomoo.__file__)
1
2

運行結果:

C:\Users\ceciliali\Anaconda3\lib\site-packages\moomoo\__init__.py
1

path_futu

  1. 打開上圖資料夾中的 /common/pb,將所有檔案全部複製到 /main 中。

  2. 在 /main 中創建資料夾,命名為 moomoo,將上圖資料夾中的 VERSION.txt 檔案複製到 /main/moomoo 中。
    main_futu

  3. 再次嘗試運行 main.exe

# Q11:接口調用結果正常,但其返回表現不符合預期?

A:

  • 接口調用結果正常,表示富途已經成功收到並響應了您的請求,但接口返回表現可能與您的預期不符。

    例如:若您在非交易時段調用 訂閲 接口,雖然您的請求可以被成功響應,並且接口調用結果正常,但在非交易時段下,交易所無行情數據變動,所以您將暫時無法收到行情數據推送,直至市場重新回到交易時段。

  • 接口調用結果可以通過返回欄位(定義參見:接口調用結果)查看,返回欄位為 0 代表接口調用正常,非 0 代表接口調用失敗。

    對於 Python 用戶,下面兩種寫法等價:

    if ret_code == RET_OK:
    
    1
    if ret_code == 0:
    
    1

# Q12:WebSocket相關

A:

# 概述

OpenAPI 中,WebSocket 主要用於以下兩方面:

  • 可視化 OpenD 中,UI 界面跟底層的命令行 OpenD 的通信使用 WebSocket 方式。
  • JavaScript API 跟 OpenD 之間的通信使用 WebSocket 方式。

WebSocket-struct

  • 當 WebSocket 啟動時,命令行 OpenD 會與 MMWebSocket 中轉服務 建立 Socket 連接(TCP),這一連接會用到預設的 監聽地址API 協議監聽連接埠
  • 同時,JavaScript API 會與 MMWebSocket 中轉服務 建立 WebSocket 連接(HTTP),這一連接會用到 WebSocket 監聽地址WebSocket 連接埠

# 使用

為保證帳戶安全,當 WebSocket 監聽來自非本地請求時,我們強烈建議您啟用 SSL 並設定 WebSocket 鑑權密鑰

SSL 通過在設定 WebSocket 證書 以及 WebSocket 私鑰 來啟用。
命令行 OpenD 可通過設定 OpenD.xml 或設定命令行參數來設置檔案路徑。可視化 OpenD 點擊【更多選項】下拉菜單,可以看到設置項。

ui-more-config

提示

如果證書是自籤的,則需要在調用 JavaScript 接口所在機器上安裝該證書,或者設置不驗證證書。

# 生成自簽證書

自簽證書生成詳細資料不便在此文檔展開,請自行查閲。
在此提供較簡單可用的生成步驟:

  1. 安裝 openssl。
  2. 修改 openssl.cnf,在 alt_names 節點下加上 OpenD 所在機器 IP 地址或域名。
    例如:IP.2 = xxx.xxx.xxx.xxx, DNS.2 = www.xxx.com
  3. 生成私鑰以及證書(PEM)。

證書生成參數參考如下
openssl req -x509 -newkey rsa:2048 -out moomoo.cer -outform PEM -keyout moomoo.key -days 10000 -verbose -config openssl.cnf -nodes -sha256 -subj "/CN=moomoo CA" -reqexts v3_req -extensions v3_req

提示

  • openssl.cnf 需要放到系統路徑下,或在生成參數中指定絕對路徑。
  • 注意生成私鑰需要指定不設置密碼(-nodes)。

附上本地自簽證書以及生成證書的設定檔供測試:

# Q13:OpenAPI 的行情和交易服務分別部署在哪裏?

A:

  • 行情:
平台賬號 行情伺服器所在地
牛牛號 騰訊雲廣州和香港
moomoo 號 騰訊雲美國弗吉尼亞和新加坡
  • 交易:
所屬券商 交易伺服器所在地
富途證券(香港) 香港
moomoo證券(美國) 騰訊雲美國弗吉尼亞
moomoo證券(新加坡) 騰訊雲新加坡
moomoo證券(澳大利亞) 騰訊雲新加坡
moomoo證券(馬來西亞) 阿里雲馬來西亞
moomoo證券(加拿大) AWS加拿大
moomoo證券(日本) 騰訊雲日本