技術辞典

MQL5 OrderCheckの使い方|注文前チェック・retcode・証拠金確認

EAファンクラブ

MQL5でEAから注文を送る前には、OrderSendやCTradeだけを見るのではなく、注文リクエストが通る可能性があるかを事前に確認することが重要です。ロット、証拠金、SL/TP距離、銘柄仕様、取引可能状態などに問題があると、シグナルが出ていても注文は失敗します。

OrderCheckは、MqlTradeRequestで作成した注文リクエストについて、注文前に証拠金やリクエスト内容を確認するための関数です。OrderSendを実行する前にOrderCheckを挟むことで、証拠金不足、ロット不正、SL/TP距離不正、銘柄仕様との不一致などを早い段階で切り分けやすくなります。

この記事では、MQL5のOrderCheckの役割、MqlTradeRequestとMqlTradeCheckResultの見方、OrderSend前に確認すべき項目、StopLevel、FreezeLevel、VolumeStep、証拠金、retcode、ログ設計、EA開発時の発注前チェック構造を整理します。

なお、この記事はMT5 / MQL5の注文前チェック、EA開発、ログ確認、発注失敗の切り分けを目的とした技術記事です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。

この記事で確認すること

  • OrderCheckの役割
  • OrderCheckとOrderSendの違い
  • MqlTradeRequestで確認する項目
  • MqlTradeCheckResultで確認する項目
  • ロット、証拠金、SL/TP距離、StopLevel、FreezeLevelの確認
  • VolumeStep、最小ロット、最大ロットの確認
  • retcodeとcommentの読み方
  • OrderCheck後にOrderSendを実行する時の注意点
  • 注文前チェックのログ設計
  • EAが注文できない時の切り分け

OrderCheckとは

OrderCheckは、MqlTradeRequestで作成した注文リクエストを、実際にOrderSendで送信する前に確認するための関数です。注文が成立することを保証する関数ではありませんが、証拠金やリクエスト内容に明らかな問題がないかを事前に確認できます。

EA開発では、シグナルが出たらすぐにOrderSendを実行するのではなく、発注前チェックを挟む設計が重要です。OrderCheckを使うことで、注文失敗時の原因を「シグナル不成立」「フィルター停止」「注文前チェックNG」「OrderSend失敗」に分けやすくなります。

ただし、OrderCheckが問題なしでも、その後の価格変動、スプレッド変化、サーバー状態、約定方式、取引時間の変化によってOrderSendが失敗することはあります。OrderCheckは、OrderSendの代わりではなく、OrderSend前の確認工程として扱います。

項目内容注意点
OrderCheck注文リクエストを事前確認する関数です。注文成功を保証するものではありません。
OrderSend実際に注文リクエストを送信する関数です。retcodeやGetLastErrorで結果を確認します。
MqlTradeRequest注文方向、銘柄、ロット、価格、SL/TPなどの要求内容です。OrderCheckとOrderSendの両方で重要です。
MqlTradeCheckResultOrderCheckの確認結果を受け取る構造体です。retcode、margin、commentなどを確認します。
MqlTradeResultOrderSendの送信結果を受け取る構造体です。OrderCheck結果とは別に確認します。

OrderCheckとOrderSendの違い

OrderCheckとOrderSendは、どちらも注文処理に関係しますが、役割が異なります。OrderCheckは注文前の確認であり、OrderSendは実際の注文送信です。OrderCheckで問題がない場合でも、OrderSend時点で価格や環境が変われば、注文が拒否されることがあります。

EAが注文できない時に、OrderSendの結果だけを見ると、注文前の条件不備と注文送信後の失敗を混同しやすくなります。OrderCheckを使うと、発注前にどの条件で問題が出ているのかを確認しやすくなります。

処理役割見るべき結果
シグナル判定BUY / SELL候補を判断します。signal、条件値、判定足、見送り理由。
フィルタースプレッド、時間帯、最大ポジション数などを確認します。filter_block、現在値、許容値。
OrderCheck注文リクエストと証拠金状態を事前確認します。check.retcode、margin、comment。
OrderSend注文リクエストを取引サーバーへ送信します。result.retcode、order、deal、comment。
取引イベント確認注文、約定、履歴、ポジション変化を確認します。OnTradeTransaction、History、Position。

