# その他

# Q1:C++ API のコンパイル方法は?

A: moomoo API C++ SDK は Windows/MacOS/Linux をサポートしています。各 OS に以下のコンパイル環境で生成されたライブラリファイルが提供されます。

OS コンパイルツール
Windows Visual Studio 2013
Centos 7 g++ 4.8.5
Ubuntu 16.04 g++ 5.4.0
MacOS XCode 11

コンパイラバージョンが異なる場合、または依存する protobuf のバージョンが異なる場合は、ソースコードから FTAPI と protobuf を再コンパイルする必要があるかもしれません。ソースコードの場所は下図のディレクトリをご覧ください。

FTAPIディレクトリ構造:
+---Bin                               各OS向けデフォルトコンパイル環境でビルドされた依存ライブラリ
+---Include                           共有ヘッダファイルおよびprotoプロトコルから生成された.h/.ccファイル
+---Sample                            サンプルプロジェクト
\---Src
    +---FTAPI                         FTAPIソースコード
    +---protobuf-all-3.5.1.tar.gz     protobufソースコード
1
2
3
4
5
6
7

# コンパイル手順:

  1. protobuf の再コンパイル:libprotobuf 静的ライブラリの生成
  2. プロトコル proto ファイルから C++ ファイルを生成
  3. FTAPI の再コンパイル:ソースは Src/FTAPI にあり、libFTAPI 静的ライブラリを生成

# ステップ1:protobuf の再コンパイル:

  • Windows:
    • CMake をインストール
    • VS コマンドラインツールを開き、protobuf/cmake ディレクトリに cd
    • 実行: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="FTAPI パス/Include/Proto" --cpp_out="." FTAPI パス/Include/Proto/Common.proto
  • 生成された .h と .cc ファイルを Include/Proto に配置

# ステップ3: FTAPI の再コンパイル

  • Windows:Visual Studio で C++ 静的ライブラリプロジェクトを新規作成し、Src/FTAPI と Include 配下のソースコードを追加して、プラットフォームツールセットを v120_xp に設定してコンパイル
  • Mac:Xcode で C++ 静的ライブラリプロジェクトを新規作成し、Src/FTAPI と Include 配下のソースコードを追加してコンパイル
  • Linux:CMake を使用して FTAPI 静的ライブラリをコンパイル。FTAPI パス/Src ディレクトリで実行:
    • cmake -DTARGET_OS=Linux

# Q2:より完全な戦略サンプルはありますか?

A:

  • Python 戦略サンプルは /futu/examples/ フォルダにあります。以下のコマンドで Python API のインストールパスを確認できます。
    import futu
    print(futu.__file__)
    
    1
    2
  • C# 戦略サンプルは /FTAPI4NET/Sample/ フォルダにあります
  • Java 戦略サンプルは /FTAPI4J/sample/ フォルダにあります
  • C++ 戦略サンプルは /FTAPI4CPP/Sample/ フォルダにあります
  • JavaScript 戦略サンプルは /FTAPI4JS/sample/ フォルダにあります

# Q3:Python API の import でエラーが発生する

A:

ケース1:Python 環境に futu モジュールをインストール済みなのに、No module named 'futu' と表示される?
現在の IDE で使用している interpreter が futu モジュールをインストールした interpreter と異なる可能性が高いです。つまり、PCに2つ以上の Python 環境がインストールされている可能性があります。 以下の2ステップを実行してください。

  1. Python で以下のコードを実行し、現在の interpreter のパスを確認します。
import sys
print(sys.executable)
1
2

サンプル図:
No module named 'futu'

  1. コマンドラインで $ D:\software\anaconda3\python.exe -m pip install futu-api を実行します(前半のファイルパスはステップ1で表示されたパスです)。 これにより、現在の interpreter にも futu モジュールがインストールされます。

# Q4:import は成功したが、APIを呼び出せない?

A:この場合、通常は正しい moomoo API モジュールがインポートされているか確認が必要です。以下のケースでも import が成功することがあります。

ケース1:「futu」と同名のファイルが存在する

  1. 現在のファイル名が futu.py
  2. 現在のファイルと同じディレクトリに futu.py という名前の別のファイルが存在する
  3. 現在のファイルと同じディレクトリに /futu というフォルダが存在する

そのため、ファイル/フォルダ/プロジェクトに「futu」と命名しないことを強く推奨します。

ケース2:「futu」という名前の第三者ライブラリを誤ってインストールした

moomoo API の正式名称は futu-api であり、「futu」ではありません。

「futu」という名前の第三者ライブラリをインストール済みの場合はアンインストールし、futu-api をダウンロードしてください。

PyCharm での例:第三者ライブラリのインストール状況を確認します。

settings
futuku

# Q5:プロトコル暗号化について

A:

# 概要

非対称暗号化アルゴリズム RSA を使用して、戦略プログラム(moomoo API)と OpenD 間のリクエストとレスポンスの内容を暗号化し、通信の安全性を確保できます。
戦略プログラム(moomoo API)と FutuOpenD が同一PC上にある場合、通常は暗号化不要です。

