はじめての方も読めるよう、専門用語はカンタンな言葉に言い換えながら解説します。「なんとなく聞いたことある」レベルの知識で大丈夫です。
- EA = Expert Advisor。MT4/MT5上で動く自動売買プログラム
- MT5 = MetaTrader 5。世界標準のFXトレードソフト
- VPS = Virtual Private Server。レンタルできる仮想サーバー(24時間稼働用)
Python × MT5 実装
Pythonで MT5 の発注APIを実装する — Windows VPS で動かすまでの手順
最終更新: 2026-05-05
MT5のPythonライブラリ MetaTrader5 を使うと、Pythonから直接ポジション操作ができます。Windows VPS上で安定稼働させるまでのつまずきポイントを実コードと共に共有します。
動作環境
- OS: Windows Server 2022 (ConoHa for Windows VPS の 2GB プラン)
- Python: 3.12.x (公式インストーラから .msi)
- MT5: ブローカー指定の最新ビルド
- ライブラリ:
MetaTrader5==5.0.45
セットアップ手順
# PowerShell で実行
py -3.12 -m venv venv
.\venv\Scripts\activate
pip install MetaTrader5 pandas numpy
# MT5 GUI で「ツール → オプション → エキスパートアドバイザー」
# 「アルゴリズム取引を許可する」「DLLの使用を許可する」 ✓
最小の発注コード
import MetaTrader5 as mt5
if not mt5.initialize():
raise SystemExit(f"init失敗: {mt5.last_error()}")
symbol = "EURUSD"
info = mt5.symbol_info(symbol)
price = mt5.symbol_info_tick(symbol).ask
req = {
"action": mt5.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": 0.01,
"type": mt5.ORDER_TYPE_BUY,
"price": price,
"sl": price - 0.0030, # 30 pips SL
"tp": price + 0.0050, # 50 pips TP
"deviation": 10,
"magic": 20260505,
"comment": "py-test",
"type_time": mt5.ORDER_TIME_GTC,
"type_filling": mt5.ORDER_FILLING_IOC,
}
result = mt5.order_send(req)
print(result)
mt5.shutdown()
つまずきポイント 5つ
1. type_filling の選択
ブローカーごとに対応する filling mode が違います。FOK のみ対応の業者で IOC を送ると retcode=10030 で弾かれます。
info.filling_mode をビット演算で確認し、対応する値を選んでください。
2. ポジションのモード (Hedging vs Netting)
口座が Hedging なら 1 銘柄に複数ポジション可、Netting なら自動で相殺。Pythonからは mt5.account_info().margin_mode で判定できます。
3. SL/TPの最小距離
ブローカーは「現在価格から最低N pips離さないとSL/TPを置けない」というルールを持ちます (SYMBOL_TRADE_STOPS_LEVEL)。
スキャル系で短SLを使う場合は、ここで弾かれて発注失敗になりがち。事前に info.trade_stops_level をチェックします。
4. VPSの再起動でMT5が落ちる
Windows Update の自動再起動でMT5が止まると、Pythonスクリプトも気付かず空回ります。
タスクスケジューラの「ログオン時」トリガーで MT5 と Python の両方を自動起動。さらに Python 側でも 60秒に 1回 mt5.terminal_info() で接続生存確認を実装。
5. 多重発注の防止
初心者が引っかかりやすいのが、ループ毎にエントリーしてしまうバグ。Magic Number 単位で既存ポジションをチェックし、既にあればスキップする実装が必須です。
def has_open(symbol, magic):
pos = mt5.positions_get(symbol=symbol) or []
return any(p.magic == magic for p in pos)
本番投入前のチェックリスト
- ☐ デモ口座で1週間連続稼働 (週末を含む) で異常なし
- ☐ Windows Update 設定でアクティブ時間が EA 動作時間と被らない
- ☐ Magic Number で識別、複数 EA を共存できる
- ☐ ロガー (file + stdout) を実装、24時間分のログを保持
- ☐ 実弾は最初は 0.01 lot で 1〜2 週間
まとめ
Python + MT5 は MQL5 を書かずに高速プロトタイピングできるのが最大の強みです。バックテストは MT5 標準のストラテジーテスターほど厳密でない部分もあるため、検証は MQL5 で、本番運用は Python で、と使い分けると効率が良いと感じています。
コメントを残す