MqlTradeRequestで確認する項目

OrderCheckを使うには、まずMqlTradeRequestに注文要求を設定します。ここに入れる値が不正であれば、OrderCheckの時点で失敗したり、OrderSend時点で拒否されたりします。

特に確認すべきなのは、action、symbol、volume、type、price、sl、tp、deviation、magic、type_fillingです。これらの値は銘柄仕様、口座仕様、ブローカー仕様に影響されます。

フィールド内容確認ポイント
action取引アクションです。成行、指値、決済など目的に合っているか確認します。
symbol注文対象の銘柄です。チャート銘柄と対象銘柄が一致しているか確認します。
volume注文ロットです。最小ロット、最大ロット、VolumeStepに合っているか確認します。
typeBUY、SELLなどの注文種別です。シグナル方向と注文方向が一致しているか確認します。
price注文価格です。BUYはAsk、SELLはBidを使う場面が基本です。
sl損切り価格です。StopLevelやFreezeLevelとの距離を確認します。
tp利確価格です。銘柄のdigits、point、StopLevelを考慮します。
magicEA識別用のMagic Numberです。他EAや手動ポジションと混同しないようにします。
type_filling約定方式に関する指定です。銘柄やブローカーで許可される方式を確認します。

MqlTradeCheckResultで確認する項目

OrderCheckの結果は、MqlTradeCheckResultで受け取ります。ここでは、retcode、balance、equity、profit、margin、margin_free、margin_level、commentなどを確認できます。

実務では、check.retcodeとcheck.commentだけでなく、必要証拠金や余剰証拠金もログに残すと原因追跡がしやすくなります。注文前チェックで止める場合は、「なぜ止めたのか」をログに出してください。

フィールド内容ログで確認したいこと
retcodeOrderCheckの確認結果コードです。チェックが通ったか、どの理由で失敗したか。
balance残高情報です。検証時の口座状態確認に使います。
equity有効証拠金です。含み損益込みの状態を確認します。
profit見込み損益に関係する値です。注文種別や口座状態との整合を確認します。
margin必要証拠金です。注文予定ロットで必要な証拠金を確認します。
margin_free余剰証拠金です。証拠金不足を切り分ける時に重要です。
margin_level証拠金維持率に関係する値です。リスク確認や停止条件と組み合わせます。
comment確認結果のコメントです。retcodeと併せてログに残します。

OrderCheckの基本コード例

以下は、OrderCheckの流れを確認するための簡略例です。実際のEAでは、この前にシグナル判定、フィルター、ロット補正、SL/TP距離確認、最大ポジション数確認などを行います。

bool CheckBuyOrder(double lots)
{
   MqlTradeRequest request;
   MqlTradeCheckResult check;

   ZeroMemory(request);
   ZeroMemory(check);

   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = lots;
   request.type   = ORDER_TYPE_BUY;
   request.price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   request.magic  = 123456;

   bool ok = OrderCheck(request, check);

   PrintFormat("ORDER_CHECK ok=%s retcode=%d margin=%.2f free=%.2f level=%.2f comment=%s",
               ok ? "true" : "false",
               check.retcode,
               check.margin,
               check.margin_free,
               check.margin_level,
               check.comment);

   return ok;
}

このコードはOrderCheckの基本的な流れを示すものです。実際には、OrderCheckの戻り値だけでなく、check.retcode、check.comment、証拠金、ロット、価格、SL/TP距離を確認します。また、OrderCheckが通った後でも、OrderSend時点で失敗する可能性があるため、OrderSend側の結果確認も必要です。

OrderCheck前にロットを確認する

OrderCheckを行う前に、注文ロットが銘柄仕様に合っているか確認します。MQL5では、銘柄ごとに最小ロット、最大ロット、ロットステップが異なります。たとえば、0.01単位で注文できる銘柄もあれば、0.10単位でしか注文できない銘柄もあります。

