AI×FX

PythonとMetaTrader5(MT5)を連携させる自動売買の仕組みと実装の落とし穴

2026-08-14  / Ya

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()

注文結果の retcode10009(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取引には元本割れを含む損失リスクが伴います。取引を行う前にリスクディスクロージャーを必ずご確認ください。