MT5 EAで売買ロジックと注文処理を分離する執行レイヤー設計を解説。CTrade、OrderSend、Magic Number、ポジション管理、約定結果の確認方法を整理し、複数戦略で再利用しやすいEAアーキテクチャと実装上の注意点を示します。
EAで売買ロジックと執行処理を分ける理由
MT5のEAでは、シグナル判定から注文送信までをOnTick内へ直接書くこともできる。しかし戦略が複雑になるほど、エントリー条件、ロット計算、注文送信、ポジション確認、エラー処理が混在し、コードの変更が他の部分へ影響しやすくなる。
そこで有効なのが、売買判断を行うStrategy層と、実際の注文を処理するExecution層を分離する設計である。シグナル側は「BUY」「SELL」「CLOSE」といった意思決定だけを返し、注文価格や数量、Magic Number、許容スリッページなどは執行レイヤー側で管理する。
Execution層が担当する処理
執行レイヤーには、少なくとも注文送信、ポジション管理、数量計算、注文結果確認を集約したい。
MQL5ではMqlTradeRequestとMqlTradeResultを使ってOrderSendを実行できる。OrderSendは取引要求をサーバーへ送信する基本的な関数であり、注文タイプ、数量、価格、SL、TP、Magic Numberなどを要求構造体へ設定する。
より簡潔な実装では標準ライブラリのCTradeを利用できる。CTradeにはBuy、Sell、PositionCloseのほか、Magic Number、許容偏差、Filling方式などを設定する機能が用意されている。
Strategy層は方向判断に集中させる
例えば移動平均クロス戦略であれば、Strategy層は現在の状態からBUY_SIGNAL、SELL_SIGNAL、NO_SIGNALを返すだけにする。
その後Execution層が、既存ポジションの有無、最大ポジション数、ロット、証拠金、SL・TP、注文可能状態を確認して実際の注文へ変換する。
この構造にすれば、移動平均戦略をRSIやMarket Structure戦略へ変更しても、注文処理部分を再利用できる。逆に執行方法を変更してもシグナルロジックには影響しにくい。
注文成功と約定成功を区別する
EAで重要なのは、関数がtrueを返したことを約定完了とみなさないことである。CTradeのBuyなどが正常終了しても、実際の取引結果はResultRetcodeなどで確認する必要がある。公式リファレンスでも、メソッドの成功だけでは取引操作の成功を保証しないとされている。
そのためExecution層では、request_id、retcode、deal、order、約定価格などをログへ保存する設計が有効である。
OnTradeTransactionで状態を更新する
注文送信後の状態管理にはOnTradeTransactionを利用できる。このイベントは注文送信、約定、注文履歴への移動、ポジション生成など、取引口座でトランザクションが発生した際に呼び出される。
特に非同期注文や複数注文を扱うEAでは、注文送信直後にポジション状態を決め打ちするより、TradeTransactionを受けて内部状態を更新する方が実際の約定フローに沿った設計になる。
複数戦略ではMagic Numberを管理する
複数EAや複数戦略を同一口座で動かす場合は、strategy_idとMagic Numberを対応させる。Execution層がMagic Numberを統一的に付与すれば、どの戦略が生成した注文・ポジションかを判別しやすくなる。
Strategy層、Risk層、Execution層を分けておけば、戦略ごとの最大リスクやポジション上限も独立して管理できる。
まとめ
MT5 EAを長期的に運用するなら、シグナル生成と注文処理を同じコードへ埋め込むより、Execution層として分離した方が保守性と再利用性を高めやすい。
Strategyは売買判断、Riskは数量とリスク制限、Executionは注文送信と約定管理を担当する。この責務分離を基盤にすれば、複数戦略、複数銘柄、異なる執行ロジックへEAを拡張しやすくなる。







