MQL5 OrderSend結果ログを実コードで解説|MqlTradeRequest・MqlTradeResult・TRADE_RETCODE確認
MQL5でEAの注文処理を確認する時は、OrderSendがtrueを返したかどうかだけでなく、MqlTradeRequest、MqlTradeResult、retcode、comment、deal、order、price、volume、GetLastErrorを分けてログに残すことが重要です。
OrderSendは、取引リクエストをサーバーへ送信する関数です。ただし、関数の戻り値だけでは、注文が約定したのか、注文リクエストが拒否されたのか、価格が変わったのか、証拠金不足なのか、StopLevel違反なのかまでは判断しにくい場合があります。
そのため、EA開発では「注文前に何を送ったか」と「注文後に何が返ったか」を必ずセットでログ化します。特に、バックテストで注文が出ない、デモ口座では通るがリアル口座で失敗する、GOLD / XAUUSDで注文エラーが出る、CTradeで原因が追えない、といった相談では、OrderSend結果ログが原因確認の起点になります。
この記事では、MQL5のOrderSend結果ログを、MqlTradeRequest、MqlTradeResult、TRADE_RETCODE、GetLastError、OrderCheck、OrderCalcMargin、SymbolInfo系確認と分けて整理します。
なお、本記事はMQL5 EA開発における技術的なログ確認を目的とした内容です。売買判断、推奨エントリー、推奨ロット、利益保証、損失回避保証を行うものではありません。
- この記事で確認すること
- OrderSend結果ログは注文処理の最終確認に使う
- OrderSend前後でログを見る順番
- MqlTradeRequestで送信前の条件を記録する
- MqlTradeResultで送信後の結果を記録する
- OrderSendの戻り値とretcodeを分ける
- TRADE_RETCODEは分類して見る
- retcodeを文字列化してログを読みやすくする
- MqlTradeRequestをログに出す
- MqlTradeResultをログに出す
- OrderSend前後をまとめてログ化する例
- 失敗時はretcode、last_error、requestをセットで読む
- OrderCheckとOrderSend結果ログを分ける
- OrderCalcMargin / OrderCalcProfitとの接続
- SymbolInfo系で銘柄仕様を確認する
- CTradeを使う場合も結果ログを省略しない
- バックテストでOrderSend結果ログを見る
- デモ口座・リアル口座で結果が違う時の確認
- OrderSend結果ログの出力例
- よくある失敗パターン
- 注文エラー調査で提出するとよい情報
- ログを共有する時に伏せる情報
- 関連ページ
- OrderSend結果ログの実務チェック表
- よくある質問
- まとめ
この記事で確認すること
- OrderSend結果ログで確認する項目
- MqlTradeRequestに記録すべき内容
- MqlTradeResultに記録すべき内容
- OrderSendの戻り値とresult.retcodeの違い
- GetLastErrorとTRADE_RETCODEの役割分担
- OrderCheck、OrderCalcMargin、SymbolInfo系との接続
- CTradeを使う時のログ確認
- バックテスト・デモ口座・リアル口座での違い
- 注文エラー調査で必要なログ
- OrderSend結果ログの実務チェック表
OrderSend結果ログは注文処理の最終確認に使う
EAの発注処理では、シグナルが成立した後に、スプレッド、ロット、証拠金、SL / TP距離、取引許可、ポジション数、Magic Numberなどを確認し、最後にOrderSendで注文リクエストを送ります。
この時、OrderSendの直前までの条件がすべて正常でも、サーバー側で注文が拒否されることがあります。価格変動、取引時間外、ロット不正、証拠金不足、StopLevel違反、Filling Mode不一致、銘柄取引停止、通信状態などが関係するためです。
そのため、OrderSend結果ログでは、EA側が送ったリクエストと、サーバー側から返った結果を分けて残します。これにより、EAの判定ミスなのか、リクエスト構築ミスなのか、サーバー側の拒否なのか、口座・銘柄仕様の問題なのかを追いやすくなります。
| 確認層 | 確認する内容 | 主なログ |
|---|---|---|
| SIGNAL | BUY / SELLの候補が出たか | SIGNAL_OK / SIGNAL_NG |
| GATE | 稼働時間、許可状態、最大ポジション数など | GATE_PASS / GATE_BLOCK |
| SPECIAL FILTERS | スプレッド、指標、外部停止、ボラティリティなど | FILTER_PASS / FILTER_BLOCK |
| ORDER PRECHECK | ロット、証拠金、SL / TP距離、OrderCheck | ORDER_CHECK / PRECHECK_NG |
| ORDER SEND | MqlTradeRequestを送信した結果 | ORDER_SEND_OK / ORDER_SEND_NG |
| ORDER RESULT | retcode、deal、order、commentの確認 | TRADE_RESULT / RETCODE |
| FOLLOW-UP | ポジション反映、履歴、Magic Number確認 | POSITION_SYNC / HISTORY_CHECK |
OrderSend前後でログを見る順番
OrderSend結果ログは、1行だけを見るのではなく、発注前の条件、送信したrequest、返ってきたresult、反映確認の順番で追うと原因を切り分けやすくなります。特に、注文が出ない時は「OrderSendまで到達していない」のか、「OrderSendは実行されたがサーバー側で拒否された」のかを最初に分けてください。
実務では、SIGNALやFILTERのログで止まっている場合と、OrderSend後のretcodeで止まっている場合では、見るべき箇所が変わります。前者はEA内部条件、後者はrequest内容、銘柄仕様、口座条件、サーバー応答を確認する流れになります。
| 確認順 | 見るログ | 切り分けること |
|---|---|---|
| 1 | SIGNAL / FILTER / GATE | 注文処理へ進む条件を満たしたか |
| 2 | ORDER_CHECK_BEFORE | 送信予定のsymbol、type、volume、price、sl、tpが妥当か |
| 3 | ORDER_CHECK_RESULT | margin、margin_free、retcode、commentで事前確認の結果を見る |
| 4 | ORDER_SEND_BEFORE | 最終的にOrderSendへ渡したMqlTradeRequestを確認する |
| 5 | ORDER_SEND_AFTER | send_ok、retcode、deal、order、comment、last_errorを分けて確認する |
| 6 | POSITION / HISTORY | 約定、未約定注文、ポジション反映、履歴を確認する |
MqlTradeRequestで送信前の条件を記録する
MqlTradeRequestは、OrderSendに渡す注文リクエスト構造体です。注文方向、銘柄、ロット、価格、SL、TP、Magic Number、コメント、Filling Modeなど、EAがサーバーへ送ろうとした内容が入ります。
注文エラー調査では、MqlTradeRequestの値が想定どおりかを確認します。EA側のロット正規化が漏れていないか、SL / TP価格が銘柄のStopLevelに合っているか、注文タイプと価格が一致しているか、Magic Numberが正しいかを確認してください。
| request項目 | 確認する内容 | よくある問題 |
|---|---|---|
| action | TRADE_ACTION_DEAL、TRADE_ACTION_PENDINGなど | 成行注文と指値注文のaction不一致 |
| symbol | 対象銘柄名 | suffix付き銘柄、GOLD / XAUUSD表記差 |
| volume | 発注ロット | volume min / step / maxに合っていない |
| type | ORDER_TYPE_BUY、ORDER_TYPE_SELLなど | BUY / SELL方向の取り違え |
| price | 発注価格 | BUYでBid、SELLでAskを使うなどの方向ミス |
| sl | 損切り価格 | StopLevel違反、価格方向の誤り |
| tp | 利確価格 | StopLevel違反、価格方向の誤り |
| deviation | 許容スリッページ | 値が小さすぎて価格変更に弱い |
| magic | Magic Number | 複数EAや手動取引との識別ができない |
| type_filling | Filling Mode | 銘柄仕様と不一致で注文拒否 |
| comment | 注文コメント | ログ上で注文意図を追えない |
MqlTradeResultで送信後の結果を記録する
MqlTradeResultは、OrderSend実行後にサーバー側から返る結果を受け取る構造体です。ここには、retcode、deal、order、volume、price、bid、ask、commentなどが入ります。
OrderSendの戻り値がtrueでも、result.retcodeを確認しなければ、どのような取引結果になったかを判断できません。OrderSendの戻り値、result.retcode、result.comment、GetLastErrorを混同しないようにしてください。
| result項目 | 確認する内容 | 用途 |
|---|---|---|
| retcode | TRADE_RETCODE系の結果コード | 注文結果の中心確認 |
| deal | 約定deal番号 | 約定済み取引の追跡 |
| order | 注文番号 | 未約定注文や注文履歴の追跡 |
| volume | 結果側の数量 | 部分約定や数量確認 |
| price | 結果側の価格 | 約定価格または処理価格の確認 |
| bid / ask | サーバー側価格 | 価格変更やスプレッド確認 |
| comment | サーバー側コメント | retcodeの補足確認 |
| request_id | リクエスト識別 | 非同期処理や追跡に使う場合がある |
| retcode_external | 外部システム由来のコード | ブローカー・取引所系の補足確認 |
OrderSendの戻り値とretcodeを分ける
OrderSendの戻り値は、取引リクエスト送信処理の成否を示します。一方、MqlTradeResultのretcodeは、取引サーバー側がそのリクエストをどのように処理したかを示します。
この2つを混同すると、「OrderSendがtrueだから注文成功」と誤解する可能性があります。注文処理では、OrderSendの戻り値、result.retcode、result.comment、GetLastErrorを必ず分けてログ化してください。
| 確認対象 | 意味 | 確認上の注意 |
|---|---|---|
| OrderSend戻り値 | リクエスト送信処理の成否 | trueでも約定成功とは限らない |
| result.retcode | サーバー側の取引結果コード | TRADE_RETCODE_DONEなどを確認する |
| result.comment | サーバー側コメント | 拒否理由や補足が出る場合がある |
| GetLastError | 端末側・関数呼び出し側のエラー | retcodeとは別に確認する |
| deal / order | 約定・注文番号 | 成功時の追跡に使う |
| price / bid / ask | 処理価格・サーバー価格 | 価格変更やスリッページ確認に使う |
TRADE_RETCODEは分類して見る
TRADE_RETCODEは、注文結果の確認で最も重要な情報です。すべてのコードを暗記する必要はありませんが、成功系、価格系、証拠金系、ロット系、SL / TP系、取引許可系、通信・サーバー系に分類して見ると原因確認がしやすくなります。
| 分類 | 代表的な状態 | 確認すること |
|---|---|---|
| 成功系 | DONE、PLACED、DONE_PARTIAL | deal、order、volume、priceを確認する |
| 価格系 | REQUOTE、PRICE_CHANGED、PRICE_OFF | Bid / Ask、deviation、約定方式を確認する |
| ロット系 | INVALID_VOLUME | volume min / step / max、ロット正規化を確認する |
| SL / TP系 | INVALID_STOPS | StopLevel、FreezeLevel、価格方向を確認する |
| 証拠金系 | NO_MONEY | OrderCalcMargin、margin_free、ロットを確認する |
| 取引許可系 | TRADE_DISABLED、MARKET_CLOSED | 銘柄trade mode、取引時間、自動売買許可を確認する |
| Filling系 | INVALID_FILL | SYMBOL_FILLING_MODEとrequest.type_fillingを確認する |
| 通信・混雑系 | CONNECTION、TOO_MANY_REQUESTS | 通信状態、連続発注、リトライ制御を確認する |
| 変更・凍結系 | ORDER_CHANGED、FROZEN | 注文変更、FreezeLevel、保留注文状態を確認する |
retcodeを文字列化してログを読みやすくする
retcodeは数値で出すだけでも確認できますが、ログ確認やサポート時には、簡単な文字列化関数を用意しておくと原因確認が速くなります。
string TradeRetcodeToText(const uint retcode)
{
switch(retcode)
{
case TRADE_RETCODE_REQUOTE: return "REQUOTE";
case TRADE_RETCODE_REJECT: return "REJECT";
case TRADE_RETCODE_CANCEL: return "CANCEL";
case TRADE_RETCODE_PLACED: return "PLACED";
case TRADE_RETCODE_DONE: return "DONE";
case TRADE_RETCODE_DONE_PARTIAL: return "DONE_PARTIAL";
case TRADE_RETCODE_ERROR: return "ERROR";
case TRADE_RETCODE_TIMEOUT: return "TIMEOUT";
case TRADE_RETCODE_INVALID: return "INVALID";
case TRADE_RETCODE_INVALID_VOLUME: return "INVALID_VOLUME";
case TRADE_RETCODE_INVALID_PRICE: return "INVALID_PRICE";
case TRADE_RETCODE_INVALID_STOPS: return "INVALID_STOPS";
case TRADE_RETCODE_TRADE_DISABLED: return "TRADE_DISABLED";
case TRADE_RETCODE_MARKET_CLOSED: return "MARKET_CLOSED";
case TRADE_RETCODE_NO_MONEY: return "NO_MONEY";
case TRADE_RETCODE_PRICE_CHANGED: return "PRICE_CHANGED";
case TRADE_RETCODE_PRICE_OFF: return "PRICE_OFF";
case TRADE_RETCODE_INVALID_EXPIRATION:return "INVALID_EXPIRATION";
case TRADE_RETCODE_ORDER_CHANGED: return "ORDER_CHANGED";
case TRADE_RETCODE_TOO_MANY_REQUESTS:return "TOO_MANY_REQUESTS";
case TRADE_RETCODE_NO_CHANGES: return "NO_CHANGES";
case TRADE_RETCODE_SERVER_DISABLES_AT:return "SERVER_DISABLES_AT";
case TRADE_RETCODE_CLIENT_DISABLES_AT:return "CLIENT_DISABLES_AT";
case TRADE_RETCODE_LOCKED: return "LOCKED";
case TRADE_RETCODE_FROZEN: return "FROZEN";
case TRADE_RETCODE_INVALID_FILL: return "INVALID_FILL";
case TRADE_RETCODE_CONNECTION: return "CONNECTION";
case TRADE_RETCODE_ONLY_REAL: return "ONLY_REAL";
case TRADE_RETCODE_LIMIT_ORDERS: return "LIMIT_ORDERS";
case TRADE_RETCODE_LIMIT_VOLUME: return "LIMIT_VOLUME";
default: return "UNKNOWN_RETCODE";
}
}この関数は、retcodeの分類を読みやすくするための補助です。実際の実装では、使用しているMT5ビルドやブローカーの返却内容に応じて、必要なコードを追加してください。
MqlTradeRequestをログに出す
OrderSend前には、MqlTradeRequestの中身をログに出します。これにより、EAが実際にどの条件で注文しようとしたのかを確認できます。
void LogTradeRequest(const string stage,
const MqlTradeRequest &request)
{
PrintFormat("[%s_REQUEST] action=%d symbol=%s type=%d volume=%.2f price=%.5f sl=%.5f tp=%.5f deviation=%d magic=%I64d type_filling=%d comment=%s",
stage,
request.action,
request.symbol,
request.type,
request.volume,
request.price,
request.sl,
request.tp,
request.deviation,
request.magic,
request.type_filling,
request.comment);
}stageには、ORDER_SEND_BEFORE、RETRY_BEFORE、CLOSE_BEFOREなど、どの段階のリクエストか分かる名前を入れると確認しやすくなります。
MqlTradeResultをログに出す
OrderSend後には、MqlTradeResultをログに出します。retcode、retcodeの文字列、deal、order、price、bid、ask、comment、GetLastErrorを同時に残すと、原因確認が進めやすくなります。
void LogTradeResult(const string stage,
const bool send_ok,
const MqlTradeResult &result,
const int last_error)
{
PrintFormat("[%s_RESULT] send_ok=%s retcode=%u retcode_text=%s deal=%I64u order=%I64u volume=%.2f price=%.5f bid=%.5f ask=%.5f comment=%s last_error=%d",
stage,
(send_ok ? "true" : "false"),
result.retcode,
TradeRetcodeToText(result.retcode),
result.deal,
result.order,
result.volume,
result.price,
result.bid,
result.ask,
result.comment,
last_error);
}OrderSendがfalseの場合でも、MqlTradeResultに情報が入ることがあります。send_okだけで分岐してログを省略せず、可能な限りresult全体を出してください。
OrderSend前後をまとめてログ化する例
次の例では、OrderSend前にrequestをログ化し、OrderSend後にresultとGetLastErrorをログ化します。実務では、この前段にスプレッド、ロット、証拠金、StopLevel、OrderCheckなどの確認を入れます。
bool SendTradeRequestWithResultLog(MqlTradeRequest &request,
MqlTradeResult &result)
{
ResetLastError();
LogTradeRequest("ORDER_SEND_BEFORE", request);
bool send_ok = OrderSend(request, result);
int last_error = GetLastError();
LogTradeResult("ORDER_SEND_AFTER", send_ok, result, last_error);
if(!send_ok)
{
PrintFormat("[ORDER_SEND_NG] reason=function_false retcode=%u retcode_text=%s last_error=%d comment=%s",
result.retcode,
TradeRetcodeToText(result.retcode),
last_error,
result.comment);
return false;
}
if(result.retcode != TRADE_RETCODE_DONE &&
result.retcode != TRADE_RETCODE_PLACED &&
result.retcode != TRADE_RETCODE_DONE_PARTIAL)
{
PrintFormat("[ORDER_SEND_NG] reason=retcode_not_success retcode=%u retcode_text=%s comment=%s",
result.retcode,
TradeRetcodeToText(result.retcode),
result.comment);
return false;
}
PrintFormat("[ORDER_SEND_OK] retcode=%u retcode_text=%s deal=%I64u order=%I64u price=%.5f volume=%.2f",
result.retcode,
TradeRetcodeToText(result.retcode),
result.deal,
result.order,
result.price,
result.volume);
return true;
}失敗時はretcode、last_error、requestをセットで読む
OrderSendが失敗した時は、retcodeだけ、GetLastErrorだけ、commentだけを単独で見ないようにします。retcodeは取引サーバー側の結果、last_errorは端末側や関数呼び出し側の情報、requestはEAが実際に送った条件です。3つを並べることで、EA側の入力ミスなのか、銘柄仕様や口座条件なのか、通信やサーバー応答なのかを分けやすくなります。
切り分け例
| ログ上の症状 | 最初に確認すること | 次に見る情報 |
|---|---|---|
| send_ok=false | GetLastErrorとrequest内容 | symbol、type、volume、price、sl、tp、filling |
| send_ok=trueだがretcodeが成功系でない | result.retcodeとcomment | 価格変更、証拠金、StopLevel、Filling Mode |
| INVALID_VOLUME | volume min / step / max | ロット正規化後の値、口座タイプ、銘柄仕様 |
| INVALID_STOPS | SL / TP方向とStopLevel | FreezeLevel、point、digits、現在価格との距離 |
| NO_MONEY | OrderCalcMarginとmargin_free | ロット、レバレッジ、口座通貨、銘柄条件 |
| INVALID_FILL | SYMBOL_FILLING_MODE | request.type_filling、銘柄ごとの約定方式 |
| MARKET_CLOSED / TRADE_DISABLED | 取引時間とtrade mode | サーバー時間、祝日、銘柄の取引停止状態 |
この切り分けは、売買判断を行うためではなく、EAの注文処理がどの段階で止まったかを確認するためのものです。ログを見てすぐにロットを上げる、条件を緩める、といった判断に直結させず、まずは原因の分類を行ってください。
この例では、OrderSendの戻り値がtrueでも、成功系retcodeでなければNGとして扱っています。実際の運用では、注文種別、約定方式、保留注文、部分約定、リトライ方針に合わせて成功判定を調整してください。
OrderCheckとOrderSend結果ログを分ける
OrderCheckは、MqlTradeRequestをサーバーへ送る前に確認する関数です。一方、OrderSendは実際に取引リクエストを送信する関数です。OrderCheckが成功しても、OrderSendが成功するとは限りません。
価格変動、取引時間、通信状態、Filling Mode、サーバー側の混雑、銘柄の取引状態などにより、OrderCheck後にOrderSendが失敗する場合があります。そのため、OrderCheckログとOrderSend結果ログは必ず分けてください。
| 段階 | 確認する内容 | ログ例 |
|---|---|---|
| OrderCheck前 | requestの内容が妥当か | ORDER_CHECK_BEFORE_REQUEST |
| OrderCheck後 | retcode、comment、margin、margin_free | ORDER_CHECK_RESULT |
| OrderSend前 | 最終的に送るrequestの内容 | ORDER_SEND_BEFORE_REQUEST |
| OrderSend後 | send_ok、retcode、deal、order、comment | ORDER_SEND_AFTER_RESULT |
| 反映確認 | ポジション・履歴・Magic Number | POSITION_SYNC / HISTORY_CHECK |
OrderCheckの詳細は、MQL5 OrderCheckの使い方も確認してください。
OrderCalcMargin / OrderCalcProfitとの接続
OrderSend結果ログだけでは、注文前に必要証拠金や想定損益をどのように見積もったかは分かりません。発注前チェックでは、OrderCalcMarginで必要証拠金、OrderCalcProfitでSL / TP到達時の想定損益を確認し、その後にOrderCheck、OrderSendへ進む流れが分かりやすくなります。
| 確認項目 | 使用する関数 | ログに残す内容 |
|---|---|---|
| 必要証拠金 | OrderCalcMargin | symbol、type、volume、price、margin |
| SL到達時の想定損失 | OrderCalcProfit | entry、sl、volume、profit、loss_abs |
| TP到達時の想定利益 | OrderCalcProfit | entry、tp、volume、profit |
| 注文リクエスト事前確認 | OrderCheck | retcode、comment、margin、margin_free |
| 注文送信結果 | OrderSend | send_ok、retcode、deal、order、comment |
必要証拠金と想定損益の確認は、MQL5 OrderCalcMargin / OrderCalcProfitの使い方で整理しています。
SymbolInfo系で銘柄仕様を確認する
OrderSend結果ログでINVALID_VOLUME、INVALID_STOPS、INVALID_FILLなどが出る場合、銘柄仕様の確認が必要になります。SymbolInfoDouble / SymbolInfoIntegerで、volume min、volume step、stops level、freeze level、filling mode、trade modeなどを確認してください。
| retcode・症状 | 確認する銘柄仕様 | 代表的な確認 |
|---|---|---|
| INVALID_VOLUME | SYMBOL_VOLUME_MIN / STEP / MAX | ロット正規化 |
| INVALID_STOPS | SYMBOL_TRADE_STOPS_LEVEL | SL / TP距離 |
| FROZEN | SYMBOL_TRADE_FREEZE_LEVEL | 注文変更・決済制限 |
| INVALID_FILL | SYMBOL_FILLING_MODE | type_fillingの対応 |
| TRADE_DISABLED | SYMBOL_TRADE_MODE | 銘柄取引可否 |
| 価格差の違和感 | SYMBOL_POINT / DIGITS / TICK_VALUE | point、digits、損益換算 |
| スプレッド超過 | SYMBOL_SPREAD、Bid / Ask | 発注見送り理由 |
銘柄仕様の確認は、MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方を確認してください。
CTradeを使う場合も結果ログを省略しない
CTradeクラスを使う場合でも、注文結果ログは必要です。CTradeのBuy、Sell、PositionCloseなどは便利ですが、内部でどのようなリクエストが作られ、どのretcodeが返ったかを確認しないと、注文エラーの原因を追いにくくなります。
CTradeでは、ResultRetcode、ResultRetcodeDescription、ResultDeal、ResultOrder、ResultPrice、ResultVolumeなどをログに出すと確認しやすくなります。
| CTradeで見る項目 | 確認する内容 | 用途 |
|---|---|---|
| ResultRetcode | 取引結果コード | OrderSend結果と同じく中心確認 |
| ResultRetcodeDescription | retcodeの説明 | ログを読みやすくする |
| ResultDeal | deal番号 | 約定確認 |
| ResultOrder | order番号 | 注文履歴確認 |
| ResultPrice | 処理価格 | 約定価格やサーバー価格確認 |
| ResultVolume | 処理数量 | 部分約定や数量確認 |
| CheckResultRetcode | OrderCheck相当の確認 | 発注前確認との接続 |
CTradeとMqlTradeRequestの違いは、MQL5 CTradeとMqlTradeRequestの違いも参考になります。
バックテストでOrderSend結果ログを見る
バックテストで注文が出ない場合、まずシグナルが出ているか、発注前チェックを通過しているか、OrderSendまで到達しているかを確認します。OrderSendログがない場合、どこで止まったかを判断しにくくなります。
| 症状 | 見るログ | 確認する内容 |
|---|---|---|
| 注文が出ない | SIGNAL / GATE / ORDER_SEND | OrderSendまで到達しているか |
| OrderSendに到達しない | FILTER / PRECHECK | スプレッド、ロット、時間条件、ポジション制限 |
| OrderSendがfalse | ORDER_SEND_AFTER_RESULT | last_error、retcode、comment |
| retcodeが成功系でない | TRADE_RETCODE分類 | 価格、証拠金、SL / TP、Filling Mode |
| 取引履歴に出ない | deal / order / history | 約定・注文番号の確認 |
| バックテストだけ動かない | Testerログ / Expertsログ | モデル、データ不足、初期化失敗 |
バックテスト結果の見方は、MT5でバックテスト結果を相談する前に整理することとも接続して確認してください。
デモ口座・リアル口座で結果が違う時の確認
デモ口座とリアル口座では、スプレッド、約定、取引時間、最小ロット、Filling Mode、銘柄名、手数料、約定拒否の扱いが異なる場合があります。同じEA、同じsetファイルでも、OrderSend結果が変わることがあります。
| 差が出る項目 | 確認する内容 | ログで見る場所 |
|---|---|---|
| スプレッド | デモとリアルのBid / Ask差 | request.price、result.bid、result.ask |
| 約定方式 | Filling Modeや約定拒否 | type_filling、retcode |
| 取引時間 | サーバー時間・休場時間 | MARKET_CLOSED、trade mode |
| 最小ロット | volume min / step | request.volume、INVALID_VOLUME |
| 証拠金条件 | レバレッジ、必要証拠金 | OrderCalcMargin、NO_MONEY |
| 銘柄名 | suffix、銘柄仕様差 | request.symbol、SymbolInfoログ |
| 通信状態 | 接続断、サーバー応答 | CONNECTION、TIMEOUT、last_error |
OrderSend結果ログの出力例
以下はログ出力の例です。実際の数値は、銘柄、口座、価格、ロット、ブローカー、相場環境によって変わります。
[ORDER_SEND_BEFORE_REQUEST] action=1 symbol=GOLD type=0 volume=0.10 price=2350.45000 sl=2345.45000 tp=2358.45000 deviation=20 magic=20260603 type_filling=1 comment=EAFC_ENTRY_BUY
[ORDER_SEND_AFTER_RESULT] send_ok=true retcode=10009 retcode_text=DONE deal=123456789 order=987654321 volume=0.10 price=2350.46000 bid=2350.43000 ask=2350.46000 comment=Done last_error=0
[ORDER_SEND_OK] retcode=10009 retcode_text=DONE deal=123456789 order=987654321 price=2350.46000 volume=0.10ログを見る時は、OrderSend前のrequest.priceと、OrderSend後のresult.price、result.bid、result.askを比較します。価格差、スプレッド、deviation、retcodeを合わせて見ると、約定まわりの原因を確認しやすくなります。
よくある失敗パターン
| 失敗パターン | 問題点 | 対策 |
|---|---|---|
| OrderSendの戻り値だけ見る | retcodeを見落として原因が分からない | result.retcodeとcommentを必ず出す |
| GetLastErrorだけ見る | サーバー側retcodeを見落とす | retcodeとlast_errorを分ける |
| requestをログに出さない | 何を送ったか分からない | OrderSend前にrequest全体を出す |
| resultを成功時だけ出す | 失敗時の原因が追えない | 成功・失敗に関係なくresultを出す |
| ロット正規化前の値を送る | INVALID_VOLUMEになりやすい | volume stepで正規化後に送る |
| SL / TP距離を確認しない | INVALID_STOPSになりやすい | StopLevelと価格方向を確認する |
| Filling Modeを固定する | 銘柄仕様と合わない場合がある | SYMBOL_FILLING_MODEを確認する |
| CTradeでログを省略する | 内部結果を追えない | CTradeのResult系を出す |
| リトライを無制限にする | TOO_MANY_REQUESTSや過剰注文になる | 回数と理由を制限する |
注文エラー調査で提出するとよい情報
OrderSend結果を相談する場合は、結果ログだけでなく、発注前の条件と再現情報をセットで整理してください。
| 整理する情報 | 確認内容 |
|---|---|
| EA名・バージョン | 対象EA、更新日、検証版か通常版か |
| 対象銘柄 | symbol、suffix、GOLD / XAUUSD表記 |
| 時間足・稼働条件 | チャート時間足、内部参照時間足、稼働時間 |
| setファイル | ロット、SL / TP、Magic Number、発注条件 |
| OrderCheckログ | retcode、comment、margin、margin_free |
| OrderSend前requestログ | action、symbol、type、volume、price、sl、tp、filling |
| OrderSend後resultログ | send_ok、retcode、deal、order、comment、last_error |
| SymbolInfoログ | point、digits、volume step、stops level、trade mode |
| Expertsログ・Journalログ | 発生時刻前後のログ |
| 再現条件 | バックテスト、デモ口座、リアル口座のどこで発生したか |
ログを共有する時に伏せる情報
調査依頼や問い合わせでログを共有する場合は、原因確認に必要な情報と、公開・共有すべきではない情報を分けます。OrderSendの原因調査では、retcode、comment、symbol、volume、price、sl、tp、filling、margin、timeなどは役立ちますが、口座番号、氏名、メールアドレス、パスワード、APIキー、Webhook URLなどは伏せてください。
| 分類 | 共有してよい情報の例 | 伏せる情報の例 |
|---|---|---|
| 注文条件 | symbol、type、volume、price、sl、tp、deviation | 口座番号、氏名、メールアドレス |
| 結果ログ | send_ok、retcode、comment、deal/orderの一部マスク | 完全な注文番号や個人を特定できる情報 |
| EA設定 | 検証に必要なパラメータ、Magic Numberの一部 | ライセンスキー、認証情報、Webhook URL |
| 環境情報 | バックテスト、デモ、リアルの区分、銘柄、時間帯 | サーバー接続情報やログイン情報 |
関連ページ
OrderSend結果ログは、発注前チェック、OrderCheck、証拠金計算、銘柄仕様、ログ確認と合わせて確認すると整理しやすくなります。
| 確認したい内容 | 関連ページ |
|---|---|
| OrderCheckの基本を確認する | MQL5 OrderCheckの使い方 |
| EAの発注前チェック全体を確認する | MQL5でEAの発注前チェックを作る考え方 |
| 必要証拠金と想定損益を確認する | MQL5 OrderCalcMargin / OrderCalcProfitの使い方 |
| 銘柄仕様と発注条件を確認する | MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方 |
| ログファースト設計を確認する | MQL5ログファースト設計を実コードで解説 |
| MT5ログの見方を確認する | MT5のログ確認方法|Experts・Journalの見方 |
| 不具合報告時の整理を確認する | 不具合報告・調査依頼について |
OrderSend結果ログの実務チェック表
- OrderSend前にMqlTradeRequestをログ出力している
- OrderSend後にMqlTradeResultをログ出力している
- OrderSendの戻り値とresult.retcodeを分けて確認している
- result.commentとGetLastErrorを両方出している
- deal、order、price、volumeを成功時に確認している
- retcodeを文字列化してログを読みやすくしている
- OrderCheckログとOrderSendログを分けている
- OrderCalcMarginで必要証拠金を確認している
- SymbolInfo系でvolume step、StopLevel、Filling Modeを確認している
- CTrade利用時もResultRetcodeなどを確認している
- バックテスト、デモ口座、リアル口座の差を分けて確認している
- 口座番号、パスワード、APIキー、Webhook URLなどをログ共有時に伏せている
よくある質問
OrderSendがtrueなら注文成功ですか?
必ずしもそうとは限りません。OrderSendの戻り値は送信処理の成否を示します。注文結果はMqlTradeResultのretcode、deal、order、commentを確認してください。
GetLastErrorだけ見れば原因は分かりますか?
GetLastErrorは端末側・関数呼び出し側のエラー確認に使いますが、取引サーバー側の結果はresult.retcodeとresult.commentを見る必要があります。両方をログに出してください。
CTradeを使っている場合もMqlTradeResultを見る必要がありますか?
必要です。CTradeを使う場合も、ResultRetcode、ResultRetcodeDescription、ResultDeal、ResultOrder、ResultPriceなどを確認してください。ラッパーを使っていても、注文結果の確認は省略しない方が安全です。
INVALID_STOPSが出る時は何を確認しますか?
SL / TP価格の方向、StopLevel、FreezeLevel、point、digits、現在価格との距離を確認します。SymbolInfoIntegerやSymbolInfoDoubleで銘柄仕様を取得し、ログに残してください。
NO_MONEYが出る時は何を確認しますか?
ロット、必要証拠金、余剰証拠金、レバレッジ、口座通貨、銘柄仕様を確認します。OrderCalcMarginとOrderCheckのmargin、margin_freeを合わせて見ると確認しやすくなります。
バックテストでは成功するのにリアル口座で失敗することはありますか?
あります。リアル口座では、スプレッド、約定、取引時間、Filling Mode、通信、銘柄仕様、ブローカー制限などが影響します。バックテスト、デモ、リアルでログを分けて確認してください。
ログを問い合わせで共有する時に注意することはありますか?
あります。retcode、comment、requestの主要項目、発生時刻、銘柄、バックテスト・デモ・リアルの区分は原因確認に役立ちます。一方で、口座番号、氏名、メールアドレス、パスワード、APIキー、Webhook URL、ライセンスキーなどは伏せてください。
まとめ
MQL5のOrderSend結果ログでは、MqlTradeRequest、MqlTradeResult、retcode、comment、deal、order、price、volume、GetLastErrorを分けて確認します。
OrderSendの戻り値だけでは、注文がどのように処理されたかを判断できません。送信前のrequest、送信後のresult、retcode分類、サーバーコメント、端末側エラーをセットでログ化してください。
EA開発では、SIGNAL、GATE、SPECIAL FILTERS、ORDER PRECHECK、ORDER SEND、ORDER RESULTの責務を分けることで、注文が出ない原因、発注エラー、約定差、口座・銘柄仕様差を追いやすくなります。
OrderCheck、OrderCalcMargin、SymbolInfo系確認と合わせてOrderSend結果ログを整備すると、バックテスト、デモ口座、リアル口座での差分確認や、問い合わせ前のログ整理が進めやすくなります。