ロットがVolumeStepに合っていない場合、OrderCheckやOrderSendで失敗することがあります。EA側でロット計算を行う場合は、計算後のロットをそのまま使うのではなく、銘柄仕様に合わせて丸める処理が必要です。

確認項目MQL5で見る値注意点
最小ロットSYMBOL_VOLUME_MINこれ未満の注文は不正になります。
最大ロットSYMBOL_VOLUME_MAXこれを超える注文は不正になります。
ロットステップSYMBOL_VOLUME_STEPステップに合わないロットは失敗要因になります。
要求ロットEA側で計算したロット計算後に銘柄仕様へ合わせます。
丸め後ロット発注に使うロットログに残すと原因追跡しやすくなります。

StopLevelとFreezeLevelを確認する

SL/TPを設定するEAでは、StopLevelとFreezeLevelを確認する必要があります。SLやTPが現在価格に近すぎる場合、注文が拒否されたり、変更に失敗したりすることがあります。

OrderCheckを使う前に、SL/TPの価格が銘柄のdigits、point、StopLevel、FreezeLevelに合っているかを確認してください。特にXAUUSDや指数など、pointやdigitsの扱いを間違えやすい銘柄では注意が必要です。

項目意味確認ポイント
StopLevelSL/TPや指値を置く時に必要な最小距離に関係します。SL/TPが近すぎないか確認します。
FreezeLevel注文変更や決済操作が制限される距離に関係します。変更処理やトレーリングで影響します。
digits銘柄の小数桁です。価格丸めに使います。
point最小価格単位です。距離計算に使います。
SL距離現在価格からSLまでの距離です。StopLevelを満たすか確認します。
TP距離現在価格からTPまでの距離です。StopLevelを満たすか確認します。

証拠金を確認する

OrderCheckでは、注文予定ロットに対して必要証拠金がどの程度か、余剰証拠金が十分かを確認できます。証拠金不足は、EAが注文できない代表的な原因の1つです。

EAでロットを自動計算する場合、残高やリスク率だけでロットを決めると、実際の銘柄仕様やレバレッジ条件に合わないことがあります。OrderCheckの結果として必要証拠金と余剰証拠金をログに残しておくと、注文失敗の切り分けに役立ちます。

PrintFormat("MARGIN_CHECK retcode=%d margin=%.2f margin_free=%.2f margin_level=%.2f comment=%s",
            check.retcode,
            check.margin,
            check.margin_free,
            check.margin_level,
            check.comment);

証拠金確認では、単に「注文できない」と出すのではなく、必要証拠金、余剰証拠金、ロット、銘柄、口座通貨、retcodeをセットで確認できるようにします。

retcodeとcommentをログに残す

OrderCheckの結果を確認する時は、retcodeとcommentを必ずログに残します。retcodeは確認結果を判断するための重要な値です。commentには、ブローカーやサーバー側の補足情報が含まれることがあります。

OrderCheckのログが「OK」「NG」だけでは、あとから原因を追えません。どのリクエストを確認したのか、どのretcodeが返ったのか、証拠金やロットがどうだったのかを残してください。

ログ項目残す理由
symbol対象銘柄を特定するため。symbol=XAUUSD
typeBUY / SELLを確認するため。type=BUY
volume注文ロットを確認するため。volume=0.10
price注文予定価格を確認するため。price=2350.12
sl / tpSL/TP距離を確認するため。sl=2345.12 tp=2360.12
retcodeOrderCheck結果を確認するため。retcode=10009
margin必要証拠金を確認するため。margin=1250.00
comment補足情報を確認するため。comment=Request checked

OrderCheck後にOrderSendを実行する時の注意

OrderCheckが通った場合でも、すぐに安心してはいけません。OrderCheckとOrderSendの間に価格やスプレッドが変わることがあります。特に短期売買やスプレッドが広がりやすい時間帯では、OrderCheck時点では問題がなくても、OrderSend時点で失敗することがあります。

