MetaTrader 5 + Python: socket と MetaTrader5
MetaTrader 5 を Python に接続する一般的な方法は、主に 2 つあります。
- MQL5 の Expert Advisor またはスクリプトと Python プロセスの間にソケットブリッジを使う。
- 公式の
MetaTrader5Python パッケージを使い、稼働中の 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 では、ローカルソケットブリッジのほうが制御しやすくなりますが、その分、タイムアウト、リトライ、メッセージ検証に関する防御的な設計がより多く必要になります。
