【コピペでOK】cTraderをFIX APIで操作する簡単なPythonコードの紹介と実行手順について補足&注意点を交えて解説
以前公開したTradingViewのアラート(Webhook)機能を用いて自動売買を行う際のAPI選択候補という記事で、cTrader と FIX APIの組み合わせであれば、口座残高などの条件ナシでAPI注文が可能という点についても紹介した
国内では現在 cTrader を採用しているブローカーはなく、海外でも限られたブローカーでしか採用していないこともあり、興味がある方はほとんどいないだろうと予想していたが、以外にも
Tradingview の webhook機能とFIX APIの組み合わせで cTrader での自動売買に興味があるので続編を希望!
とのコメント(DM)をこれまでに数件いただいたので、今回は続編その① としてタイトルのとおり FIX APIを使ってcTraderを操作する簡単なPythonプログラムコードと実行手順について紹介
事前準備(必要なもの)
まず、今回のPythonプログラムを実行するにあたって以下の3つを準備してほしい
事前に必要なもの
- Python 3.7 ~ 3.9 がインストール済のPC(iPad等でも一応可能だが、Mac or Windows PCの使用を推奨)
- コードエディター VSCode + 拡張機能のインストール
- cTrader デモ口座
1.
のPCにPythonをインストールする手順については、以下の解説動画が参考になるかと思う
インストールするPythonのバージョンは3以降であればおそらく問題ないと思うが、後述するPythonライブラリの都合上 3.7 ~ 3.9が良いかも(私は今回 v3.9.6を使用)
2.
のコードエディターに関しては、なんでもOKだが、個人的にはVSCodeを強く推奨(マイク●ソフトは大っ嫌いなので本当は使いたくないが、無料のコードエディタではVSCodeが最強だと思う)
またVSCodeの拡張機能で
の2つは最低限追加(インストール)しておいてもらいたい
3.
の cTrader デモ口座に関しては好きなブローカーのものでOK(当記事では例としてTradeview のcTrader デモ口座を使用)
cTrader FIX API 認証情報を取得
- Web版 cTrader にアクセスし、デモ口座にログインしたら画面左下の歯車アイコンをクリックし、設定メニューから一番下のアドバンスにあるFIX APIを選択
パスワードの変更
ボタンをクリックし、FIX API 資格情報のパスワードを変更する(英数字8文字以上)
例として、Tradeview cTrader デモ口座を利用する場合の FIX API 認証情報は以下のようになる
<!-- Tradeview デモ口座のFIX API 認証情報 -->
ホスト名: h37.p.ctrader.com
(現在のIPアドレス 104.207.129.86 は通知なしで変更できます)
ポート:
Price 関連: 5211(SSL)、5201(プレーンテキスト)
トレード 関連: ポート: 5212(SSL)、5202(プレーンテキスト)
パスワード: <変更したパスワード>
SenderCompID: demo.tradeviewmarkets.<口座番号>
TargetCompID: cServer
SenderSubID:
Price 関連: QUOTE
トレード 関連: TRADE
ドキュメント - cTrader FIX API Getting Credentials
ejtraderCT を利用してFIX APIで cTrader を操作するPythonプログラム(コード)
ここまで準備できたら、github上で公開されているPython ライブラリ ejtraderCTを利用して、各処理のPythonプログラム(コード)を作成していく
とは言っても、基本的には github上に記載している内容をコピペするだけなので全然難しくない
1. 任意の場所にフォルダを作成し、VSCode(エディタ)で開き ejtraderCT をインストール
- デスクトップなど、どこでもいいので任意の新規フォルダを作成し、VSCode(エディタ)でそのフォルダを開く
- ショートカットキー
Ctrl
+Shift
+'(バッククォート)
'` でターミナルを開き、コマンド
pip install ejtraderCT -U
を入力し、Enter
キーでPython ライブラリ ejtraderCT
をインストール
▶️ GIF画像を読み込み
👆GIF画像では例としてデスクトップ上に用意した try-FIXAPI
というフォルダをVSCodeで開き、main.py
という新規ファイルを作成 -> VSCode上でターミナルを起動しコマンド入力で ライブラリ ejtraderCT
のインストール までを行っている
2. 用意した以下の Pythonコードを main.py に記述(ペースト)
まず、今回用意した Pythonコードは以下のようになり、一部異なる箇所はあるものの基本的には github のejtraderCT に記載されているものと同じ内容となっている
以下のPythonコードをフォルダ内に作成した ~.py
ファイルにコピペ(今回の例ではmain.py
)
各処理コードについての補足・注意点などについては後述
#%%
# モジュール
from ejtraderCT import Ctrader
# 変数
server="104.207.129.86" # - IPアドレス
account="demo.tradeviewmarkets.<口座番号>" # - SenderCompID
password="<変更したパスワード>" # 例: abc123EfG
#%%
# Login Fix account
api = Ctrader(server,account,password)
#%%
# Check connection status
api.isconnected() # True ならログイン済
#%%
# =============
# リアルタイム レート情報(bid, ask)の取得
# =============
# quote リストに "EURUSD", "USDJPY" を追加
api.subscribe("EURUSD", "USDJPY")
#%%
# quote リストのリアルタイム レート情報(bid, ask)
api.quote() # {'EURUSD': {'time': 169515..., 'bid': 1.0679, 'ask': 1.06791}, 'USDJPY': {'time': 169515..., 'bid': 147.867, 'ask': 147.868}}
#%%
# USDJPYのリアルタイム レート情報(bid, ask)
api.quote('USDJPY') # {'time': 169515..., 'bid': 147.86, 'ask': 147.863}
#%%
# =============
# 成行注文
# =============
# ドル円を成り行きで 0.01Lot 買い注文
symbol = "USDJPY"
volume = 0.01 # position size:
stoploss = 135.0
takeprofit = 155.5
api.buy(symbol, volume, stoploss, takeprofit)
#%%
# ユーロドルを成り行きで 0.01Lot 売り注文
symbol = "EURUSD"
volume = 0.01
stoploss = 1.11
takeprofit = 0.99
api.sell(symbol, volume, stoploss, takeprofit)
#%%
# =============
# Limit Order 指値注文
# =============
# ドル円を指値で 0.01Lot 買い注文
symbol = "USDJPY"
volume = 0.01
price = 135.0
api.buyLimit(symbol, volume, price)
#%%
# ユーロドルを指値で 0.01Lot 売り注文
symbol = "EURUSD"
volume = 0.01
price = 1.10
api.sellLimit(symbol, volume, price)
#%%
# =============
# Stop Order 逆指値注文
# =============
# ドル円を逆指値で 0.01Lot 買い注文
api.buyStop("USDJPY", 0.01, 155.5)
#%%
# ユーロドルを逆指値で 0.01Lot 売り注文
api.sellStop("EURUSD", 0.01, 1.01)
#%%
# =============
# 保有ポジション, 予約中注文情報の取得
# =============
# 保有中ポジションをリストで取得
api.positions()
#%%
# 予約中注文ををリストで取得
api.orders()
#%%
# =============
# Cancel order by id - 指定IDの注文をキャンセル
# =============
# キャンセルする注文ID 'ord_id'
cancel_orderID = 17856852
# IDを指定して注文キャンセル
api.orderCancelById(cancel_orderID)
#%%
# =============
# Cancel all orders - すべての注文をキャンセル
# =============
api.cancel_all()
#%%
# =============
# Close position by id - IDを指定してポジションをクローズ(全決済または部分決済)
# =============
# クローズするポジションID 'pos_id'
close_orderID = 7226914
# close_orderID = '7226914'
# 数量 1000 ~
amount = 1000
# ポジションIDからポジション数量を自動で取得
# amount = [p for p in api.positions() if p['pos_id'] == str(close_orderID)][0]['amount']
# IDを指定してポジションクローズ
api.positionCloseById(str(close_orderID), amount) # idは文字列である必要あり
#%%
# =============
# Close all positions - すべてのポジションをクローズ(決済)
# =============
api.close_all()
#%%
# Logout
api.logout()
#%% 記述行の意味
頻繁に #%%
が記載されている行が存在するが、これは VSCode上で Jupyter notebook のようにコードをセル単位で実行できるように記述している(拡張機能 Jupyter
のインストールも必要)
Jupyter notebook??
という方は👇参考動画を見れば、Jupyter notebookの特徴などについて理解できると思う
3. ペーストしたPythonコードをセル単位で実行していく
main.py(ファイル名は任意) に上記コードの貼り付けが完了したら #%%
で区切られたセル単位でコードを実行していくだけ
セル単位でのコード実行方法は、カーソルが実行したいセル内にある状態で Shift
+ Enter
キーを押す、もしくは #%%
の上に表示されているセルの実行
をクリックすると、該当セル内のコードだけ実行され、次のセルへカーソルが移動する
以下、FIXアカウントログイン&ログイン状態の確認までをセル単位でコード実行した例
- 例:
Shift
+Enter
キーでセルを実行
▶️ GIF画像を読み込み
- 例:
セルの実行
をクリックしてセルを実行
▶️ GIF画像を読み込み
基本的にはマウスで毎回クリックするよりも Shift
+ Enter
キーで各セルを実行していくのがオススメ!
今回用意したPythonプログラム(コード)の補足と注意点
以下、今回用意した ejtraderCT を使って cTrader に FIX API 接続する Pythonプログラムにおける補足・注意点などについて
cTrader FIX API 認証情報で必要となるのは3点だけ
モジュール インポート 〜 FIX ログイン & 接続状況のチェックまでの箇所における補足点として、cTrader 設定メニューのアドバンス > FIX APIの画面で取得した認証情報
# ==========
# Fix account login and details
# ホスト名: h37.p.ctrader.com
# 👉(現在のIPアドレス 104.207.129.86 は通知なしで変更できます)
# ポート:
# Price 関連: 5211(SSL)、5201(プレーンテキスト)
# トレード 関連: ポート: 5212(SSL)、5202(プレーンテキスト)
# 👉 パスワード: <変更したパスワード>
# 👉 SenderCompID: demo.tradeviewmarkets.<口座番号>
# TargetCompID: cServer
# SenderSubID:
# Price 関連: QUOTE
# トレード 関連: TRADE
# ==========
のうち、ejtraderCT を利用する場合に必要となるのは 👉 で示した
- ホスト IPアドレス
- SenderCompID
- 設定したFIX API 資格パスワード
の3点だけとなる
リアルタイム レート情報(bid, ask)の取得は、quote リストに登録された銘柄のみ可能
FIX APIで各銘柄の現在レート(bid, ask)を取得することも可能だが、quoteリストに登録されていない銘柄のレートを取得したい場合、まずリストに登録する必要がある
▶️ GIF画像を読み込み
👆では quote リストに登録された銘柄を確認したところ何も登録されていなかった為 EURUSD, USDJPY を登録 -> 再度登録された銘柄を確認 & USDJPY のリアルタイムレート取得を行っている
ちなみに、現在ポジション保有中、予約注文中の銘柄に関しては、自動でquoteリストに登録されるもよう
ストップロス(SL) & テイクプロフィット(TP)設定時は反対売買の予約注文になる点に注意
ejtraderCT では、成行注文 api.buy(symbol, volume, stoploss, takeprofit)
or api.sell(symbol, volume, stoploss, takeprofit)
のみ引数にストップロス(SL), テイクプロフィット(TP) が存在するが、これらを設定した場合、反対売買の予約注文になる点に注意したい
ちなみにこれは FIX API の仕様のようで、手動で新規注文する場合のように特定のポジションに対して損切り、利食いを設定することは出来ないらしい
また、cTrader 口座タイプには ヘッジ
と ネッティング
があるが、ヘッジ(両建て)に設定している場合のみ、成行き注文で stoploss, takeprofit を設定した場合にポジションエントリーと同時に反対売買の予約注文が発注される
▶️ GIF画像を読み込み
👆は口座タイプネッティング
で stoploss, takeprofit 設定アリで 成り行き注文した例(反対売買の予約注文は発注されない)
SL, TP を反対売買の予約注文を同時発注したくない場合は、stoploss, takeprofit に 0
or None
を設定すればOK
# 例: EURUSD を1万通貨 SL, TP ナシで成り行き買い注文
api.buy('EURUSD', 0.1, None, None)
ID指定でポジションをクローズ(決済)する際の注意点
ポジションIDで指定してポジションをクローズ(決済)するメソッド api.positionCloseById(id, amount)
において
- 第1引数
id
(ポジションID)は文字列である必要がある - 第2引数
amount
は Lot ではなく数量(最小1,000〜)
となっている点に注意
例えば、以下のようなコードだとエラーになる
# id が文字列ではない為エラー
api.positionCloseById(7226914, 1000)
# amount が 1000以下なのでエラー
api.positionCloseById('7226914', 0.01)
# amount に値が渡されていないのでエラー
api.positionCloseById('7226914')
ちなみに、以下のようなコードでポジションIDから保有中のポジション数量を自動で取得することも可能
close_orderID = 1234567
amount = [p for p in api.positions() if p['pos_id'] == str(close_orderID)][0]['amount']
今回紹介したコードについてパっと思いつく補足・注意点としてはこんなところ
さいごに
以上のように、Pythonモジュール ejtraderCT
を利用することで、簡単なコードで cTrader と接続してリアルタイムレートの取得、各種注文処理が可能であることを体感していただけたと思う
もちろん実践ベースで使用するには、様々なケースを想定してエラー処理や条件分岐などのコードを追加していく必要性が出てくるが、いきなり多くのコードを紹介しても混乱を招くだけだと考え、今回はできるだけシンプルなコードと実行方法に絞った内容で記載することにした
TradingView のアラート(Webhook)機能と組み合わせて自動売買を行うには、Webhookでの注文内容を受け取るPOSTサーバーの構築が別途必要になるが、まずは『FIX API でどういった処理の実行が可能なのか?についてを理解しておく必要がある』と考えた次第
ということで、今回取り上げた内容が少しでも参考になれば幸いです。
関連記事: 【cTraderブローカー比較】 TradeView, FxPro, Axiory, IC Marketsの取引条件を徹底比較!