MetaTrader 5 + Python: socket と MetaTrader5

MetaTrader 5 + Python: socket と MetaTrader5

MetaTrader 5 を Python に接続する一般的な方法は、主に 2 つあります。

  1. MQL5 の Expert Advisor またはスクリプトと Python プロセスの間にソケットブリッジを使う。
  2. 公式の MetaTrader5 Python パッケージを使い、稼働中の MetaTrader 5 ターミナルと通信する。

どちらの方法も有用ですが、解決する問題は少し異なります。ソケットブリッジは柔軟で、取引ロジックを MetaTrader 内に置いたまま、Python 側で計算、データ処理、機械学習を担当させたい場合に向いています。MetaTrader5 パッケージは、Python から市場データを直接要求したり、口座状態を確認したり、ターミナル経由で注文を送信したりしたい場合に、より簡単です。

選択肢 1: ソケットブリッジ

ソケットブリッジは通常、2 つの部分で構成されます。

  • リクエストを送信し、レスポンスを受信する MQL5 Expert Advisor。
  • ローカルポートで待ち受け、そのリクエストを処理する Python サーバー。

最も安全な構成は、ソケットサーバーを 127.0.0.1 で動かし、同じマシンからだけ到達できるようにすることです。

最小限の Python TCP サーバーは次のようになります。

import socket

HOST = "127.0.0.1"
PORT = 9090

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind((HOST, PORT))
    server.listen(1)
    print(f"Listening on {HOST}:{PORT}")

    while True:
        conn, addr = server.accept()
        with conn:
            data = conn.recv(4096)
            if not data:
                continue

            message = data.decode("utf-8").strip()
            print("received:", message)

            response = "okn"
            conn.sendall(response.encode("utf-8"))

MQL5 側では、プラットフォームのソケット関数を使ってローカルサーバーへ接続し、メッセージを送信して返信を読み取ります。最初はプロトコルをシンプルにしておきましょう。リクエストごとに UTF-8 テキスト 1 行を送り、末尾を n で終端します。接続が動作するようになったら、メッセージフィールドを明示できるように JSON へ移行します。

リクエストペイロードの例:

{"symbol":"EURUSD","timeframe":"M1","action":"signal","bid":1.1284,"ask":1.1286}

取引判断にソケットを使う場合は、失敗ケースを慎重に扱ってください。

  • Python プロセスが起動していない。
  • ポートがすでに使用されている。
  • レスポンス待ちでタイムアウトする。
  • レスポンスの形式が不正。
  • 再接続後にリクエストが重複する。
  • ターミナルまたは口座で取引が無効になっている。

Python からの応答を待つ間、Expert Advisor を無期限にブロックさせてはいけません。タイムアウトを使い、通信に失敗した場合は安全な「取引しない」判断へフォールバックします。

選択肢 2: MetaTrader5 Python パッケージ

公式 Python パッケージは、多くの場合、最も手早く始められる方法です。pip でインストールします。

python -m pip install MetaTrader5

MetaTrader 5 は同じマシンにインストールされ、ログイン済みである必要があります。Python パッケージはターミナルと通信するため、スクリプトを開始する前にターミナルを起動しておくべきです。

最小限の接続確認:

import MetaTrader5 as mt5

if not mt5.initialize():
    print("initialize() failed:", mt5.last_error())
    raise SystemExit(1)

print(mt5.version())
print(mt5.account_info())

mt5.shutdown()

直近のバーを取得するには次のようにします。

from datetime import datetime, timezone

import MetaTrader5 as mt5

symbol = "EURUSD"
timeframe = mt5.TIMEFRAME_M1
count = 100

if not mt5.initialize():
    print("initialize() failed:", mt5.last_error())
    raise SystemExit(1)

rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)
if rates is None:
    print("copy_rates_from_pos() failed:", mt5.last_error())
else:
    for row in rates[:5]:
        ts = datetime.fromtimestamp(row["time"], tz=timezone.utc)
        print(ts, row["open"], row["high"], row["low"], row["close"])

mt5.shutdown()

Python から注文を送信する前に、ターミナル、ブローカー、銘柄、口座権限をローカルで確認してください。正確なフィールドや許可される注文パラメータは、ブローカーや口座タイプによって異なる場合があります。そのため、固定の設定を前提にするのではなく、mt5.symbol_info(symbol)mt5.account_info()mt5.order_send() の戻り値を確認します。

どちらを選ぶか

次のような場合は、ソケットブリッジを使います。

  • Expert Advisor がすでに取引ループを管理している。
  • Python は計算またはシグナル提供サービスにすぎない。
  • MQL5 と Python の間にカスタムプロトコルが必要。
  • MetaTrader 内での注文送信を EA に制御させたい。

次のような場合は、MetaTrader5 パッケージを使います。

  • Python をメインプログラムにしたい。
  • 口座情報、銘柄、ティック、バー、注文へ素早くアクセスする必要がある。
  • MQL5 コードを少なくしたい。
  • すべての処理が MetaTrader 5 ターミナルと同じマシン上で動作する。

調査や自動化では、検証が簡単なため MetaTrader5 から始めるのがよいでしょう。外部分析を呼び出す本番用 Expert Advisor では、ローカルソケットブリッジのほうが制御しやすくなりますが、その分、タイムアウト、リトライ、メッセージ検証に関する防御的な設計がより多く必要になります。

Leave a Reply