開発実務ノート

MQL5 OrderSend結果ログを実コードで解説|MqlTradeRequest・MqlTradeResult・TRADE_RETCODE確認

EAファンクラブ

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結果ログで確認する項目
  • 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の判定ミスなのか、リクエスト構築ミスなのか、サーバー側の拒否なのか、口座・銘柄仕様の問題なのかを追いやすくなります。

確認層確認する内容主なログ
SIGNALBUY / SELLの候補が出たかSIGNAL_OK / SIGNAL_NG
GATE稼働時間、許可状態、最大ポジション数などGATE_PASS / GATE_BLOCK
SPECIAL FILTERSスプレッド、指標、外部停止、ボラティリティなどFILTER_PASS / FILTER_BLOCK
ORDER PRECHECKロット、証拠金、SL / TP距離、OrderCheckORDER_CHECK / PRECHECK_NG
ORDER SENDMqlTradeRequestを送信した結果ORDER_SEND_OK / ORDER_SEND_NG
ORDER RESULTretcode、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内容、銘柄仕様、口座条件、サーバー応答を確認する流れになります。

確認順見るログ切り分けること
1SIGNAL / FILTER / GATE注文処理へ進む条件を満たしたか
2ORDER_CHECK_BEFORE送信予定のsymbol、type、volume、price、sl、tpが妥当か
3ORDER_CHECK_RESULTmargin、margin_free、retcode、commentで事前確認の結果を見る
4ORDER_SEND_BEFORE最終的にOrderSendへ渡したMqlTradeRequestを確認する
5ORDER_SEND_AFTERsend_ok、retcode、deal、order、comment、last_errorを分けて確認する
6POSITION / HISTORY約定、未約定注文、ポジション反映、履歴を確認する

MqlTradeRequestで送信前の条件を記録する

MqlTradeRequestは、OrderSendに渡す注文リクエスト構造体です。注文方向、銘柄、ロット、価格、SL、TP、Magic Number、コメント、Filling Modeなど、EAがサーバーへ送ろうとした内容が入ります。

注文エラー調査では、MqlTradeRequestの値が想定どおりかを確認します。EA側のロット正規化が漏れていないか、SL / TP価格が銘柄のStopLevelに合っているか、注文タイプと価格が一致しているか、Magic Numberが正しいかを確認してください。

request項目確認する内容よくある問題
actionTRADE_ACTION_DEAL、TRADE_ACTION_PENDINGなど成行注文と指値注文のaction不一致
symbol対象銘柄名suffix付き銘柄、GOLD / XAUUSD表記差
volume発注ロットvolume min / step / maxに合っていない
typeORDER_TYPE_BUY、ORDER_TYPE_SELLなどBUY / SELL方向の取り違え
price発注価格BUYでBid、SELLでAskを使うなどの方向ミス
sl損切り価格StopLevel違反、価格方向の誤り
tp利確価格StopLevel違反、価格方向の誤り
deviation許容スリッページ値が小さすぎて価格変更に弱い
magicMagic Number複数EAや手動取引との識別ができない
type_fillingFilling Mode銘柄仕様と不一致で注文拒否
comment注文コメントログ上で注文意図を追えない

MqlTradeResultで送信後の結果を記録する

MqlTradeResultは、OrderSend実行後にサーバー側から返る結果を受け取る構造体です。ここには、retcode、deal、order、volume、price、bid、ask、commentなどが入ります。

OrderSendの戻り値がtrueでも、result.retcodeを確認しなければ、どのような取引結果になったかを判断できません。OrderSendの戻り値、result.retcode、result.comment、GetLastErrorを混同しないようにしてください。