OrderCheck後にOrderSendを実行する場合は、OrderSend側でもresult.retcode、GetLastError、注文番号、Deal番号、commentを確認します。OrderCheckのretcodeとOrderSendのretcodeを分けてログに残すと、どの段階で問題が起きたかを切り分けやすくなります。

bool check_ok = OrderCheck(request, check);

PrintFormat("ORDER_CHECK ok=%s retcode=%d margin=%.2f free=%.2f comment=%s",
            check_ok ? "true" : "false",
            check.retcode,
            check.margin,
            check.margin_free,
            check.comment);

if(!check_ok)
   return false;

MqlTradeResult result;
ZeroMemory(result);

bool send_ok = OrderSend(request, result);

PrintFormat("ORDER_SEND ok=%s retcode=%d order=%I64u deal=%I64u last_error=%d comment=%s",
            send_ok ? "true" : "false",
            result.retcode,
            result.order,
            result.deal,
            GetLastError(),
            result.comment);

よくあるOrderCheck失敗の原因

OrderCheckで失敗する場合、リクエスト内容、ロット、証拠金、価格、SL/TP、銘柄仕様、取引可否などを確認します。原因を1つに決めつけず、項目ごとにログを確認してください。

症状確認項目対応方針
ロット不正volume min / max / step。銘柄仕様に合わせてロットを補正します。
証拠金不足margin、margin_free、volume。ロットを下げる、証拠金条件を見直す。
SL/TP不正StopLevel、FreezeLevel、digits、point。SL/TP距離を広げる、価格丸めを確認する。
価格不正Bid / Ask、注文方向、現在価格。BUYとSELLで使う価格を確認する。
取引不可trade mode、口座状態、取引時間。銘柄や口座の取引可否を確認する。
注文種別不一致action、type、type_filling。銘柄で許可される注文方式を確認する。
Magic管理不足magic、symbol、position count。対象EAのポジションだけを見る。

SymbolInfoと組み合わせて確認する

OrderCheckだけでは、EA側で事前に確認すべきすべての情報を整理できるわけではありません。ロット、StopLevel、FreezeLevel、digits、point、trade modeなどは、SymbolInfoDoubleやSymbolInfoIntegerを使って取得し、OrderCheck前に確認しておくと安全です。

特に複数銘柄EAや、XAUUSD、指数、仮想通貨CFDなど銘柄仕様が異なる環境では、symbolごとに仕様を取得してログに出すことが重要です。固定値で判断すると、別銘柄で注文失敗する可能性があります。

確認値用途ログに残す理由
SYMBOL_VOLUME_MIN最小ロット確認。ロット不正を防ぐため。
SYMBOL_VOLUME_MAX最大ロット確認。過大ロットを防ぐため。
SYMBOL_VOLUME_STEPロットステップ確認。端数ロットによる失敗を防ぐため。
SYMBOL_TRADE_STOPS_LEVELStopLevel確認。SL/TP距離不正を防ぐため。
SYMBOL_TRADE_FREEZE_LEVELFreezeLevel確認。注文変更や決済補助で確認するため。
SYMBOL_DIGITS小数桁確認。価格丸めに使うため。
SYMBOL_POINTpoint確認。距離計算に使うため。
SYMBOL_TRADE_MODE取引可否確認。銘柄が取引可能か確認するため。

発注前チェックを関数化する

EA開発では、OrderCheckをOnTick内に直接書き込むよりも、発注前チェック用の関数として分けると確認しやすくなります。シグナル判定、フィルター、ロット補正、OrderCheck、OrderSendを分けることで、不具合時の原因を追いやすくなります。

たとえば、CanEntry、BuildTradeRequest、CheckTradeRequest、SendTradeRequestのように分けると、各工程のログを整理しやすくなります。OrderCheckで止まった場合はCHECK_FAIL、OrderSendで止まった場合はSEND_FAILとしてログを分けます。

