技術講座

MQL5注文・ポジション・履歴管理完全ガイド|OrderSend・Position・Deal・Historyの基本

EAファンクラブ

MQL5でEAを作成・改修する時に混乱しやすいのが、「注文」「ポジション」「約定」「履歴」の違いです。

MT4ではOrderSelectを中心に考える場面が多かったため、MT5へ移行すると「OrderSendは成功したのにポジションが見つからない」「履歴にはDealがあるのにOrderの見方が分からない」「PositionSelectで取得した値が想定と違う」といった確認ミスが起きやすくなります。

この記事では、MQL5のOrderSend、MqlTradeRequest、MqlTradeResult、TRADE_RETCODE、Position、Deal、Historyの基本を、EA利用者・MQL5開発者・検証担当者の視点で整理します。

公式リファレンスの代替ではなく、公式仕様を読む前に全体像を理解し、EAの動作確認や開発依頼前の資料整理に使える実務ガイドとして確認してください。

MQL5で注文・ポジション・履歴を分けて考える理由

MQL5では、取引処理を1つの「注文」だけで追いかけるのではなく、複数の概念に分けて確認します。

大きく分けると、注文リクエスト、注文結果、現在ポジション、約定履歴、注文履歴の5つです。EAが発注処理を行う時は、まずMqlTradeRequestで取引サーバーへ依頼内容を渡し、その結果をMqlTradeResultで受け取ります。その後、現在保有中の状態はPosition系関数で確認し、過去の約定や注文履歴はHistory系関数で確認します。

分類MQL5での主な確認対象確認する内容実務上の注意点
注文リクエストMqlTradeRequest発注種別、銘柄、ロット、価格、SL/TP、許容スリッページなど送信前に必須項目と銘柄仕様を確認します。
注文結果MqlTradeResultretcode、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注文リクエストを組み立てるMqlTradeRequestaction、symbol、volume、type、price、sl、tp、deviationなど
3注文を送信するOrderSend送信結果のboolとMqlTradeResult
4サーバー結果を確認するMqlTradeResult.retcodeDONE、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などを混同しないようにします。
magicEA識別番号複数EA、複数ロジックの識別他EAや他ロジックと重複しないよう管理します。
order注文チケット注文変更、削除新規発注と既存注文操作で使い方が変わります。
symbol対象銘柄発注、変更、決済チャート銘柄と発注銘柄が一致しているか確認します。
volumeロット数量新規発注、部分決済SYMBOL_VOLUME_MIN、SYMBOL_VOLUME_STEP、SYMBOL_VOLUME_MAXに合うよう丸めます。
price注文価格成行、指値、逆指値成行とPendingで扱いが変わります。
stoplimitStopLimit用価格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_byClose 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.retcodeOrderSend=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_STOPSSL/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銘柄指定単一銘柄の保有確認
チケットを取得するPositionGetTicketindex指定複数ポジション走査
銘柄を取得するPositionGetStringPOSITION_SYMBOL対象銘柄の絞り込み
方向を取得するPositionGetIntegerPOSITION_TYPEBUY / SELL判定
ロットを取得するPositionGetDoublePOSITION_VOLUME数量確認、部分決済、集計
建値を取得するPositionGetDoublePOSITION_PRICE_OPEN平均建値、損益計算、SL/TP計算
現在損益を取得するPositionGetDoublePOSITION_PROFIT決済条件、リスク監視
Magicを取得するPositionGetIntegerPOSITION_MAGICEA別・ロジック別の分離

複数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チケットHistoryDealGetTicketindex指定履歴ループ処理
約定時刻HistoryDealGetIntegerDEAL_TIME発注・決済タイミング確認
Deal種別HistoryDealGetIntegerDEAL_TYPEBUY / SELL、入出金などの分類
Entry種別HistoryDealGetIntegerDEAL_ENTRYIN、OUT、INOUT確認
約定価格HistoryDealGetDoubleDEAL_PRICEスリッページや決済価格確認
約定数量HistoryDealGetDoubleDEAL_VOLUME部分決済、分割約定確認
損益HistoryDealGetDoubleDEAL_PROFIT決済結果、履歴集計
手数料HistoryDealGetDoubleDEAL_COMMISSION損益集計
SwapHistoryDealGetDoubleDEAL_SWAP保有コスト確認
MagicHistoryDealGetIntegerDEAL_MAGICEA別・ロジック別履歴集計
コメントHistoryDealGetStringDEAL_COMMENTEA識別、処理理由確認

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
2HistorySelectを呼ぶtrue / falsehistory_selected=true / false
3Deal件数を確認するHistoryDealsTotaldeals_total
4Dealチケットを取得するHistoryDealGetTicketticket、index
5必要なプロパティを取得するDEAL_TIME、DEAL_PROFIT、DEAL_MAGICなどtime、profit、magic、symbol
6条件で絞り込むsymbol、magic、entry、typefilter条件

履歴確認では、「履歴がない」のか、「期間が違う」のか、「フィルター条件で除外された」のかを分けて確認します。履歴集計のログでは、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注文前の安全条件を明示するため
executionMqlTradeRequest作成、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_SENDsymbol、type、volume、price、sl、tp仕様通りのRequestが作られている
注文結果ORDER_RESULTretcode、order、deal、comment成功・失敗理由が判定できる
ポジション確認POSITION_SNAPSHOTticket、symbol、magic、type、volume対象ポジションだけを認識している
決済処理CLOSE_SEND、CLOSE_RESULT対象ticket、volume、retcode誤決済がない
履歴確認HISTORY_SUMMARYDeal件数、損益、Magic、symbol取引履歴と一致している
エラー時ORDER_FAIL、EXEC_BLOCKblock 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系は、細かいプロパティの型を間違えると取得結果がずれることがあります。

確認項目確認する内容
OrderSendOrderSendの戻り値、OrderCheck、OnTradeとの関係
MqlTradeRequest注文リクエスト構造体の各フィールド
MqlTradeResult注文結果構造体の各フィールド
TRADE_RETCODE取引サーバー戻りコードの意味
PositionSelectポジション選択とPositionGet系の前提
HistorySelect履歴期間の選択と履歴取得の前提
HistoryDealGet系Deal履歴の取得方法とプロパティ型

次に読む技術講座

この講座とあわせて確認すると、MQL5の注文・決済・履歴管理をより実務に近い形で整理できます。

No講座確認できること
LEARN-016MQL5標準ライブラリ・CTrade完全ガイドCTradeで注文・決済処理を確認できます。
LEARN-017MQL5ロット・証拠金・銘柄仕様完全ガイドロット・証拠金・銘柄仕様を確認できます。
LEARN-020MQL5イベント処理完全ガイド取引イベントとOnTradeTransactionを確認できます。
LEARN-005MQL5エラーコード辞典取引サーバーリターンコードを確認できます。

次に確認するページ

技術講座を確認した後、導入・商品確認・開発相談・不具合報告へ進む場合は、以下のページも確認してください。

ページ確認できること
技術講座一覧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を責務分離し、ログで追跡できる構造にしておくことが重要です。

関数やエラーコードを確認したい場合は、上記の関連ページと技術講座を参照し、注文処理、現在ポジション、履歴確認を分けて整理してください。

ABOUT ME
記事URLをコピーしました