# プロトコル暗号化の手順

以下のステップでこの問題を解決できます。

  1. 第三者の Web プラットフォームで自動的に鍵ファイルを生成します。

    • 具体的な方法:baidu または google で「RSA オンライン生成」を検索し、鍵形式を PKCS#1、鍵長を 1024 bit に設定し、秘密鍵パスワードは未設定のまま、鍵ペアを生成をクリックします。
      ui-config
  2. 生成された RSA 暗号化秘密鍵 をテキストファイルにコピー&ペーストし、OpenD のあるPCの指定パスに保存します。

  3. OpenD のあるPCで、RSA 暗号化秘密鍵 のパスを指定します。

    • 方法1:GUI版 OpenD 起動画面右側の「暗号化秘密鍵」欄で、前のステップで RSA 暗号化秘密鍵 を保存したパスを指定します。下図参照:
      ui-config
    • 方法2:コマンドライン OpenD 起動ファイル OpenD.xml で、パラメータ rsa_private_key にステップ2の RSA 暗号化秘密鍵 のパスを設定します。下図参照:
      ui-config
  4. ステップ2の txt ファイルを戦略プログラム(moomoo API)のあるPCの指定パスに別名保存し、戦略プログラムでこのパスを秘密鍵パスとして設定します。

  5. 戦略プログラム(moomoo API)でプロトコル暗号化を有効にします。有効化には2つの方法があり、方法2の優先度が高くなります。

    • 方法1:単一接続の暗号化(共通)。相場オブジェクトまたは取引オブジェクトの接続作成時に、暗号化を有効にするパラメータで設定します。
    • 方法2:全接続の暗号化(Python のみ)。enable_proto_encrypt インターフェースで設定します。詳細はこちら

ご注意

  • OpenD または戦略プログラム(moomoo API)で RSA 暗号化秘密鍵 パスを指定する際は、txt ファイル自体のパスを指定する必要があります。
  • RSA 暗号化公開鍵は保存不要です。秘密鍵から計算できます。

# Q6:取得した DataFrame データの一部しか表示されないのはなぜ?

A:pandas.DataFrame データを表示する際、行列数が多い場合、pandas はデフォルトでデータを折りたたむため、表示が不完全に見えます。
APIの戻り値データが実際に不完全なわけではありません。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 libFTAPIChannel.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. ダウンロードした FTAPI ファイルを解凍します。/FTAPI4J が Java API のディレクトリです。ディレクトリ構造内の /lib/futu-api-.x.y.z.jar をプロジェクト設定に追加してください。futu-api プロジェクトの作成はこちらを参照してください。

ディレクトリ構造の変更

  1. moomoo API の Java 版のライブラリ名が、従来の ftapi4j.jar から futu-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 の依存が追加されました。
```
+---ftapi4j                      futu-apiのソースコード。使用中のJDKバージョンと互換性がない場合はこのプロジェクトから再コンパイル可能
+---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プロジェクトのデフォルト生成ディレクトリ
```
  • 初めて 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. 以下のコードを実行して、futu-api のインストールディレクトリを確認します。

import futu
print(futu.__file__)
1
2

実行結果:

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

path_futu

  1. 上図フォルダ内の /common/pb のすべてのファイルを /main にコピーします。

  2. /main 内に futu という名前のフォルダを作成し、上図フォルダ内の VERSION.txt ファイルを /main/futu にコピーします。
    main_futu

  3. main.exe を再度実行してみてください

# Q11:API呼び出し結果は正常だが、戻り値が期待と異なる?

A:

  • API呼び出し結果が正常であれば、moomoo がリクエストを正常に受信・応答したことを意味しますが、戻り値の表現が期待と異なる場合があります。

    例:非取引時間帯に登録APIを呼び出した場合、リクエストは正常に応答されAPI呼び出し結果も正常ですが、非取引時間帯では取引所からの相場データ更新がないため、市場が取引時間帯に戻るまで相場データのプッシュを受信できません。

  • API呼び出し結果は戻り値フィールド(定義はAPI呼び出し結果を参照)で確認でき、0はAPI呼び出し正常、0以外はAPI呼び出し失敗を意味します。

    Python ユーザーの場合、以下の2つの記法は同等です。

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

# Q12:WebSocket 関連

A:

# 概要

OpenAPI では、WebSocket は主に以下の2つの用途で使用されます。

  • GUI版 OpenD では、UI 画面と内部のコマンドライン OpenD の通信に WebSocket が使用されます。
  • JavaScript API と OpenD 間の通信に WebSocket が使用されます。

WebSocket-struct

  • WebSocket 起動時、コマンドライン OpenD は FTWebSocket 中継サービス と Socket 接続(TCP)を確立します。この接続にはデフォルトの 監視アドレスAPI プロトコル監視ポート が使用されます。
  • 同時に、JavaScript API は FTWebSocket 中継サービス と WebSocket 接続(HTTP)を確立します。この接続には WebSocket 監視アドレスWebSocket ポート が使用されます。

# 使用方法