関数例役割ログ例
CheckSignal()BUY / SELL候補を判定します。SIGNAL side=BUY reason=MA_CROSS
CheckEntryFilter()スプレッドや時間帯を確認します。FILTER_BLOCK reason=SPREAD
NormalizeLots()銘柄仕様に合わせてロットを補正します。LOT_NORMALIZED raw=0.037 lot=0.03
BuildRequest()MqlTradeRequestを作成します。REQUEST_BUILD side=BUY lot=0.10
CheckRequest()OrderCheckを実行します。CHECK_OK retcode=10009
SendRequest()OrderSendを実行します。SEND_OK retcode=10009

EAが注文できない時の切り分け

EAが注文できない時は、OrderCheckだけを疑うのではなく、処理の流れを順番に確認します。シグナルが出ていない、フィルターで止まっている、OrderCheckで止まっている、OrderSendで失敗している、取引サーバー側で拒否されている、というように段階を分けます。

OrderCheckを使っているEAでも、ログが不足していると原因は追えません。各段階で、どの条件で止まったのか、どの値で注文しようとしたのかを残してください。

段階確認することログ名の例
起動OnInitが成功しているか。INIT_OK / INIT_FAIL
シグナルBUY / SELL候補が出ているか。SIGNAL_BUY / SIGNAL_NONE
フィルタースプレッドや時間帯で止まっていないか。FILTER_BLOCK
リクエスト作成MqlTradeRequestの値が正しいか。REQUEST_BUILD
OrderCheck注文前チェックが通るか。ORDER_CHECK_OK / ORDER_CHECK_FAIL
OrderSend注文送信が成功するか。ORDER_SEND_OK / ORDER_SEND_FAIL
約定確認注文後のDealやPositionを確認する。TRADE_TRANSACTION

バックテストでOrderCheckを確認する

OrderCheckを使うEAは、バックテストでもログを確認します。注文が出ない場合、シグナルが出ていないのか、OrderCheckで止まっているのか、OrderSendで失敗しているのかをログで分けてください。

バックテストでは、銘柄、時間足、期間、スプレッド、setファイル、初期証拠金、モデルを記録します。ロットや証拠金に関係する不具合は、初期証拠金やレバレッジ、銘柄仕様によって結果が変わることがあります。

  • EA名とバージョンを記録する
  • 使用したsetファイルを保存する
  • 銘柄、時間足、期間を記録する
  • 初期証拠金とスプレッド条件を記録する
  • OrderCheckのretcodeとcommentを確認する
  • 必要証拠金と余剰証拠金を確認する
  • OrderSendのretcodeも別に確認する
  • バックテスト結果を将来成績保証として扱わない

OrderCheck利用時の実務チェック表

  • OrderSend前にMqlTradeRequestを正しく作成している
  • OrderCheckの戻り値だけでなくcheck.retcodeを確認している
  • check.commentをログに残している
  • 注文予定ロットがVolumeStepに合っている
  • 最小ロット・最大ロットを確認している
  • SL/TP距離がStopLevelを満たしている
  • FreezeLevelの影響を確認している
  • 必要証拠金と余剰証拠金をログに出している
  • OrderCheckとOrderSendのretcodeを分けて確認している
  • BUYとSELLで価格の扱いを混同していない
  • Magic Numberと対象ポジション範囲を確認している
  • バックテスト条件とsetファイルを保存している

OrderCheckをどこに置くか

EAの発注処理では、OrderCheckを単独で呼ぶだけではなく、signal判定、filter確認、risk確認、request生成、OrderCheck、OrderSend、結果ログの順に分けて配置すると原因を追いやすくなります。

特に、注文が出ない不具合では「シグナルが出ていない」のか、「スプレッドや時間条件で止まっている」のか、「OrderCheckで止まっている」のか、「OrderSendで拒否されている」のかを分けることが重要です。OrderCheckは、発注処理全体の中ではexecution直前の確認工程として扱います。

