PythonとMetaTrader5(MT5)を連携させた自動売買は、2020年にMetaQuotes社が公式Pythonライブラリを公開したことで実用段階に入りました。バックテスト・シグナル生成・注文発注をPythonで一元管理できる点が魅力ですが、環境構築の前提条件や注文モデルの仕様を誤解すると、実行されない注文や意図しないポジションが発生します。本記事では、ライブラリの仕組みから具体的なコード例、初心者が踏みやすい落とし穴まで順に解説します。
PythonとMT5連携の定義と仕組み
MetaTrader5 Pythonライブラリ(パッケージ名: MetaTrader5)は、MT5ターミナルとローカルプロセス間通信(IPC)で接続します。Pythonスクリプトがリクエストを送り、MT5ターミナルが実際のブローカーサーバーと通信するという二段構造です。インストールは pip install MetaTrader5 で完了します。
重要な前提として、公式サポートはWindows環境のみです。LinuxやmacOSでは、Wine経由でMT5ターミナルを動作させつつ、ソケットブリッジなどの追加ラッパーが必要になります。当研究所のシステムもこの構成で稼働しており、環境依存の問題が最も多く発生する層でもあります。
主な機能は次の3層に分類されます。
- データ取得: ティックデータ・OHLCVバー・銘柄情報・口座情報
- 注文操作: 成行注文・指値注文・変更・取消し・ポジション照会
- 市場情報: シンボル一覧・スプレッド・スワップ・取引セッション情報
具体例: 接続・データ取得・注文発注の実装
以下は公式ライブラリを使用した基本フローです(デモ口座での検証を前提としています)。
import MetaTrader5 as mt5
# 初期化と接続
if not mt5.initialize():
print("接続失敗:", mt5.last_error())
quit()
# OHLCVデータ取得 (USDJPY 1時間足 200本)
rates = mt5.copy_rates_from_pos("USDJPY", mt5.TIMEFRAME_H1, 0, 200)
# rates は numpy.ndarray 形式で返る
# 成行買い注文
request = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": "USDJPY",
"volume": 0.01,
"type": mt5.ORDER_TYPE_BUY,
"price": mt5.symbol_info_tick("USDJPY").ask,
"deviation": 20,
"magic": 20240001,
"comment": "python_buy",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC,
}
result = mt5.order_send(request)
print(result.retcode, result.deal)
mt5.shutdown()
注文結果の retcode が 10009(TRADE_RETCODE_DONE)であれば約定成功です。それ以外の返却コードはMT5公式ドキュメントに一覧があるため、エラーハンドリングで必ず参照してください。
| 用途 | 関数 | 返り値の型 |
|---|---|---|
| 接続初期化 | mt5.initialize() | bool |
| OHLCVバー取得 | mt5.copy_rates_from_pos() | numpy.ndarray |
| ティック取得 | mt5.copy_ticks_from() | numpy.ndarray |
| 注文送信 | mt5.order_send(request) | OrderSendResult |
| ポジション照会 | mt5.positions_get() | tuple |
| 口座情報取得 | mt5.account_info() | AccountInfo |
バックテスト時はMT5から取得した過去データをpandasのDataFrameに変換して分析するのが一般的です。プロフィットファクターなどEA評価指標の読み方も合わせて確認しておくと、戦略評価の精度が高まります。
初心者が陥りやすい落とし穴
-
① MT5ターミナルが起動していない状態でスクリプトを実行する
mt5.initialize()はターミナルプロセスへのIPC接続です。ターミナルが起動していなければ接続できません。定期実行する場合は、タスクスケジューラやsystemdでターミナルの自動起動を保証する必要があります。起動確認を省略したまま本番運用に移行すると、サーバー再起動後に注文が一切通らない状態が無音で続きます。 -
② シンボル名がブローカーごとに異なる
「USDJPY」ではなく「USDJPYm」「USDJPY.」「USDJPY_」のようにサフィックスが付くブローカーが多数あります。mt5.symbols_get()で実際のシンボル一覧を取得し、シンボル名のハードコーディングを避けるのが基本です。ブローカーを乗り換えた際にコードを一切変更せず動かなくなるケースが多発します。 -
③ サーバー時刻とローカル時刻のズレを考慮しない
MT5のバー時刻はブローカーのサーバー時刻(多くはGMT+2またはGMT+3)で返ります。PythonのdatetimeをUTCで統一し、サーバーオフセットを明示的に計算しないと、夏時間の切替時やニューヨーク週末またぎでデータ取得範囲が1〜2本ずれます。この誤差がシグナル生成に影響します。 -
④ type_fillingをブローカー非対応の値に設定する
ORDER_FILLING_FOK・ORDER_FILLING_IOC・ORDER_FILLING_RETURNの3種があり、ブローカーによって対応するフィリングモードが異なります。非対応の値を指定するとretcode 10030(TRADE_RETCODE_INVALID_FILL)が返り、注文が通りません。mt5.symbol_info("USDJPY").filling_modeのビットフラグで事前確認するのが安全です。 -
⑤ バックテスト結果を過信してライブに移行する
Pythonバックテストは、スプレッド変動・スリッページ・約定遅延を完全には再現できません。EAのフォワード検証で確認すべき指標を参照し、バックテストのPFが2.0を超えていてもフォワード期間での検証を必ず経てください。ナンピン系ストラテジーを組み込む場合はナンピンEAがドローダウンを深くする理由も事前に確認することを勧めます。
FX AI研究所の見解
Python×MT5連携は、シグナル生成からポジション管理まで柔軟に設計できる反面、環境依存の障害点が多く、本番稼働には想定以上の工数がかかります。当研究所では、Wine上のMT5とPythonブリッジを組み合わせたAI自動売買システムを現在デモ口座で検証中です。実績データはライブラリページで随時公開していますが、現時点はあくまで検証フェーズであり、確定した運用成績として提示するものではありません。連携の仕組みやデモ口座での試し方に関心のある方は、HFMのデモ口座から始めるか、お問い合わせからご連絡ください。
関連リンク
本記事は情報提供を目的としており、特定の金融商品への投資を勧誘するものではありません。FX取引には元本割れを含む損失リスクが伴います。取引を行う前にリスクディスクロージャーを必ずご確認ください。