アカウントの安全性のため、WebSocket が非ローカルからのリクエストを監視する場合は、SSL を有効にし WebSocket 認証鍵 を設定することを強く推奨します。

SSL は WebSocket 証明書WebSocket 秘密鍵 を設定することで有効になります。
コマンドライン OpenD では OpenD.xml の設定またはコマンドラインパラメータでファイルパスを設定できます。GUI版 OpenD では【その他のオプション】ドロップダウンメニューで設定項目を確認できます。

ui-more-config

ご注意

証明書が自己署名の場合、JavaScript API を呼び出すマシンに証明書をインストールするか、証明書検証を無効にする必要があります。

# 自己署名証明書の生成

自己署名証明書の生成の詳細はこのドキュメントでは割愛します。各自でご確認ください。
比較的簡単に使用できる生成手順を以下に示します。

  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 futu.cer -outform PEM -keyout futu.key -days 10000 -verbose -config openssl.cnf -nodes -sha256 -subj "/CN=Futu CA" -reqexts v3_req -extensions v3_req

ご注意

  • openssl.cnf はシステムパスに配置するか、生成パラメータで絶対パスを指定する必要があります。
  • 秘密鍵生成時にパスワード未設定(-nodes)を指定する必要があります。

テスト用にローカル自己署名証明書と証明書生成用設定ファイルを添付します:

# Q13:OpenAPI の相場・取引サービスはどこにデプロイされていますか?

A:

  • 相場データ:
プラットフォームアカウント 相場サーバーの所在地
moomoo ID Tencent Cloud 広州・香港
moomoo ID Tencent Cloud 米国バージニア・シンガポール
  • 取引:
所属証券会社 取引サーバーの所在地
moomoo証券(香港) 香港
moomoo証券(米国) Tencent Cloud 米国バージニア
moomoo証券(シンガポール) Tencent Cloud シンガポール
moomoo証券(オーストラリア) Tencent Cloud シンガポール
moomoo証券(マレーシア) Alibaba Cloud マレーシア
moomoo証券(カナダ) AWS カナダ
moomoo証券(日本) Tencent Cloud 日本

# Q14:総合口座アップグレードの移行ガイド

# 1. 総合口座アップグレード

総合口座は多通貨で同一口座内から異なる市場の商品を取引できます。単一通貨口座から総合口座へのアップグレードは、既存の moomoo ID 配下での口座移行です。主に以下を含みます。

  • 新しい総合口座の作成
  • 既存の単一通貨取引口座の資産を総合口座へ移行
  • 既存の単一通貨口座の停止

# 2. OpenD バージョンアップグレード

2024年9月14日・15日に OpenAPI のお客様のアカウントを一括アップグレード予定です。事前に OpenD と API のバージョンをご確認ください。

  • 7.01 以下のバージョン
    OpenD はバージョンが古いため、2024/09/14 にサービスが停止されます。その際、ログイン済みのアカウントは強制ログアウトされます。9/14 までに OpenDAPI を最新バージョンにアップグレードし、9/14~9/15 の間は週末をまたいで戦略を実行しないことを推奨します。
  • 7.02 ~ 8.2 バージョン
    OpenD のバージョンが古く、総合口座を取得できません。9/14 までに OpenDAPI を最新バージョンにアップグレードし、9/14~9/15 の間は週末をまたいで戦略を実行しないことを推奨します。
  • 8.3 以上のバージョン
    通常通り使用できます。9/14~9/15 の間は週末をまたいで戦略を実行しないことを推奨します。

総合口座アップグレード時、資産は新しい総合口座に移行されます。戦略が旧口座を指定している場合、異常が発生する可能性があります。また、本番取引前に必要な確認とテストを行い、すべての設定が正常であることを確認することを推奨します。

# 3. 口座アップグレード後の OpenAPI の変更点は?

  • Python API では OpenHKTradeContext、OpenUSTradeContext、OpenHKCCTradeContext、OpenCNTradeContext による取引オブジェクトの作成がサポートされなくなります。取引オブジェクト接続の作成を参考に OpenSecTradeContext をご使用ください。
  • 非 Python API ユーザーは、Trd_GetAccList API使用時に needGeneralSecAccount パラメータを true に設定しないと、総合口座の情報を取得できません。
  • 口座に口座状態が追加されました:取引口座一覧の取得の戻り値に口座状態が追加されました。総合口座は ACTIVE(有効口座)、停止された単一通貨口座は DISABLED(無効口座)としてマークされます。
  • 発注注文変更・注文取消最大購入可能数量の照会等の取引APIの挙動
    • ACTIVE 有効口座に対応する acc_id または acc_index を使用して購買力照会と取引が可能です。
    • DISABLED 無効口座に対応する acc_id または acc_index を使用した購買力照会と取引はサポートされません。使用した場合、エラーメッセージが表示されます。
    • Python API ユーザー:APIの入力パラメータで acc_id にアップグレード後の総合口座を指定してください。
    • 非 Python API ユーザー:TrdHeader で accID にアップグレード後の総合口座を指定してください。