MQL5注文・ポジション・履歴管理完全ガイド|OrderSend・Position・Deal・Historyの基本
MQL5でEAを作成・改修する時に混乱しやすいのが、「注文」「ポジション」「約定」「履歴」の違いです。
MT4ではOrderSelectを中心に考える場面が多かったため、MT5へ移行すると「OrderSendは成功したのにポジションが見つからない」「履歴にはDealがあるのにOrderの見方が分からない」「PositionSelectで取得した値が想定と違う」といった確認ミスが起きやすくなります。
この記事では、MQL5のOrderSend、MqlTradeRequest、MqlTradeResult、TRADE_RETCODE、Position、Deal、Historyの基本を、EA利用者・MQL5開発者・検証担当者の視点で整理します。
公式リファレンスの代替ではなく、公式仕様を読む前に全体像を理解し、EAの動作確認や開発依頼前の資料整理に使える実務ガイドとして確認してください。
- MQL5で注文・ポジション・履歴を分けて考える理由
- MT4のOrder中心の考え方とMQL5の違い
- 注文処理の全体像|Request・Result・Retcode
- MqlTradeRequestで指定する主な項目
- MqlTradeResultで確認する主な項目
- OrderSendの基本と確認ポイント
- 注文成功と約定完了は同じではない
- TRADE_RETCODEを読む時の基本
- Positionとは何か
- PositionSelectとPositionGet系の使い方の考え方
- Orderとは何か
- Dealとは何か
- Historyとは何か
- HistorySelectとHistoryDealGet系の考え方
- 注文・決済・履歴確認でよくある失敗
- EA利用者向けの確認ポイント
- MQL5開発者向けの実装ポイント
- 検証担当者向けのログ確認ポイント
- EA改修・開発依頼前に整理する情報
- 関連する確認ページ
- 公式リファレンスで確認したい項目
- 次に読む技術講座
- 次に確認するページ
- FAQ
- まとめ
MQL5で注文・ポジション・履歴を分けて考える理由
MQL5では、取引処理を1つの「注文」だけで追いかけるのではなく、複数の概念に分けて確認します。
大きく分けると、注文リクエスト、注文結果、現在ポジション、約定履歴、注文履歴の5つです。EAが発注処理を行う時は、まずMqlTradeRequestで取引サーバーへ依頼内容を渡し、その結果をMqlTradeResultで受け取ります。その後、現在保有中の状態はPosition系関数で確認し、過去の約定や注文履歴はHistory系関数で確認します。
| 分類 | MQL5での主な確認対象 | 確認する内容 | 実務上の注意点 |
|---|---|---|---|
| 注文リクエスト | MqlTradeRequest | 発注種別、銘柄、ロット、価格、SL/TP、許容スリッページなど | 送信前に必須項目と銘柄仕様を確認します。 |
| 注文結果 | MqlTradeResult | retcode、order、deal、約定価格、コメントなど | OrderSendの戻り値だけで成功判定しないようにします。 |
| 現在ポジション | PositionSelect、PositionGet系 | 保有中の銘柄、方向、ロット、建値、損益、Magicなど | 取得直前にPositionSelectを行い、古い選択状態を避けます。 |
| 約定 | Deal、HistoryDealGet系 | 実際に成立した売買、入出金、手数料など | 決済済み取引の確認ではDeal側を確認します。 |
| 履歴 | HistorySelect、HistoryOrderGet系 | 過去の注文・約定の一覧 | 先にHistorySelectで対象期間を選択します。 |
EAの不具合調査では、「どの段階で止まっているのか」を切り分けることが重要です。発注前の条件判定で止まっているのか、OrderSendで拒否されているのか、サーバーに受理されたが約定していないのか、約定後のPosition確認で失敗しているのかを分けて確認します。
MT4のOrder中心の考え方とMQL5の違い
MT4では、OrderSelectを使って現在注文や履歴注文を扱う設計に慣れている方が多いです。一方、MQL5では注文、約定、ポジション、履歴を分けて扱うため、MT4と同じ感覚で移植すると確認漏れが起きやすくなります。
| 比較項目 | MT4でよくある考え方 | MQL5での考え方 | 確認ポイント |
|---|---|---|---|
| 発注処理 | OrderSendの戻り値やチケットを中心に確認 | MqlTradeRequestとMqlTradeResultを分けて確認 | retcode、order、deal、commentを見ます。 |
| 現在保有中の取引 | OrderSelectで注文を選択して確認 | PositionSelectやPositionGet系で現在ポジションを確認 | 銘柄、Magic、方向、volumeを確認します。 |
| 約定履歴 | 履歴注文をOrderSelectで確認することが多い | Dealとして約定単位で確認 | HistoryDealGet系を使います。 |
| 注文履歴 | 注文と約定の区別が曖昧になりやすい | OrderとDealを分けて確認 | 注文が出た事実と約定した事実を分離します。 |
| 移行時の注意 | OrderSelect中心の処理をそのまま移植しがち | Position、Order、Deal、Historyへ再設計 | MT4関数名だけの置換で済ませないようにします。 |
特に、MT4からMT5へEAを移行する場合は、「注文を出す処理」と「現在ポジションを集計する処理」と「履歴から決済結果を確認する処理」を別々の関数に分けて設計すると、後から検証しやすくなります。
注文処理の全体像|Request・Result・Retcode
MQL5の注文処理は、次の流れで考えると整理しやすくなります。
| 順番 | 処理 | 主な関数・構造体 | 確認すること |
|---|---|---|---|
| 1 | 発注条件を判定する | EA内のsignal / risk / entry条件 | エントリー条件、スプレッド、取引時間、認証、外部制御など |
| 2 | 注文リクエストを組み立てる | MqlTradeRequest | action、symbol、volume、type、price、sl、tp、deviationなど |
| 3 | 注文を送信する | OrderSend | 送信結果のboolとMqlTradeResult |
| 4 | サーバー結果を確認する | MqlTradeResult.retcode | DONE、PLACED、REJECT、INVALID、NO_MONEYなど |
| 5 | 現在ポジションを確認する | PositionSelect、PositionGet系 | 実際にポジションがあるか、ロットや方向が合っているか |
| 6 | 履歴を確認する | HistorySelect、HistoryDealGet系 | 約定、決済、手数料、損益、注文IDとの関係 |
ここで重要なのは、OrderSendを呼び出した時点でEA側の処理が終わるわけではないという点です。注文を送信した後も、retcode、ポジション状態、履歴を確認して、実際に何が起きたかを追跡する必要があります。
MqlTradeRequestで指定する主な項目
MqlTradeRequestは、取引サーバーへ送る注文依頼の内容をまとめる構造体です。発注種別、銘柄、ロット、注文タイプ、価格、SL/TPなどをここに設定します。
| 項目 | 役割 | 主な使用場面 | 確認ポイント |
|---|---|---|---|
| action | 注文処理の種類 | 成行注文、指値注文、SL/TP変更、注文削除など | TRADE_ACTION_DEAL、TRADE_ACTION_PENDING、TRADE_ACTION_SLTPなどを混同しないようにします。 |
| magic | EA識別番号 | 複数EA、複数ロジックの識別 | 他EAや他ロジックと重複しないよう管理します。 |
| order | 注文チケット | 注文変更、削除 | 新規発注と既存注文操作で使い方が変わります。 |
| symbol | 対象銘柄 | 発注、変更、決済 | チャート銘柄と発注銘柄が一致しているか確認します。 |
| volume | ロット数量 | 新規発注、部分決済 | SYMBOL_VOLUME_MIN、SYMBOL_VOLUME_STEP、SYMBOL_VOLUME_MAXに合うよう丸めます。 |
| price | 注文価格 | 成行、指値、逆指値 | 成行とPendingで扱いが変わります。 |
| stoplimit | StopLimit用価格 | StopLimit注文 | 通常の成行注文では不要な場合が多いです。 |
| sl | 損切り価格 | 新規発注、保護設定 | StopLevel、FreezeLevel、桁数、Bid/Ask基準を確認します。 |
| tp | 利確価格 | 新規発注、決済目標 | 価格桁数と方向を確認します。 |
| deviation | 許容価格差 | 成行注文 | 狭すぎると価格変動時に拒否されやすくなります。 |
| type | 注文タイプ | BUY、SELL、BUY_LIMIT、SELL_STOPなど | actionと組み合わせて整合させます。 |
| type_filling | 約定方式 | 成行注文 | 銘柄やブローカー仕様と合っているか確認します。 |
| type_time | 注文有効期限の種類 | Pending注文 | GTC、DAY、SPECIFIEDなどの扱いを確認します。 |
| expiration | 有効期限 | 期限付きPending注文 | type_timeとセットで確認します。 |
| comment | 注文コメント | ログ・履歴確認 | 長すぎるコメントや個人情報を入れないようにします。 |
| position | 対象ポジション | 決済、SL/TP変更 | ヘッジ口座や複数ポジションでは特に重要です。 |
| position_by | Close By対象 | 反対ポジションでの相殺 | 通常決済とは別の処理として扱います。 |
実務では、MqlTradeRequestを作る関数を1か所にまとめると、発注ログとエラー確認がしやすくなります。EA内で複数箇所から直接OrderSendを呼ぶと、どの処理がどの条件で注文を出したのか追いにくくなるためです。
MqlTradeResultで確認する主な項目
MqlTradeResultは、OrderSend後に取引サーバーから返ってくる処理結果を受け取る構造体です。特に重要なのはretcodeです。
| 項目 | 役割 | 確認する場面 | 注意点 |
|---|---|---|---|
| retcode | 取引サーバーの戻りコード | 注文成功、拒否、価格変更、証拠金不足などの判定 | OrderSendのboolだけでなくretcodeを確認します。 |
| deal | 約定チケット | 成行注文が約定した場合など | 常に即時取得できるとは限りません。 |
| order | 注文チケット | 注文が登録された場合 | Pending注文やサーバー受理後の追跡で使います。 |
| volume | 処理された数量 | 全部約定、部分約定の確認 | 希望ロットと一致するか確認します。 |
| price | 処理価格 | 約定価格や注文価格の確認 | 価格変動やスリッページの確認に使います。 |
| bid | サーバー応答時のBid | 価格変動の確認 | 注文方向によりAskとあわせて確認します。 |
| ask | サーバー応答時のAsk | 価格変動の確認 | スプレッド確認に使えます。 |
| comment | サーバーコメント | 拒否理由や補足確認 | ログへ出す場合は長くなりすぎないようにします。 |
| request_id | リクエスト識別 | 非同期的な追跡 | 詳細な取引イベント追跡で使います。 |
| retcode_external | 外部システム由来の戻りコード | 取引所接続など | 通常のretcodeと分けて確認します。 |
注文処理のログでは、少なくともretcode、order、deal、volume、price、commentを出しておくと、後から「注文が拒否されたのか」「注文は置かれたが約定していないのか」「約定したがPosition確認で失敗しているのか」を切り分けやすくなります。
OrderSendの基本と確認ポイント
OrderSendは、MqlTradeRequestを取引サーバーへ送り、MqlTradeResultへ処理結果を受け取る関数です。
重要なのは、OrderSendがtrueを返したからといって、必ずポジションが建っているとは限らないことです。OrderSendのtrueは、リクエストが取引サーバーに受理されたことを示す場面があり、実際の約定完了はretcode、deal、order、Position、Historyをあわせて確認します。
| 確認項目 | 見る場所 | 意味 | 実務上の扱い |
|---|---|---|---|
| OrderSendの戻り値 | bool | リクエスト送信・受理レベルの成否 | trueだけで最終成功にしないようにします。 |
| サーバー戻りコード | result.retcode | 取引サーバーがどう処理したか | DONE、PLACED、REJECTなどを判定します。 |
| 注文チケット | result.order | 注文として登録された番号 | Pendingや注文追跡に使います。 |
| 約定チケット | result.deal | 約定が成立した番号 | 約定確認・履歴確認に使います。 |
| 現在ポジション | PositionSelect | 保有状態 | 発注後に実ポジションを再確認します。 |
| 履歴 | HistorySelect | 過去の注文・約定 | 決済後やEA再起動後の確認に使います。 |
EAの注文処理では、OrderSendの直後に「送信結果ログ」を出し、その後に「現在ポジション確認ログ」を分けて出すと、確認しやすくなります。
OrderSendログの最小例
ORDER_SEND:
action=DEAL symbol=SYMBOL type=BUY volume=LOT price=ASK sl=... tp=... deviation=...
result_bool=true retcode=10009 order=123456 deal=123457 comment=Done
このように、送信前のRequest内容と、送信後のResult内容を同じログ行または連続ログで確認できるようにすると、問い合わせ時にも原因を整理しやすくなります。実運用の口座番号、認証情報、APIキー、Webhook URLなどの機密値はログ例や問い合わせ文に含めないでください。
注文成功と約定完了は同じではない
MQL5で最も重要な注意点の1つが、「注文成功」と「約定完了」を分けて考えることです。
たとえば、Pending注文がサーバーへ正常に置かれた場合、注文としては成功していても、その時点ではポジションは建っていません。成行注文でも、サーバー応答のタイミングや約定方式によっては、OrderSend直後の情報だけでは最終状態を判断しにくい場合があります。
| 状態 | 意味 | 確認方法 | よくある誤解 |
|---|---|---|---|
| 送信失敗 | リクエスト自体が送れなかった | OrderSend=false、GetLastError | 取引条件の問題ではなく、端末側・引数側の場合もあります。 |
| サーバー拒否 | 送信されたが取引サーバーが拒否 | result.retcode | OrderSend=trueでもretcodeが拒否系なら実行されていません。 |
| 注文登録 | 注文としてサーバーに置かれた | result.order、Order系履歴 | 登録された注文と約定は別です。 |
| 約定 | 実際に取引が成立した | result.deal、HistoryDealGet系 | Dealを見ないと約定単位の確認ができません。 |
| ポジション反映 | 現在保有状態として確認できる | PositionSelect、PositionGet系 | 約定後の集計結果として確認します。 |
注文処理の不具合を調べる時は、「送信できたか」「サーバーが受理したか」「注文が登録されたか」「約定したか」「ポジションとして反映されたか」を順番に確認してください。
TRADE_RETCODEを読む時の基本
TRADE_RETCODEは、取引サーバーが注文リクエストをどのように処理したかを示す戻りコードです。EAの注文エラー調査では、retcodeを読めるかどうかが重要です。
| retcode例 | 意味 | 確認すること | 対応の考え方 |
|---|---|---|---|
| TRADE_RETCODE_DONE | リクエストが完了 | deal、price、Position | 成功系として扱いますが、実ポジション確認も行います。 |
| TRADE_RETCODE_PLACED | 注文が置かれた | orderチケット、Pending状態 | 約定完了とは分けて確認します。 |
| TRADE_RETCODE_DONE_PARTIAL | 部分約定 | 希望volumeと実volume | 残数量の扱いを仕様で決めます。 |
| TRADE_RETCODE_REQUOTE | リクオート | 価格、deviation、相場変動 | 再試行対象にするか仕様化します。 |
| TRADE_RETCODE_REJECT | リクエスト拒否 | comment、取引条件 | 原因をログに残します。 |
| TRADE_RETCODE_INVALID | リクエスト不正 | Requestの必須項目 | action、type、symbol、volumeを確認します。 |
| TRADE_RETCODE_INVALID_VOLUME | ロット不正 | 最小ロット、最大ロット、ロットステップ | NormalizeVolume処理を確認します。 |
| TRADE_RETCODE_INVALID_STOPS | SL/TP不正 | StopLevel、FreezeLevel、価格方向 | SL/TP計算と桁数を確認します。 |
| TRADE_RETCODE_NO_MONEY | 証拠金不足 | 必要証拠金、口座残高、ロット | ロット計算と証拠金チェックを分けます。 |
| TRADE_RETCODE_PRICE_CHANGED | 価格変更 | 最新Bid/Ask、deviation | 価格再取得と再試行条件を検討します。 |
| TRADE_RETCODE_MARKET_CLOSED | 市場休場 | 取引時間、サーバー時間 | 取引時間判定ログを確認します。 |
| TRADE_RETCODE_TRADE_DISABLED | 取引無効 | 銘柄設定、口座設定、AutoTrading | 端末・口座・銘柄の取引可否を確認します。 |
retcodeをログへ残さないEAでは、注文が失敗した時に原因を追跡しにくくなります。EA改修時は、ORDER_FAIL、ORDER_RETRY、ORDER_SENT、EXEC_BLOCKのように、処理結果を分けて記録できる構造にすると検証しやすくなります。
Positionとは何か
Positionは、現在保有しているポジションの状態です。MQL5では、注文や約定そのものではなく、現在の保有状態を確認する時にPosition系関数を使います。
ポジションには、銘柄、方向、ロット、建値、現在価格、損益、Swap、Magic、コメント、ポジションIDなどの情報があります。EAでナンピン、トレーリング、建値移動、決済判定を行う場合は、Position情報の取得が基本になります。
| 確認したい内容 | 主な取得関数 | 主なプロパティ例 | 使う場面 |
|---|---|---|---|
| ポジションがあるか | PositionSelect | 銘柄指定 | 単一銘柄の保有確認 |
| チケットを取得する | PositionGetTicket | index指定 | 複数ポジション走査 |
| 銘柄を取得する | PositionGetString | POSITION_SYMBOL | 対象銘柄の絞り込み |
| 方向を取得する | PositionGetInteger | POSITION_TYPE | BUY / SELL判定 |
| ロットを取得する | PositionGetDouble | POSITION_VOLUME | 数量確認、部分決済、集計 |
| 建値を取得する | PositionGetDouble | POSITION_PRICE_OPEN | 平均建値、損益計算、SL/TP計算 |
| 現在損益を取得する | PositionGetDouble | POSITION_PROFIT | 決済条件、リスク監視 |
| Magicを取得する | PositionGetInteger | POSITION_MAGIC | EA別・ロジック別の分離 |
複数EAや複数ロジックを同じ口座で動かす場合は、銘柄だけでなくMagic Numberも確認してください。銘柄だけで決済対象を判定すると、他EAや手動ポジションを巻き込む可能性があります。
PositionSelectとPositionGet系の使い方の考え方
PositionSelectは、指定した銘柄のポジション情報を選択し、その後にPositionGetDouble、PositionGetInteger、PositionGetStringで詳細を取得するために使います。
注意点として、PositionSelectで選択した情報は、その時点の情報です。ポジション状態が変わった可能性がある場面では、取得直前にPositionSelectを呼び直す設計にしておくと、安全に確認できます。
| 処理 | 目的 | 実装上の注意 | ログに出すとよい内容 |
|---|---|---|---|
| PositionSelect(_Symbol) | チャート銘柄のポジション確認 | 選択失敗時はポジションなしとして扱う | symbol、selected=true/false |
| PositionGetDouble(POSITION_VOLUME) | ロット確認 | 選択後に取得する | volume |
| PositionGetInteger(POSITION_TYPE) | BUY / SELL確認 | ENUM値を表示名へ変換すると確認しやすい | type=BUY / SELL |
| PositionGetDouble(POSITION_PRICE_OPEN) | 建値確認 | digitsに合わせて表示する | open_price |
| PositionGetDouble(POSITION_PROFIT) | 含み損益確認 | Swapや手数料の扱いは別途確認する | profit |
| PositionGetInteger(POSITION_MAGIC) | EA識別 | 複数EA運用では必須 | magic |
EAでポジションを走査する場合は、PositionsTotal、PositionGetTicket、PositionSelectByTicketを使って、対象銘柄・対象Magic・対象方向を絞り込む構造にすると、誤決済や誤集計を避けやすくなります。
Orderとは何か
MQL5のOrderは、取引サーバーへ出された注文を表します。成行注文、指値注文、逆指値注文、注文変更、注文削除など、サーバーへ依頼された処理を追跡する時に使います。
Orderは「注文として出されたもの」であり、必ずしも「約定済みの取引」と同じではありません。Pending注文のように、注文は存在していてもまだDealが発生していない状態があります。
| 分類 | 意味 | 確認対象 | 注意点 |
|---|---|---|---|
| 成行注文 | 現在価格で売買を依頼する注文 | OrderSend、retcode、Deal | 約定結果はDealやPositionで確認します。 |
| Pending注文 | 指定価格に到達した時に執行する注文 | Order、OrderGet系、HistoryOrderGet系 | 注文登録と約定完了を分けて確認します。 |
| 注文変更 | 既存注文の価格や期限などを変更 | orderチケット | 対象チケットを誤らないようにします。 |
| 注文削除 | Pending注文を削除 | orderチケット | ポジション決済とは別処理です。 |
| 履歴注文 | 過去に処理された注文 | HistoryOrderGet系 | 約定内容はDeal側も確認します。 |
MT4から移行する時は、Orderという言葉だけで現在保有中の取引まで扱おうとせず、現在状態はPosition、約定結果はDeal、過去の注文はHistoryOrderとして分けると整理しやすくなります。
Dealとは何か
Dealは、実際に成立した取引や、口座に反映された取引イベントを表します。注文が出された事実ではなく、約定や入出金など、実際に履歴として残るイベントを確認する時にDealを見ます。
EAで「いつ決済されたか」「どの注文がどの価格で約定したか」「最終的な損益がどうなったか」を確認する場合は、Deal履歴の確認が重要です。
| 確認したい内容 | 主な関数 | 主なプロパティ例 | 使う場面 |
|---|---|---|---|
| Deal件数 | HistoryDealsTotal | 対象期間内の件数 | 履歴走査前の件数確認 |
| Dealチケット | HistoryDealGetTicket | index指定 | 履歴ループ処理 |
| 約定時刻 | HistoryDealGetInteger | DEAL_TIME | 発注・決済タイミング確認 |
| Deal種別 | HistoryDealGetInteger | DEAL_TYPE | BUY / SELL、入出金などの分類 |
| Entry種別 | HistoryDealGetInteger | DEAL_ENTRY | IN、OUT、INOUT確認 |
| 約定価格 | HistoryDealGetDouble | DEAL_PRICE | スリッページや決済価格確認 |
| 約定数量 | HistoryDealGetDouble | DEAL_VOLUME | 部分決済、分割約定確認 |
| 損益 | HistoryDealGetDouble | DEAL_PROFIT | 決済結果、履歴集計 |
| 手数料 | HistoryDealGetDouble | DEAL_COMMISSION | 損益集計 |
| Swap | HistoryDealGetDouble | DEAL_SWAP | 保有コスト確認 |
| Magic | HistoryDealGetInteger | DEAL_MAGIC | EA別・ロジック別履歴集計 |
| コメント | HistoryDealGetString | DEAL_COMMENT | EA識別、処理理由確認 |
EAの履歴集計では、Orderだけを見ても実際の約定単位を取りこぼすことがあります。決済結果、部分決済、ナンピンの追加約定、Close Byなどを確認する場合は、Deal履歴の確認を前提にしてください。
Historyとは何か
Historyは、過去の注文や約定を確認するための履歴領域です。現在保有しているポジションではなく、過去に処理された注文、約定、決済結果などを確認する時に使います。
履歴を確認する前には、HistorySelectで対象期間を選択します。対象期間がずれていると、履歴が0件に見えたり、必要なDealが取得できなかったりします。
| 確認対象 | 主な関数 | 確認できること | 注意点 |
|---|---|---|---|
| 履歴期間 | HistorySelect | 対象期間の注文・約定を選択 | from / toの時刻を明確にします。 |
| 履歴Order件数 | HistoryOrdersTotal | 過去注文数 | 注文履歴と約定履歴を分けて確認します。 |
| 履歴Deal件数 | HistoryDealsTotal | 過去約定数 | 実損益の確認ではDeal側が重要です。 |
| 履歴Order取得 | HistoryOrderGetTicket | 注文チケット | 注文登録・削除・変更の追跡に使います。 |
| 履歴Deal取得 | HistoryDealGetTicket | 約定チケット | 約定価格、数量、損益確認に使います。 |
日次損益、EA別損益、Magic別集計、決済理由の調査では、HistorySelectの期間とDeal履歴の集計条件を必ず確認してください。
HistorySelectとHistoryDealGet系の考え方
HistorySelectは、履歴確認の入口です。先に対象期間を選択し、その後でHistoryDealGetTicketやHistoryDealGetInteger、HistoryDealGetDouble、HistoryDealGetStringを使って、個別の履歴情報を取得します。
| 手順 | 処理 | 確認すること | ログに残すとよい内容 |
|---|---|---|---|
| 1 | 対象期間を決める | from / toの時刻 | history_from、history_to |
| 2 | HistorySelectを呼ぶ | true / false | history_selected=true / false |
| 3 | Deal件数を確認する | HistoryDealsTotal | deals_total |
| 4 | Dealチケットを取得する | HistoryDealGetTicket | ticket、index |
| 5 | 必要なプロパティを取得する | DEAL_TIME、DEAL_PROFIT、DEAL_MAGICなど | time、profit、magic、symbol |
| 6 | 条件で絞り込む | symbol、magic、entry、type | filter条件 |
履歴確認では、「履歴がない」のか、「期間が違う」のか、「フィルター条件で除外された」のかを分けて確認します。履歴集計のログでは、HistorySelectの成否、対象期間、Deal件数、絞り込み後件数を出しておくと確認しやすくなります。
注文・決済・履歴確認でよくある失敗
注文処理や履歴確認で起きやすい失敗を整理します。原因を決めつけず、どの段階で問題が出ているかを順番に確認してください。
| よくある失敗 | 起きる場面 | 原因候補 | 確認方法 |
|---|---|---|---|
| OrderSend=trueだけで成功扱いにする | 注文処理 | retcode確認不足 | result.retcode、order、dealを確認します。 |
| ポジションがないのに注文失敗と判断する | Pending注文後 | 注文登録と約定を混同 | OrderとDealを分けて確認します。 |
| PositionSelect後の古い値を使う | 決済直後、ポジション変更後 | 再選択していない | 取得直前にPositionSelectを実行します。 |
| 銘柄だけでポジションを絞る | 複数EA運用 | Magic確認不足 | symbol + magic + directionで絞ります。 |
| 履歴が0件になる | 履歴集計 | HistorySelect未実行、期間不正 | from / toとHistorySelect結果を確認します。 |
| 決済損益が合わない | 履歴集計 | DealではなくOrderを見ている、手数料・Swap未考慮 | DEAL_PROFIT、DEAL_COMMISSION、DEAL_SWAPを確認します。 |
| SL/TPエラーが出る | 新規発注、SL/TP変更 | StopLevel、価格方向、桁数不正 | SymbolInfo、NormalizeDouble、Bid/Ask基準を確認します。 |
| ロットエラーが出る | 新規発注、部分決済 | volume step不一致 | SYMBOL_VOLUME_MIN / STEP / MAXを確認します。 |
| 決済対象を間違える | 一括決済、バスケット決済 | 対象範囲の絞り込み不足 | symbol、magic、position ticket、directionをログへ出します。 |
| バックテストと実運用で結果が違う | 検証後の実機確認 | 価格配信、スプレッド、約定方式、履歴時間の違い | テスト条件とサーバー条件を記録します。 |
注文処理の失敗は、ロジック条件の問題、EA実装の問題、端末設定の問題、口座・銘柄仕様の問題、取引サーバー側の拒否など、複数の原因に分かれます。1つのログだけで断定せず、段階ごとに確認してください。
EA利用者向けの確認ポイント
EAを利用していて注文が入らない、決済されない、履歴が合わないと感じた場合は、まず次の情報を整理してください。
| 確認項目 | 確認する場所 | 送るとよい情報 | 注意点 |
|---|---|---|---|
| EA名・バージョン | ファイル名、Expertsログ、画面表示 | EA名、バージョン、配布日 | 古い版と混同しないようにします。 |
| 対象銘柄 | チャート左上、気配値、ログ | GOLD、XAUUSD、XAUUSDcなど正確な銘柄名 | suffix違いに注意します。 |
| 時間足 | チャート | M1、M5、M15など | EA仕様と一致しているか確認します。 |
| setファイル | 保存済み設定 | 使用したsetファイル | 変更後の最新版を送ります。 |
| Expertsログ | MT5のExpertsタブ | 注文前後のログ | 必要箇所を時刻付きで送ります。 |
| Journalログ | MT5のJournalタブ | 端末側エラーや接続状態 | Expertsログと分けて確認します。 |
| 取引履歴 | 口座履歴 | 該当注文・約定・決済の時刻 | 口座番号など不要な情報は隠します。 |
| スクリーンショット | チャート、EA設定、ログ | 現象が分かる画像 | 認証情報や口座番号を写さないようにします。 |
注文処理に関する相談では、「エントリーしません」だけでは原因を切り分けにくいため、注文前の条件、OrderSend結果、retcode、Position確認、履歴確認のどこで止まっているかを整理することが重要です。
MQL5開発者向けの実装ポイント
MQL5開発者は、注文処理をsignal、execution、risk、exit、position、historyに分けて実装すると、保守しやすくなります。
| 責務 | 内容 | 主な確認ログ | 分離する理由 |
|---|---|---|---|
| signal | 売買候補の判定 | SIGNAL、ENTRY_CANDIDATE | 条件成立と注文実行を混同しないため |
| risk | ロット、同時保有、損失制限、スプレッド確認 | RISK_CHECK、ENTRY_BLOCK | 注文前の安全条件を明示するため |
| execution | MqlTradeRequest作成、OrderSend実行 | ORDER_SEND、ORDER_FAIL、ORDER_RETRY | 発注処理の原因切り分けをしやすくするため |
| position | 現在ポジションの取得・集計 | POSITION_SNAPSHOT | 決済やトレーリングの基準を明確にするため |
| exit | 決済条件、SL/TP変更、トレーリング | EXIT_CHECK、CLOSE_SEND、CLOSE_RESULT | 新規Entryと決済を分離するため |
| history | 履歴集計、決済確認、日次損益確認 | HISTORY_SUMMARY、DEAL_TRACE | 現在状態と過去履歴を混同しないため |
注文処理を1つの巨大関数にまとめると、retcode、Position、Historyの確認が混ざり、後から修正しにくくなります。EAの規模が大きくなるほど、発注リクエスト作成、送信、結果判定、ポジション再確認、履歴反映を別関数へ分けることが重要です。
検証担当者向けのログ確認ポイント
検証担当者は、チャート上の見た目だけでなく、Expertsログ、Journalログ、取引履歴を照合します。特に注文・決済・履歴に関する検証では、時刻とチケット番号の整合が重要です。
| 検証対象 | 確認するログ | 見る項目 | 期待する状態 |
|---|---|---|---|
| 注文送信 | ORDER_SEND | symbol、type、volume、price、sl、tp | 仕様通りのRequestが作られている |
| 注文結果 | ORDER_RESULT | retcode、order、deal、comment | 成功・失敗理由が判定できる |
| ポジション確認 | POSITION_SNAPSHOT | ticket、symbol、magic、type、volume | 対象ポジションだけを認識している |
| 決済処理 | CLOSE_SEND、CLOSE_RESULT | 対象ticket、volume、retcode | 誤決済がない |
| 履歴確認 | HISTORY_SUMMARY | Deal件数、損益、Magic、symbol | 取引履歴と一致している |
| エラー時 | ORDER_FAIL、EXEC_BLOCK | block reason、retcode、GetLastError | 失敗理由を再現できる |
検証では、注文が出たかどうかだけではなく、注文前に止めたのか、OrderSendで失敗したのか、サーバーが拒否したのか、約定後にポジション確認で失敗したのかを分けて記録してください。
EA改修・開発依頼前に整理する情報
EAの注文処理や履歴管理の改修を依頼する場合は、現象だけでなく、再現条件と確認ログを整理しておくと、原因調査が進めやすくなります。
| 整理する情報 | 内容 | 理由 |
|---|---|---|
| EA名・バージョン | 対象ファイル名、バージョン、配布日 | 旧版との混同を防ぐため |
| 対象銘柄・時間足 | 銘柄名、時間足、口座種別 | 銘柄仕様やサーバー条件の差を確認するため |
| 使用set | 実際に使ったsetファイル | 設定差による再現不可を避けるため |
| 注文前後のExpertsログ | OrderSend前後、retcode、block reason | どの段階で止まったかを切り分けるため |
| Journalログ | 端末・接続・取引許可の状態 | EA外の問題を確認するため |
| 取引履歴 | 該当時刻の注文・約定・決済 | Order / Deal / Positionの整合を確認するため |
| スクリーンショット | チャート、設定、ログ、履歴 | 文字情報だけで分からない状態を補足するため |
送ってはいけない情報もあります。口座番号、認証トークン、APIキー、Webhook URL、GAS URL、個人情報が写った画像は、そのまま送らないでください。必要な箇所だけを伏せて、EA名、バージョン、ログ、setファイル、再現条件を中心に整理してください。
関連する確認ページ
注文・ポジション・履歴管理を確認する時は、関数、エラー、検証環境、依頼前資料をあわせて整理すると、原因を切り分けやすくなります。
| 確認したい内容 | 関連ページ | 確認できること |
|---|---|---|
| MQL5開発の基本 | MQL5開発入門 | MetaEditor、EA、インジケーター、イベント関数、コンパイルエラーの基本を確認できます。 |
| 関数名から調べたい | MQL5関数辞書 | CopyBuffer、FileOpen、GetLastError、iCustomなど主要関数の役割を確認できます。 |
| エラーやretcodeを確認したい | MQL5エラーコード辞典 | ランタイムエラー、取引サーバーリターンコード、コンパイルエラーを確認できます。 |
| 検証環境を整理したい | MT5検証・運用環境ガイド | サーバー時間、銘柄名、VPS、バックテスト条件の確認ポイントを整理できます。 |
| 開発依頼前の資料を整理したい | MT5開発依頼前に用意する資料まとめ | 仕様書、setファイル、Expertsログ、Journalログ、スクリーンショットの整理方法を確認できます。 |
| 技術講座一覧へ戻りたい | MT4/MT5 技術講座 | MT5基本操作、MQL5開発、検証、外部連携、エラー確認の講座一覧を確認できます。 |
公式リファレンスで確認したい項目
実装時は、この記事だけで完結させず、公式リファレンスで関数仕様や構造体の項目を確認してください。特に、retcode、Position系、History系は、細かいプロパティの型を間違えると取得結果がずれることがあります。
| 確認項目 | 確認する内容 |
|---|---|
| OrderSend | OrderSendの戻り値、OrderCheck、OnTradeとの関係 |
| MqlTradeRequest | 注文リクエスト構造体の各フィールド |
| MqlTradeResult | 注文結果構造体の各フィールド |
| TRADE_RETCODE | 取引サーバー戻りコードの意味 |
| PositionSelect | ポジション選択とPositionGet系の前提 |
| HistorySelect | 履歴期間の選択と履歴取得の前提 |
| HistoryDealGet系 | Deal履歴の取得方法とプロパティ型 |
次に読む技術講座
この講座とあわせて確認すると、MQL5の注文・決済・履歴管理をより実務に近い形で整理できます。
| No | 講座 | 確認できること |
|---|---|---|
| LEARN-016 | MQL5標準ライブラリ・CTrade完全ガイド | CTradeで注文・決済処理を確認できます。 |
| LEARN-017 | MQL5ロット・証拠金・銘柄仕様完全ガイド | ロット・証拠金・銘柄仕様を確認できます。 |
| LEARN-020 | MQL5イベント処理完全ガイド | 取引イベントとOnTradeTransactionを確認できます。 |
| LEARN-005 | MQL5エラーコード辞典 | 取引サーバーリターンコードを確認できます。 |
次に確認するページ
技術講座を確認した後、導入・商品確認・開発相談・不具合報告へ進む場合は、以下のページも確認してください。
| ページ | 確認できること |
|---|---|
| 技術講座一覧 | MT5・MQL5・EA開発に関する技術講座を順番に確認できます。 |
| 導入ガイド | EA、インジケーター、補助ツールを導入する前の確認事項を整理できます。 |
| 商品一覧 | EAファンクラブで扱う補助ツール、インジケーター、コピーEAなどを確認できます。 |
| 開発代行ページ | EA、インジケーター、補助ツールの新規作成・改修相談を確認できます。 |
| 不具合報告・サポート依頼 | ログ、スクリーンショット、再現手順を整理して相談する場合に確認できます。 |
FAQ
OrderとPositionは何が違いますか?
Orderは取引サーバーへ出された注文、Positionは現在保有しているポジション状態です。注文が出ても、まだ約定していなければPositionとして確認できない場合があります。
OrderSendがtrueなら注文は必ず成功していますか?
いいえ。OrderSendのtrueだけで最終成功とは判断しません。MqlTradeResultのretcode、order、deal、Position、Historyをあわせて確認します。
TRADE_RETCODE_DONEは何を意味しますか?
取引サーバー側でリクエストが完了したことを示す成功系の戻りコードです。ただし、実務ではdeal、price、Position状態、履歴も確認して、EA側の処理と一致しているかを見ます。
MT4のOrderSelectとMQL5のPositionSelectは同じですか?
同じではありません。MT4ではOrderSelect中心で現在注文や履歴を扱う場面が多いですが、MQL5では現在保有状態はPosition、注文履歴はOrder、約定履歴はDealとして分けて確認します。
約定履歴を確認するには何を見ればよいですか?
まずHistorySelectで対象期間を選択し、HistoryDealsTotal、HistoryDealGetTicket、HistoryDealGetInteger、HistoryDealGetDouble、HistoryDealGetStringなどでDeal履歴を確認します。
注文エラーが出た時はどのログを送ればよいですか?
注文前後のExpertsログ、Journalログ、使用したsetファイル、対象銘柄、時間足、EA名とバージョン、該当時刻の取引履歴、スクリーンショットを整理してください。口座番号や認証情報は伏せてください。
EA改修依頼前に注文処理の何を整理すればよいですか?
どの条件で注文を出したいのか、注文前に止めたい条件は何か、OrderSend後に何を成功扱いにするか、PositionやHistoryで何を確認するかを整理してください。特にretcodeと履歴確認の扱いは事前に明確にしておくと改修しやすくなります。
Positionが見つからない時は注文失敗ですか?
必ずしも注文失敗とは限りません。Pending注文として登録されただけでまだ約定していない場合や、対象銘柄・Magic Number・ポジションチケットの絞り込みが違う場合があります。
履歴の損益が想定と合わない時は何を確認しますか?
Deal履歴のDEAL_PROFITだけでなく、手数料、Swap、部分決済、Close By、複数Dealの合算を確認します。Order履歴だけでは実際の約定単位を確認できない場合があります。
複数EAを同じ口座で使う時に注意することはありますか?
あります。銘柄だけでなくMagic Number、方向、ポジションチケットを使って対象を分けてください。銘柄だけで決済対象を選ぶと、他EAや手動ポジションを巻き込む可能性があります。
Order、Deal、Positionのどれをログに出すべきですか?
注文処理ではRequestとResult、保有確認ではPosition、履歴確認ではDealをログに出すと切り分けやすくなります。1つのログに詰め込みすぎず、ORDER_SEND、ORDER_RESULT、POSITION_SNAPSHOT、HISTORY_SUMMARYのように分けると確認しやすくなります。
公式リファレンスだけでなく、このような整理記事を見る意味はありますか?
あります。公式リファレンスは仕様確認に有効ですが、EAの不具合調査や開発依頼では、注文、ポジション、約定、履歴をどういう順番で確認するかが重要です。この記事では、その実務上の確認順を整理しています。
まとめ
MQL5の注文処理では、OrderSend、MqlTradeRequest、MqlTradeResult、Position、Deal、Historyを分けて理解することが重要です。
OrderSendの戻り値だけで判断せず、retcode、order、deal、Position、Historyを順番に確認することで、注文がどの段階で止まっているのかを切り分けやすくなります。
EAを利用する側は、EA名、バージョン、銘柄、時間足、setファイル、Expertsログ、Journalログ、取引履歴、スクリーンショットを整理してください。開発する側は、signal、execution、risk、position、exit、historyを責務分離し、ログで追跡できる構造にしておくことが重要です。
関数やエラーコードを確認したい場合は、上記の関連ページと技術講座を参照し、注文処理、現在ポジション、履歴確認を分けて整理してください。