工程主な確認内容OrderCheckとの関係
signalBUY / SELL候補が出ているかOrderCheckより前の判定です。
filterスプレッド、時間帯、曜日、最大ポジション数発注を見送る条件を先に確認します。
riskロット、最大損失、証拠金、保有数request.volumeやSL/TPの前提になります。
request生成MqlTradeRequestにaction、symbol、volume、type、price、sl、tpを設定OrderCheckに渡す対象を作ります。
OrderCheck注文前の証拠金やリクエスト内容を確認発注前チェックの中心です。
OrderSend取引サーバーへ注文を送信OrderCheck通過後でも結果確認が必要です。
result確認retcode、order、deal、comment、GetLastErrorOrderCheckとは別にログ化します。

OrderCheckを使っても、filterやriskの責務をすべてOrderCheckへ押し込むべきではありません。OrderCheckはMqlTradeRequestの妥当性や証拠金状態を見る工程であり、EA独自の取引禁止条件、時間帯制限、最大ポジション数、外部制御、通知可否などは別工程で確認します。

OrderCheckのログ設計

OrderCheckを使う目的は、注文前に失敗要因を見つけることだけではありません。あとからログで原因を追えるようにすることも重要です。OrderCheckの結果を「OK」「NG」だけで出すと、なぜ止まったのかが分からなくなります。

最低限、symbol、type、volume、price、sl、tp、retcode、margin、margin_free、margin_level、commentを同じログ行または近いログ行に残すと、バックテストや問い合わせ対応で確認しやすくなります。

ログ項目残す理由
symbol対象銘柄を特定するためsymbol=XAUUSD
typeBUY / SELL方向を確認するためtype=BUY
volume注文予定ロットを確認するためvolume=0.10
price確認時点の価格を追うためprice=2350.12
sl / tpStopLevel違反や価格方向ミスを見るためsl=2347.12 tp=2356.12
retcodeOrderCheckの判定結果を分類するためcheck.retcode=...
margin必要証拠金を確認するためmargin=120.50
margin_free余剰証拠金を確認するためfree=8500.00
commentサーバー側の補足を残すためcomment=...

ログの粒度をそろえておくと、バックテストで注文が出ない時、リアル運用で注文が失敗した時、setファイル変更後に結果が変わった時に、原因を比較しやすくなります。

OrderCheckで確認しきれないこと

OrderCheckは便利ですが、EAの注文処理に関するすべてを保証するものではありません。OrderCheckが通っても、OrderSend時点で価格が変わる、スプレッドが広がる、取引時間が変わる、サーバー側で拒否されるなどの理由で注文に失敗する場合があります。

そのため、OrderCheckの結果だけで「注文成功」と判断せず、OrderSend後のMqlTradeResult、OnTradeTransaction、ポジション確認、履歴確認まで含めて設計します。

OrderCheckで分かりやすいことOrderCheckだけでは不十分なこと追加確認
必要証拠金約定時点の価格変動OrderSend結果
ロット不正の一部ブローカー側の瞬間的な拒否retcodeとcomment
SL/TP距離の問題送信直前のスプレッド拡大Bid / Ask再取得
リクエスト内容の不整合通信・サーバー応答の問題GetLastErrorとJournal
証拠金余力約定後のポジション状態PositionSelectと履歴確認

OrderCheckは「OrderSend前に確認する工程」として使い、OrderSend後の結果確認と分けてログに残してください。この分離ができていると、発注失敗時に修正すべき場所を特定しやすくなります。

CTradeを使う場合のOrderCheckの考え方

CTradeのBuyやSellを使う場合、内部的には注文リクエストを組み立てて送信します。そのため、CTradeを使っているからといって、発注前チェックが不要になるわけではありません。

CTradeは記述を簡潔にできる一方で、MqlTradeRequestを直接組み立てる場合よりも、発注前の中間状態を自分でログ化しにくいことがあります。重要なEAや検証用EAでは、CTradeの前段でロット、銘柄仕様、SL/TP距離、証拠金、スプレッドを確認しておくと安全です。