result項目確認する内容用途
retcodeTRADE_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_PARTIALdeal、order、volume、priceを確認する
価格系REQUOTE、PRICE_CHANGED、PRICE_OFFBid / Ask、deviation、約定方式を確認する
ロット系INVALID_VOLUMEvolume min / step / max、ロット正規化を確認する
SL / TP系INVALID_STOPSStopLevel、FreezeLevel、価格方向を確認する
証拠金系NO_MONEYOrderCalcMargin、margin_free、ロットを確認する
取引許可系TRADE_DISABLED、MARKET_CLOSED銘柄trade mode、取引時間、自動売買許可を確認する
Filling系INVALID_FILLSYMBOL_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=falseGetLastErrorとrequest内容symbol、type、volume、price、sl、tp、filling
send_ok=trueだがretcodeが成功系でないresult.retcodeとcomment価格変更、証拠金、StopLevel、Filling Mode
INVALID_VOLUMEvolume min / step / maxロット正規化後の値、口座タイプ、銘柄仕様
INVALID_STOPSSL / TP方向とStopLevelFreezeLevel、point、digits、現在価格との距離
NO_MONEYOrderCalcMarginとmargin_freeロット、レバレッジ、口座通貨、銘柄条件
INVALID_FILLSYMBOL_FILLING_MODErequest.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_freeORDER_CHECK_RESULT
OrderSend前最終的に送るrequestの内容ORDER_SEND_BEFORE_REQUEST
OrderSend後send_ok、retcode、deal、order、commentORDER_SEND_AFTER_RESULT
反映確認ポジション・履歴・Magic NumberPOSITION_SYNC / HISTORY_CHECK

OrderCheckの詳細は、MQL5 OrderCheckの使い方も確認してください。

OrderCalcMargin / OrderCalcProfitとの接続

OrderSend結果ログだけでは、注文前に必要証拠金や想定損益をどのように見積もったかは分かりません。発注前チェックでは、OrderCalcMarginで必要証拠金、OrderCalcProfitでSL / TP到達時の想定損益を確認し、その後にOrderCheck、OrderSendへ進む流れが分かりやすくなります。

確認項目使用する関数ログに残す内容
必要証拠金OrderCalcMarginsymbol、type、volume、price、margin
SL到達時の想定損失OrderCalcProfitentry、sl、volume、profit、loss_abs
TP到達時の想定利益OrderCalcProfitentry、tp、volume、profit
注文リクエスト事前確認OrderCheckretcode、comment、margin、margin_free
注文送信結果OrderSendsend_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_VOLUMESYMBOL_VOLUME_MIN / STEP / MAXロット正規化
INVALID_STOPSSYMBOL_TRADE_STOPS_LEVELSL / TP距離
FROZENSYMBOL_TRADE_FREEZE_LEVEL注文変更・決済制限
INVALID_FILLSYMBOL_FILLING_MODEtype_fillingの対応
TRADE_DISABLEDSYMBOL_TRADE_MODE銘柄取引可否
価格差の違和感SYMBOL_POINT / DIGITS / TICK_VALUEpoint、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結果と同じく中心確認
ResultRetcodeDescriptionretcodeの説明ログを読みやすくする
ResultDealdeal番号約定確認
ResultOrderorder番号注文履歴確認
ResultPrice処理価格約定価格やサーバー価格確認
ResultVolume処理数量部分約定や数量確認
CheckResultRetcodeOrderCheck相当の確認発注前確認との接続

CTradeとMqlTradeRequestの違いは、MQL5 CTradeとMqlTradeRequestの違いも参考になります。

バックテストでOrderSend結果ログを見る

バックテストで注文が出ない場合、まずシグナルが出ているか、発注前チェックを通過しているか、OrderSendまで到達しているかを確認します。OrderSendログがない場合、どこで止まったかを判断しにくくなります。

症状見るログ確認する内容
注文が出ないSIGNAL / GATE / ORDER_SENDOrderSendまで到達しているか
OrderSendに到達しないFILTER / PRECHECKスプレッド、ロット、時間条件、ポジション制限
OrderSendがfalseORDER_SEND_AFTER_RESULTlast_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 / steprequest.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結果ログを整備すると、バックテスト、デモ口座、リアル口座での差分確認や、問い合わせ前のログ整理が進めやすくなります。

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