MQL5でEAの発注前チェックを作る考え方|spread・lot・margin・trading allowed
MQL5でEAの発注前チェックを作る時は、エントリーシグナルが出た直後に注文を送るのではなく、現在の取引環境、銘柄仕様、ロット、証拠金、スプレッド、取引許可、SL/TP距離、既存ポジション状態を確認してから execution へ渡す設計にします。
発注前チェックを分けておくと、シグナルが成立していないのか、環境条件で見送ったのか、注文前の妥当性確認で止めたのか、OrderSend後にretcodeで失敗したのかをログで切り分けやすくなります。
特にGOLD / XAUUSD、CFD、指数、仮想通貨CFDなどを扱うEAでは、point、digits、volume step、最小ロット、最大ロット、StopLevel、FreezeLevel、必要証拠金、スプレッド上限が通貨ペアと異なる場合があります。発注前チェックなしで注文処理へ進むと、バックテストやデモ環境では気づきにくい注文エラーが発生することがあります。
このページでは、MQL5でEAの発注前チェックを作る時に確認したい spread、lot、margin、trading allowed、銘柄仕様、OrderCheck、OrderCalcMargin、OrderSend結果ログ、GATE / SPECIAL FILTERS / EXECUTION の分離設計を整理します。
なお、本記事はMQL5 EAの開発・検証・ログ確認を目的とした技術記事です。特定の売買判断、推奨エントリー、推奨ロット、利益保証、勝率保証、損失回避を示すものではありません。
この記事で確認すること
- 発注前チェックを作る理由
- signal / gate / special filters / precheck / execution を分ける考え方
- スプレッド確認とスプレッドブロックのログ設計
- ロット最小値・最大値・volume step・丸め処理の確認
- OrderCalcMargin と OrderCheck の役割分担
- trading allowed、trade mode、自動売買許可の確認
- StopLevel / FreezeLevel / SL・TP距離の確認
- 最大ポジション数、Magic Number、重複発注の確認
- GOLD / XAUUSD対応EAで注意したい銘柄仕様
- 発注前チェックとOrderSend結果ログの切り分け
発注前チェックとは
発注前チェックとは、EAが注文を送る直前に、現在の取引環境や注文パラメータが発注可能な状態かを確認する処理です。シグナル判定とは役割が異なります。
たとえば、移動平均やRSIなどの条件でBUY候補が出ていても、スプレッドが広い、必要証拠金が不足している、ロットが最小単位に合っていない、SL/TP距離が近すぎる、銘柄が取引不可、既に最大ポジション数に達している場合は、注文を送らずに見送る方が安全です。
| 段階 | 主な役割 | 確認例 | ログで分けたい状態 |
|---|---|---|---|
| SIGNAL | 売買候補を作る | インジ条件、方向判定、ブレイク判定 | SIGNAL_BUY / SIGNAL_SELL / SIGNAL_WAIT |
| GATE | 必須条件を確認する | 稼働ON/OFF、時間帯、上位足方向、外部制御 | ENTRY_SKIP_GATE |
| SPECIAL FILTERS | 相場・環境条件を確認する | スプレッド、急変動、セッション、ニュース回避 | ENTRY_SKIP_SPREAD / ENTRY_SKIP_FILTER |
| ORDER PRECHECK | 注文可能状態を確認する | ロット、証拠金、SL/TP距離、取引許可 | ORDER_PRECHECK_OK / ORDER_PRECHECK_FAIL |
| EXECUTION | 注文を送る | OrderSend、CTrade、MqlTradeRequest | ORDER_SENT / ORDER_SEND_FAIL |
| RESULT | 注文結果を確認する | retcode、deal、order、comment | TRADE_RETCODE / ORDER_RESULT |
このように分けることで、EAが注文しなかった時に、売買条件がなかったのか、注文前の安全確認で止まったのか、注文送信後にブローカー側の条件で失敗したのかを追いやすくなります。
signalとexecutionを分ける
EA開発では、signal と execution を混同しないことが重要です。signal は売買候補を作る責務、execution は注文要求を作って送る責務です。発注前チェックは、この2つの間に置くと整理しやすくなります。
signal側で注文可能性まで判定しようとすると、ロジック判定、銘柄仕様、証拠金、取引可否、ログ出力が混ざり、保守しにくくなります。反対に、execution側へ何でも渡してしまうと、注文失敗後に原因を追うことになります。
| 責務 | 扱う内容 | 混同した場合の問題 |
|---|---|---|
| signal | BUY / SELL / WAIT の候補判定 | 注文エラーと条件不成立を混同しやすい |
| gate | 必須条件、稼働ON/OFF、外部制御 | EAが止まる理由が曖昧になる |
| special filters | スプレッド、セッション、急変動など | 発注前安全確認と売買ロジックが混ざる |
| precheck | ロット、証拠金、取引可否、SL/TP距離 | OrderSend前に止められる問題を見逃す |
| execution | OrderSend / CTrade による注文送信 | 注文要求と注文結果を分けにくくなる |
| result logging | retcode、comment、GetLastError、deal/order | 後から原因調査できない |
発注前チェックでは、signalが成立していることを前提に、注文可能な環境かどうかを確認します。ログでは、SIGNAL成立、PRECHECK失敗、ORDER送信失敗、ORDER結果を別々に出すと、検証担当者が原因を追いやすくなります。
スプレッドを確認する
発注前チェックで最初に確認したい項目の1つがスプレッドです。スプレッドが想定より広い状態で注文すると、短期売買EAでは期待した損益構造が崩れる場合があります。
スプレッド確認は、売買方向を決めるためのロジックではなく、注文を出してよい市場環境かを見るための SPECIAL FILTERS / ORDER PRECHECK に近い処理です。
| 確認項目 | MQL5で見る値の例 | ログに残したい内容 |
|---|---|---|
| 現在スプレッド | ASK – BID、またはSYMBOL_SPREAD | spread_points / max_spread_points |
| 許容上限 | input MaxSpreadPoints | SPREAD_OK / SPREAD_BLOCK |
| point換算 | SYMBOL_POINT | point、digits、換算後pips |
| 銘柄差 | GOLD / XAUUSD / suffix付き銘柄 | symbol、digits、point |
| 時間帯差 | ロールオーバー、早朝、指標前後 | block_reason=SPREAD_WIDE |
| バックテスト条件 | 固定スプレッド、現在値、実ティック | tester_spread_mode |
| 発注見送り | スプレッド上限超過 | ENTRY_SKIP_SPREAD |
スプレッドフィルターを入れる場合は、注文を出さないこと自体は正常制御です。重要なのは、注文が出なかった時に、シグナル不成立なのかスプレッド上限超過なのかをログで区別できることです。
GOLD / XAUUSD対応EAのスプレッド確認を整理する場合は、GOLD / XAUUSD対応EAのスプレッド確認も参考になります。
ロット最小値・最大値・volume stepを確認する
MQL5で注文ロットを作る時は、入力されたロット値をそのまま使わず、銘柄仕様に合わせて確認します。最小ロット、最大ロット、volume stepに合っていないロットは、注文エラーの原因になります。
特に、固定ロット、残高比例、複利、ナンピン倍率、分割エントリーを使うEAでは、計算後ロットが取引可能単位に合っているかを発注前に確認します。
| 確認項目 | 主な確認内容 | 注意点 |
|---|---|---|
| 最小ロット | SYMBOL_VOLUME_MIN | これ未満のロットは発注不可になる |
| 最大ロット | SYMBOL_VOLUME_MAX | ナンピンや複利で超過しやすい |
| ロット刻み | SYMBOL_VOLUME_STEP | 0.01、0.1、1.0など銘柄・口座で異なる |
| 計算後ロット | 固定、複利、倍率後の値 | 丸め方向を設計しておく |
| ロット正規化 | stepに合わせた補正 | NormalizeDoubleだけでは不十分な場合がある |
| 最大保有ロット | 既存ポジション合計との関係 | ポジション制限や証拠金確認と合わせる |
| ログ | raw_lot / normalized_lot / min / max / step | 発注失敗時の原因確認に使う |
ロット補正では、実際に送るロットをログに残すことが重要です。ユーザーが0.10を指定していても、EA内部で0.09や0.11に補正されていると、後から結果を確認しにくくなります。
必要証拠金を確認する
発注前チェックでは、必要証拠金を確認します。シグナルが成立していても、証拠金が不足していれば注文は通りません。特に、ロットが大きいEA、GOLD / XAUUSD、ナンピンEA、複数ポジションEAでは重要です。
必要証拠金の概算確認には OrderCalcMargin を使い、注文要求全体の妥当性確認には OrderCheck を使う、というように役割を分けると設計しやすくなります。
| 確認項目 | 確認する内容 | 補足 |
|---|---|---|
| 必要証拠金 | 注文に必要な証拠金 | OrderCalcMarginで概算確認できる |
| 余剰証拠金 | ACCOUNT_MARGIN_FREE | 発注後に余力が残るかを見る |
| ロットと証拠金 | ロット増加による必要証拠金変化 | 複利・ナンピンで重要 |
| 銘柄仕様 | 契約サイズ、レバレッジ、通貨 | 銘柄ごとに計算条件が異なる |
| OrderCheck | 注文要求全体のチェック | retcodeやmargin関連値を確認する |
| ログ | required_margin / free_margin / margin_after | 証拠金不足時の説明に使う |
必要証拠金や想定損益の確認は、MQL5 OrderCalcMargin / OrderCalcProfitの使い方も確認してください。
取引許可状態を確認する
EAが注文できるかどうかは、シグナルだけでは決まりません。MT5側の自動売買許可、口座の取引許可、銘柄の取引モード、EAのinput設定、外部制御なども確認します。
発注前チェックでは、注文を送る前に、EAが注文処理へ進んでよい状態かを確認します。ここで止まる場合も、異常ではなく安全制御であることがあります。
| 確認項目 | 内容 | ログ例 |
|---|---|---|
| Terminal設定 | 自動売買が許可されているか | TERMINAL_TRADE_ALLOWED |
| MQL設定 | EAの取引が許可されているか | MQL_TRADE_ALLOWED |
| 口座状態 | ACCOUNT_TRADE_ALLOWED | ACCOUNT_TRADE_BLOCK |
| 銘柄状態 | SYMBOL_TRADE_MODE | SYMBOL_TRADE_DISABLED |
| 時間条件 | セッション、曜日、稼働時間 | TIME_SESSION_BLOCK |
| 外部制御 | 停止フラグ、認証、ライセンス | EXTERNAL_CONTROL_BLOCK |
| input設定 | TradeEnabledなど | INPUT_TRADE_DISABLED |
取引許可状態の確認は、発注前チェックの中でも原因切り分けに直結します。注文が出ない時に、シグナル待ちなのか、取引不可なのか、外部制御で止まっているのかを分けて表示できるようにします。
StopLevelとFreezeLevelを確認する
MQL5では、SLやTP、指値・逆指値の価格が現在価格に近すぎると注文が通らない場合があります。銘柄仕様として StopLevel や FreezeLevel が設定されているためです。
発注前チェックでは、注文種別、価格、SL、TP、現在のBid/Ask、point、digitsを使って、最低距離を満たしているか確認します。
| 項目 | 確認する内容 | 注意点 |
|---|---|---|
| StopLevel | 注文価格やSL/TPに必要な最低距離 | 近すぎるSL/TPは拒否される可能性がある |
| FreezeLevel | 変更・取消が制限される距離 | 決済や修正処理にも関係する |
| point | 価格差をpoint換算する基準 | digitsと合わせて確認する |
| BUYのSL/TP | Bid/Askとの位置関係 | 方向により基準価格が変わる |
| SELLのSL/TP | Bid/Askとの位置関係 | BUYと逆方向になる |
| 注文種別 | 成行、指値、逆指値 | 必要距離の考え方が変わる |
| ログ | stop_level / freeze_level / sl_distance / tp_distance | 拒否理由を追いやすくする |
銘柄仕様やStopLevelの確認は、MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方と合わせて整理すると理解しやすくなります。
OrderCheckを使う位置づけ
OrderCheckは、MqlTradeRequestで作成した注文要求が、現在の取引環境で妥当かどうかを確認するために使います。OrderSend前にチェックすることで、証拠金不足、無効なロット、取引不可、価格不正などを事前に把握しやすくなります。
ただし、OrderCheckだけですべての発注前チェックを済ませるのではなく、事前にスプレッド、ロット範囲、銘柄仕様、取引許可、SL/TP距離を確認してからOrderCheckへ進むと、ログが整理しやすくなります。
| 確認層 | 主な確認内容 | 使う目的 |
|---|---|---|
| 事前チェック | スプレッド、input、取引時間、最大ポジション | EA独自の見送り条件を整理する |
| 銘柄仕様確認 | point、digits、volume step、StopLevel | 注文値を銘柄仕様に合わせる |
| 証拠金概算 | OrderCalcMargin | 必要証拠金の見込みを確認する |
| 注文妥当性 | OrderCheck | MqlTradeRequest全体を確認する |
| 注文送信 | OrderSend / CTrade | 実際の注文結果を確認する |
| 結果確認 | MqlTradeResult.retcode | 注文後の成否を記録する |
OrderCheckの基本的な使い方は、MQL5 OrderCheckの使い方を確認してください。証拠金、ロット、StopLevelに焦点を当てた確認は、MQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法も参考になります。
OrderSend結果ログと分けて確認する
発注前チェックでOKになっても、OrderSendの結果が必ず成功するとは限りません。発注前チェックと注文送信結果は別の段階としてログに出す必要があります。
たとえば、OrderCheckでは問題がなくても、実際の送信タイミングで価格が変わる、スプレッドが広がる、取引状態が変わる、リクオートに相当する状態になるなど、OrderSend側で失敗することがあります。
| 段階 | 確認する値 | ログで残したい情報 |
|---|---|---|
| request作成 | symbol、type、volume、price、sl、tp | REQUEST_BUILD_OK / REQUEST_INVALID |
| precheck | ロット、証拠金、取引許可、SL/TP距離 | ORDER_PRECHECK_OK / ORDER_PRECHECK_FAIL |
| OrderCheck | MqlTradeCheckResult.retcode / comment | CHECK_RETCODE / CHECK_COMMENT |
| OrderSend | MqlTradeResult.retcode / deal / order | SEND_RETCODE / DEAL / ORDER |
| GetLastError | MQL側の補助情報 | LAST_ERROR |
| 最終判定 | 注文成功、失敗、保留、見送り | ORDER_RESULT_STATUS |
OrderSend結果ログを詳しく整理する場合は、MQL5 OrderSend結果ログを実コードで解説も確認してください。CTradeとMqlTradeRequestの違いは、MQL5 CTradeとMqlTradeRequestの違いが参考になります。
最大ポジション数とMagic Numberを確認する
EAの発注前チェックでは、現在のポジション状態も確認します。特に、最大ポジション数、同一方向ポジション、Magic Number、対象銘柄、手動ポジションとの区別は重要です。
最大ポジション数を超えて発注しない設計にしていても、ログがなければ、シグナルが出なかったのか、ポジション制限で止まったのか分かりません。
| 確認項目 | 確認する内容 | 注意点 |
|---|---|---|
| 対象Magic | EAが管理するMagic Number | 他EAや手動取引と混同しない |
| 対象symbol | 現在チャートの銘柄か、複数銘柄か | suffix差に注意する |
| 最大ポジション数 | 同時保有上限 | 発注見送り理由としてログに残す |
| 同一方向制限 | BUYのみ、SELLのみ、両建て可否 | 戦略仕様と一致させる |
| ナンピン段数 | 現在の段数と次回段数 | 最大段到達時に止める |
| クールダウン | 前回エントリーからの待機 | 連続発注防止に使う |
| ログ | positions_count / max_positions / reason | POSITION_BLOCKを明確にする |
GOLD / XAUUSD対応EAで注意したいこと
GOLD / XAUUSD対応EAでは、通貨ペアと比べて銘柄仕様の差が大きく出やすいため、発注前チェックを丁寧に作る必要があります。
特に、point、digits、tick value、tick size、volume step、StopLevel、スプレッド、契約サイズ、取引時間は、ブローカーごとに異なる場合があります。
| 確認項目 | GOLD / XAUUSDで注意する理由 | ログに残したい内容 |
|---|---|---|
| symbol名 | GOLD、XAUUSD、XAUUSDcなど表記差がある | symbol / normalized_symbol |
| digits / point | pips換算を誤りやすい | digits / point / spread_points |
| volume step | ロット刻みが通貨ペアと違う場合がある | min / max / step / normalized_lot |
| StopLevel | SL/TP距離が近すぎると拒否される | stop_level / sl_distance / tp_distance |
| 証拠金 | 必要証拠金が大きくなりやすい | required_margin / free_margin |
| スプレッド | 時間帯で拡大しやすい | SPREAD_OK / SPREAD_BLOCK |
| 取引時間 | 銘柄セッションが異なる | session_open / session_close / TIME_BLOCK |
GOLD / XAUUSDの銘柄仕様確認は、MQL5でGOLD / XAUUSDの銘柄仕様を確認する方法も参考になります。
バックテストで注文が出ない時の確認
バックテストで注文が出ない場合、EAが壊れているとは限りません。シグナルが出ていない、スプレッドで止まっている、取引時間外、ロット不正、証拠金不足、最大ポジション数到達など、発注前チェックで正常に見送っている可能性があります。
発注前チェックを設計する時は、注文を出さない理由をログで明確にします。損益結果だけでは、どの段階で止まったか分かりません。
| 症状 | 確認する層 | 主な確認内容 |
|---|---|---|
| 注文が1件も出ない | SIGNAL / GATE | 条件不成立、稼働OFF、時間外 |
| シグナルはあるが注文しない | SPECIAL FILTERS | スプレッド、セッション、外部制御 |
| 注文前で止まる | ORDER PRECHECK | ロット、証拠金、SL/TP距離、取引許可 |
| 注文送信後に失敗 | EXECUTION / RESULT | OrderSend retcode、GetLastError |
| 特定銘柄だけ失敗 | SYMBOL SPEC | digits、point、volume step、StopLevel |
| GOLDだけ止まる | MARGIN / SPREAD / SYMBOL | 証拠金、スプレッド、銘柄仕様 |
| 最適化では通るが単体で失敗 | SET / TESTER | set差分、スプレッド条件、期間差 |
バックテスト結果の相談前に整理する情報は、MT5でバックテスト結果を相談する前に整理することも参考になります。
発注前チェックのログ設計
発注前チェックは、ログ設計とセットで作ると運用しやすくなります。ログがなければ、発注見送りが正常制御なのか、不具合なのか判断しにくくなります。
ログでは、確認項目、現在値、許容値、判定結果、ブロック理由、次の処理を残します。すべてのtickで大量に出すとログが膨大になるため、状態変化時やテストモード時だけ詳細に出す設計も有効です。
| ログ項目 | 例 | 用途 |
|---|---|---|
| module | ORDER_PRECHECK | どの責務のログか分ける |
| symbol | XAUUSD | 対象銘柄を確認する |
| direction | BUY / SELL | 注文方向を確認する |
| spread | current=35 max=30 | スプレッドブロックを確認する |
| lot | raw=0.103 normalized=0.10 | ロット補正を確認する |
| margin | required / free / after | 証拠金不足を確認する |
| stops | sl_distance / tp_distance / stop_level | SL/TP距離を確認する |
| retcode | OrderCheck / OrderSend result | 注文前後の結果を追う |
| reason | SPREAD_BLOCK / MARGIN_BLOCK | 見送り理由を明確にする |
MQL5 EAのログ設計を詳しく整理する場合は、MQL5 EAのログ設計も確認してください。
発注前チェックの実務チェック表
- signal判定とexecution処理を分けた
- GATE、SPECIAL FILTERS、ORDER PRECHECK、EXECUTIONの責務を分けた
- 現在スプレッドと許容スプレッド上限を確認した
- 最小ロット、最大ロット、volume stepを確認した
- 計算後ロットを銘柄仕様に合わせて正規化した
- OrderCalcMarginで必要証拠金の見込みを確認した
- OrderCheckでMqlTradeRequest全体の妥当性を確認した
- Terminal、MQL、口座、銘柄の取引許可状態を確認した
- StopLevel、FreezeLevel、SL/TP距離を確認した
- 最大ポジション数、Magic Number、同一方向制限を確認した
- OrderCheckのretcode/commentとOrderSendのretcodeを分けてログ出力した
- バックテストで注文が出ない時の停止理由をログで追えるようにした
- 口座情報、認証情報、Webhook URLなどをログや共有資料に出していない
目的別に確認したい関連ページ
発注前チェックは、OrderCheck、OrderCalcMargin、銘柄仕様、OrderSend結果ログ、スプレッドフィルターと関連します。目的に応じて関連ページも確認してください。
| 確認したい内容 | 関連ページ |
|---|---|
| OrderCheckの基本を確認したい | MQL5 OrderCheckの使い方 |
| OrderCheckで証拠金・ロット・StopLevelを確認したい | MQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法 |
| 必要証拠金と想定損益を確認したい | MQL5 OrderCalcMargin / OrderCalcProfitの使い方 |
| 銘柄仕様を確認したい | MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方 |
| CTradeとMqlTradeRequestの違いを確認したい | MQL5 CTradeとMqlTradeRequestの違い |
| OrderSend結果ログを確認したい | MQL5 OrderSend結果ログを実コードで解説 |
| スプレッドフィルターを実装したい | MQL5のスプレッドフィルター実装 |
| GOLD / XAUUSDの銘柄仕様を確認したい | MQL5でGOLD / XAUUSDの銘柄仕様を確認する方法 |
| バックテスト結果を相談する前に整理したい | MT5でバックテスト結果を相談する前に整理すること |
よくある質問
発注前チェックは必ず必要ですか?
すべてのEAで同じ粒度の発注前チェックが必要とは限りません。ただし、スプレッド、ロット、証拠金、取引許可、SL/TP距離、最大ポジション数の確認を入れておくと、注文失敗や発注見送りの原因を追いやすくなります。
OrderCheckだけで発注前チェックは十分ですか?
OrderCheckは重要ですが、それだけに寄せすぎない方が安全です。EA独自のスプレッド条件、時間条件、最大ポジション数、外部制御、ロット正規化、ログ設計は、OrderCheck前後で分けて確認すると原因切り分けがしやすくなります。
OrderCalcMarginとOrderCheckはどう使い分けますか?
OrderCalcMarginは必要証拠金の概算確認に使いやすく、OrderCheckはMqlTradeRequest全体の妥当性確認に使います。証拠金だけを見たい場合と、注文要求全体を確認したい場合で使い分けます。
スプレッドで注文を止めた場合、不具合ですか?
スプレッド上限を超えて注文を見送る設計であれば、不具合ではなく正常な安全制御です。ただし、ログにSPREAD_BLOCKなどの理由が出ていないと、シグナル不成立なのかスプレッド停止なのか判断しにくくなります。
GOLD / XAUUSDで発注エラーが出やすい理由は何ですか?
GOLD / XAUUSDは、digits、point、volume step、StopLevel、必要証拠金、スプレッド、取引時間が通貨ペアと異なる場合があります。発注前に銘柄仕様を確認し、ロットやSL/TP距離を補正する必要があります。
発注前チェックのログはどこまで出すべきですか?
最低限、spread、lot、margin、trade allowed、StopLevel、OrderCheck retcode、OrderSend retcode、block reasonを確認できると原因調査がしやすくなります。通常運用では要約ログ、検証時は詳細ログに分ける運用も有効です。
まとめ
MQL5でEAの発注前チェックを作る時は、シグナルが出たらすぐ注文するのではなく、スプレッド、ロット、証拠金、取引許可、銘柄仕様、SL/TP距離、最大ポジション数、Magic Numberを確認してからexecutionへ進めます。
発注前チェックを設計する目的は、売買判断を増やすことではなく、注文できない状態を事前に止め、ログで原因を追えるようにすることです。signal、GATE、SPECIAL FILTERS、ORDER PRECHECK、EXECUTION、RESULTを分けておくと、バックテストや問い合わせ時の確認が進めやすくなります。
OrderCheck、OrderCalcMargin、SymbolInfoDouble / SymbolInfoInteger、OrderSend結果ログを組み合わせ、発注前に止めるべき条件と、OrderSend後に確認する条件を分けて整理してください。