実装方法特徴OrderCheckとの関係
CTradeBuy / Sellなどで簡潔に書ける前段で独自チェックを用意すると原因追跡しやすい
MqlTradeRequest + OrderSendrequest内容を細かく制御できるOrderCheckと同じrequestを使いやすい
検証用EAログや診断を多く出すOrderCheck結果を詳細に残すとよい
UserLive用EA表示やログ量を抑えることがある必要最低限の安全ログは残す

EAファンクラブでは、OrderCheckを単独の関数説明としてではなく、CTrade、MqlTradeRequest、OrderSend、SymbolInfo、OrderCalcMargin、ログ確認とつながる発注前チェックの一部として扱います。

OrderCalcMarginとの使い分け

必要証拠金を事前に確認したい場合、OrderCheckだけでなくOrderCalcMarginも候補になります。OrderCalcMarginは、指定した注文タイプ、銘柄、ロット、価格に対する必要証拠金を計算するための関数です。

OrderCheckはMqlTradeRequest全体に対する確認であり、OrderCalcMarginは証拠金計算に特化した確認です。EAの設計では、ロット計算段階でOrderCalcMarginを使い、最終的なrequest確認でOrderCheckを使う、という分け方ができます。

関数主な用途使う場面
OrderCalcMargin必要証拠金の概算確認ロット計算、証拠金余力確認
OrderCalcProfit指定価格差の想定損益確認SL/TP幅や想定損益の確認
OrderCheck注文リクエスト全体の事前確認OrderSend直前のrequest確認
OrderSend実際の注文送信発注処理本体

OrderCalcMarginとOrderCheckは競合するものではありません。証拠金計算と発注前request確認を分けて使うと、ロット計算の問題と注文リクエストの問題を分離できます。

よくあるretcodeの切り分け

OrderCheckやOrderSendで確認するretcodeは、注文処理の結果を切り分けるための重要な情報です。retcodeを数値だけで保存すると後から読みづらいため、可能であれば意味が分かるログ名やcommentも合わせて残します。

retcodeの値は環境や取引条件によって異なるため、記事内で特定の値だけを丸暗記するよりも、どの分類の問題かを見分けることが重要です。

分類代表的な確認内容次に見る場所
ロット不正最小ロット、最大ロット、VolumeStepSymbolInfoDouble、input、ロット丸め処理
証拠金不足必要証拠金、余剰証拠金、レバレッジOrderCheck、OrderCalcMargin、口座情報
SL/TP不正StopLevel、FreezeLevel、価格方向、digitsSymbolInfoInteger、Bid / Ask、SL/TP計算
取引不可銘柄取引許可、取引時間、口座状態SymbolInfo、AccountInfo、Journal
価格変動価格再取得、deviation、スプレッドOrderSend直前のBid / Askログ
サーバー側拒否ブローカー条件、type_filling、約定方式MqlTradeResult、comment、Journal

retcodeは、OrderCheckだけでなくOrderSendでも確認します。両方を同じ名前のログにまとめると混同しやすいため、ORDER_CHECKORDER_SEND を分けて出すと確認しやすくなります。

OrderCheck記事としての役割分担

このページでは、OrderCheckの基本的な役割、MqlTradeRequest、MqlTradeCheckResult、retcode、comment、OrderSend前確認を中心に整理します。

一方で、証拠金、ロット、StopLevel、FreezeLevelをさらに実務的に確認する場合は、OrderCheckの応用記事や銘柄仕様の記事も合わせて確認してください。発注前チェックは、1つの記事だけで完結させるより、関数説明、銘柄仕様、証拠金計算、OrderSend結果ログを分けて確認した方が整理しやすくなります。

確認したい内容見るページ役割
OrderCheckの基本このページ関数の役割、request、check result、retcodeの概要
証拠金・ロット・StopLevelMQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法実務的な発注前チェック
銘柄仕様MQL5ロット・証拠金・銘柄仕様完全ガイドvolume step、digits、point、tick valueの確認
CTradeMQL5標準ライブラリ・CTrade完全ガイドCTrade利用時の発注処理
注文結果ログMQL5 OrderSend結果ログを実コードで解説OrderSend後のretcodeとMqlTradeResult確認

このように役割を分けることで、OrderCheckの基本説明と、より実務的な証拠金・ロット・StopLevel確認を混同せずに内部リンクできます。

よくある質問

OrderCheckを使えば注文は必ず成功しますか?

いいえ。OrderCheckは注文前の確認であり、注文成功を保証するものではありません。OrderCheck後に価格、スプレッド、サーバー状態、取引可能状態が変わると、OrderSendで失敗することがあります。

OrderCheckとOrderSendは両方必要ですか?

役割が違います。OrderCheckは注文前チェック、OrderSendは実際の注文送信です。発注失敗の原因を追いやすくするためには、OrderCheckとOrderSendの結果を分けてログに残すのが有効です。

OrderCheckで何をログに出せばよいですか?

symbol、type、volume、price、sl、tp、check.retcode、check.margin、check.margin_free、check.margin_level、check.commentを必要に応じて出します。機密情報や口座情報は出さないようにしてください。

ロット不正はOrderCheckで分かりますか?

OrderCheckで確認できる場合がありますが、EA側でも事前に最小ロット、最大ロット、VolumeStepを確認する方が安全です。計算ロットと丸め後ロットをログに残すと原因追跡がしやすくなります。

invalid stopsが出る場合は何を確認しますか?

SL/TP距離、StopLevel、FreezeLevel、digits、point、BUY/SELL方向ごとの価格を確認します。特にXAUUSDや指数などでは、価格単位の扱いを間違えやすいため注意が必要です。

CTradeを使う場合もOrderCheckは必要ですか?

CTradeを使っていても、発注前チェックの考え方は重要です。CTradeのBuyやSellを呼ぶ前に、ロット、証拠金、SL/TP距離、スプレッド、最大ポジション数を確認すると、注文失敗の原因を追いやすくなります。

関連ページ

OrderCheckを使った注文前チェックを整理する時は、OrderSend、CTrade、注文・ポジション管理、ロット・証拠金・銘柄仕様、ログ確認、EA設計をあわせて確認すると、発注失敗の切り分けがしやすくなります。

確認したい内容関連ページ
OrderSendやMqlTradeRequest全体を確認するMQL5注文関数・取引構造体辞典
CTradeを使った注文処理を確認するMQL5標準ライブラリ・CTrade完全ガイド
注文・ポジション・履歴管理を確認するMQL5注文・ポジション・履歴管理完全ガイド
ロット・証拠金・銘柄仕様を確認するMQL5ロット・証拠金・銘柄仕様完全ガイド
ログ確認とデバッグを確認するMQL5デバッグ・ログファースト開発完全ガイド
EA設計の責務分離を確認するMQL5 EA設計パターン完全ガイド
EA自作前の発注前チェックを確認する自動売買EAを自作する前に確認すること
MQL5開発環境を確認するMQL5開発入門
バックテストと最適化を確認するMT5ストラテジーテスター・最適化完全ガイド
setファイル送付前の確認をするMT5でEAのsetファイルを送る前に確認すること
EAログを問い合わせ前に確認するEAのログを問い合わせ前に確認する方法
開発・改修相談の入口を確認する開発・改修の相談ページ
証拠金・ロット・StopLevelの実務確認MQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法

まとめ

OrderCheckは、MQL5でOrderSendを実行する前に、注文リクエストや証拠金状態を確認するための重要な関数です。注文成功を保証するものではありませんが、ロット不正、証拠金不足、SL/TP距離不正、銘柄仕様との不一致を早い段階で切り分けやすくなります。

OrderCheckを使う時は、MqlTradeRequestの内容、MqlTradeCheckResultのretcode、margin、margin_free、commentをログに残してください。また、OrderCheckが通った後でも、OrderSend側のretcode、GetLastError、order、deal、commentを別に確認する必要があります。

EA開発では、シグナル判定、フィルター、ロット補正、OrderCheck、OrderSend、取引イベント確認を分けることで、不具合時の原因追跡がしやすくなります。バックテストや開発依頼では、setファイル、検証条件、Expertsログ、Journalログもあわせて整理してください。

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