技術辞典

MQL5 OrderCalcMargin / OrderCalcProfitの使い方|必要証拠金と想定損益の確認

EAファンクラブ

MQL5でEAの発注前チェックを作る時は、注文を送る前に必要証拠金と想定損益を確認できるようにしておくと、注文失敗や想定外のロット、SL幅、証拠金不足を切り分けやすくなります。

その時に使う代表的な関数が、OrderCalcMarginOrderCalcProfit です。OrderCalcMargin は指定した注文条件で必要証拠金を計算し、OrderCalcProfit は指定したエントリー価格と決済価格から想定損益を計算します。

ただし、この2つは実際に注文を送る関数ではありません。発注前の見積もり・検証・ログ確認に使う関数です。実際の注文可否、retcode、口座状態、銘柄仕様、SL/TP距離、取引許可状態を確認するには、OrderCheckOrderSendSymbolInfoDoubleSymbolInfoInteger などと組み合わせて確認します。

この記事では、MQL5の OrderCalcMargin / OrderCalcProfit の役割、必要証拠金と想定損益の確認方法、OrderCheckとの違い、EAの発注前チェックへ組み込む時の考え方、GOLD / XAUUSDのような銘柄で注意したい点、バックテストやログ確認で見るべき項目を整理します。

なお、本記事はMT5 / MQL5 EA開発における技術的な確認事項を整理するものです。特定の売買判断、推奨ロット、推奨銘柄、利益、勝率、損失回避、運用成績を示すものではありません。

この記事で確認すること

  • OrderCalcMarginとOrderCalcProfitの役割
  • 必要証拠金と想定損益をEA内で確認する考え方
  • OrderCheck、OrderSend、OrderCalcMarginの違い
  • MqlTradeRequest作成前後で確認すべき項目
  • ロット、価格、SL/TP、StopLevel、FreezeLevelとの関係
  • GOLD / XAUUSDなど銘柄仕様差が大きい銘柄での注意点
  • バックテストで注文が出ない時の切り分け
  • ログに残すべき必要証拠金・想定損益・retcode情報

OrderCalcMarginとは

OrderCalcMargin は、指定した注文種別、銘柄、ロット、価格で注文した場合に必要となる証拠金を計算するための関数です。

EAで注文前チェックを作る時、現在の残高や余剰証拠金に対して、その注文を出せるかどうかを事前に確認したい場面があります。その時に、ロットと銘柄仕様をもとに必要証拠金を見積もる役割を持つのが OrderCalcMargin です。

ただし、OrderCalcMargin は「注文が必ず通る」と判断する関数ではありません。あくまで必要証拠金を計算する関数です。取引許可、StopLevel、FreezeLevel、ロット刻み、最大ロット、最小ロット、スプレッド、口座状態、trade allowedなどは、別途確認が必要です。

項目内容注意点
目的指定条件で必要証拠金を計算する注文実行そのものは行わない
主な入力注文種別、銘柄、ロット、価格銘柄仕様と価格の妥当性に注意する
主な出力必要証拠金口座通貨に換算された値として扱う
よく使う場面発注前チェック、ロット制限、証拠金不足確認OrderCheckと組み合わせると確認しやすい
確認できないこと注文retcode、StopLevel違反、取引許可状態OrderCheckやSymbolInfo系で補完する

OrderCalcProfitとは

OrderCalcProfit は、指定した注文種別、銘柄、ロット、エントリー価格、決済価格から想定損益を計算するための関数です。

EAでは、SLまでの想定損失、TPまでの想定利益、ATR幅に応じた損益、リスク許容額に対するロット調整などを確認したい場面があります。その時に、価格差とロットから想定損益を計算するために OrderCalcProfit を使います。

ただし、OrderCalcProfit で計算できるのは理論上の損益です。実運用では、スプレッド、約定価格、スリッページ、手数料、スワップ、口座仕様、銘柄仕様の影響を受けるため、実際の損益と完全一致するとは限りません。

項目内容注意点
目的指定価格差に対する想定損益を計算する将来損益を保証するものではない
主な入力注文種別、銘柄、ロット、開始価格、終了価格BUYとSELLで価格方向が異なる
主な出力想定損益口座通貨ベースで確認する
よく使う場面SL損失、TP利益、リスク額、ロット検証損切り幅とロットの関係を確認しやすい
確認できないこと約定可否、注文retcode、実際の滑りOrderSend結果ログと分けて見る

OrderCalcMargin / OrderCalcProfit / OrderCheckの違い

発注前チェックでは、OrderCalcMarginOrderCalcProfitOrderCheck を混同しないことが重要です。

OrderCalcMargin は必要証拠金の見積もり、OrderCalcProfit は指定価格差に対する想定損益の見積もり、OrderCheck はMqlTradeRequestに対する注文前チェックです。役割が違うため、どれか1つだけで発注可否を完全に判断するのではなく、責務を分けて使います。

関数主な役割確認できること確認できないこと
OrderCalcMargin必要証拠金の計算指定ロット・価格で必要な証拠金注文retcode、SL/TP妥当性、取引許可
OrderCalcProfit想定損益の計算指定価格差での損益注文可否、約定、実際の滑り
OrderCheck注文前チェックMqlTradeRequestに対するretcode、margin、commentなど実際の約定結果
OrderSend注文送信注文要求と結果事前見積もりだけでは分からない実行結果
SymbolInfo系銘柄仕様の取得point、digits、volume step、stops levelなど注文要求全体の成否

OrderCheck の基本は、MQL5 OrderCheckの使い方で整理しています。証拠金・ロット・StopLevelをより実務的に確認したい場合は、MQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法も確認してください。

OrderCalcMarginの基本コード

以下は、BUY注文の必要証拠金を確認する最小構成の例です。実際のEAでは、銘柄、ロット、価格、エラー処理、ログ出力を関数化して使う方が管理しやすくなります。

double margin = 0.0;
double volume = 0.10;
double price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

bool ok = OrderCalcMargin(
   ORDER_TYPE_BUY,
   _Symbol,
   volume,
   price,
   margin
);

if(!ok)
{
   Print("OrderCalcMargin failed. error=", GetLastError());
}
else
{
   Print("required margin=", margin);
}

このコードでは、SYMBOL_ASK を使ってBUY注文の計算価格を取得し、OrderCalcMargin で必要証拠金を計算しています。失敗時には GetLastError() をログに出しています。

実務では、必要証拠金が取得できたかどうかだけでなく、現在の余剰証拠金、ロット値、銘柄仕様、取引許可状態も合わせて確認します。

コード内の項目意味注意点
ORDER_TYPE_BUYBUY注文として計算するSELLならORDER_TYPE_SELLを使う
_Symbol現在チャートの銘柄複数銘柄EAでは対象銘柄を明示する
volume計算対象ロット最小ロット・ロット刻みに合わせる
price計算価格BUYはASK、SELLはBIDを基本に考える
margin計算結果の格納先成功時のみ値を信用する
GetLastError失敗時のエラー確認retcodeとは別物として扱う

OrderCalcProfitの基本コード

以下は、BUY注文でエントリー価格からSL価格まで下がった場合の想定損失を確認する例です。ロットと価格差に対する損益を確認することで、リスク額やSL幅の妥当性を見やすくなります。

double profit = 0.0;
double volume = 0.10;
double entry_price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double sl_price = entry_price - 1000 * _Point;

bool ok = OrderCalcProfit(
   ORDER_TYPE_BUY,
   _Symbol,
   volume,
   entry_price,
   sl_price,
   profit
);

if(!ok)
{
   Print("OrderCalcProfit failed. error=", GetLastError());
}
else
{
   Print("estimated profit/loss=", profit);
}

BUY注文では、決済価格がエントリー価格より下にある場合、損失方向になります。上記の例では、SL価格まで下がった場合の想定損失を確認しています。

SELL注文では価格方向が逆になります。SELLでは、エントリー価格より上にSL価格がある場合、損失方向になります。BUYとSELLで価格の向きが違うため、注文方向を必ずログに出して確認してください。

確認項目BUYの場合SELLの場合
エントリー価格ASKを基準にすることが多いBIDを基準にすることが多い
利益方向価格上昇価格下落
損失方向価格下落価格上昇
SL価格エントリー価格より下エントリー価格より上
TP価格エントリー価格より上エントリー価格より下

発注前チェックで確認する順序

EAの発注前チェックでは、いきなり OrderSend へ進むのではなく、シグナル、フィルター、銘柄仕様、ロット、証拠金、SL/TP距離、OrderCheck、OrderSend結果を段階的に確認すると原因を追いやすくなります。

特に、バックテストで注文が出ない、リアル運用で注文が失敗する、GOLD / XAUUSDでロットやStopLevelが合わない、証拠金不足になる、といった相談では、どの段階で止まったかをログで確認できることが重要です。

順序確認内容主な確認方法
1シグナル成立BUY / SELL候補が出ているかログ確認
2スプレッド・時間・リスクフィルター発注前の見送り理由を確認
3銘柄仕様SymbolInfoDouble / SymbolInfoInteger
4ロット正規化min / max / stepに合わせる
5必要証拠金OrderCalcMargin
6想定損益OrderCalcProfit
7注文前チェックOrderCheck
8注文送信OrderSend / CTrade
9注文結果ログMqlTradeResult / retcode / comment

発注前チェック全体の考え方は、MQL5でEAの発注前チェックを作る考え方で整理しています。

ロットと証拠金の関係を見る

OrderCalcMargin は、ロットが変わると必要証拠金も変わります。そのため、固定ロット、残高比率、リスク割合、ナンピン追加ロット、マーチン倍率などを使うEAでは、ロット計算後に必要証拠金を確認することが重要です。

ロットが銘柄仕様に合っていない場合、注文前に失敗します。最小ロット、最大ロット、ロット刻み、volume limitを確認し、計算ロットをそのまま注文に使わないようにします。

確認項目確認する内容関係する情報
最小ロット発注できる最小単位SYMBOL_VOLUME_MIN
最大ロット発注できる最大単位SYMBOL_VOLUME_MAX
ロット刻みロットの増減単位SYMBOL_VOLUME_STEP
ロット制限銘柄全体の保有制限SYMBOL_VOLUME_LIMIT
必要証拠金発注に必要な証拠金OrderCalcMargin
余剰証拠金現在利用可能な証拠金ACCOUNT_MARGIN_FREE
証拠金維持率口座の余力状態ACCOUNT_MARGIN_LEVEL

銘柄仕様の取得方法は、MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方も参考にしてください。

SL/TP幅と想定損益を確認する

OrderCalcProfit は、SLまでの想定損失やTPまでの想定利益を確認する時に使えます。特に、ATR幅、固定pips、直近高値安値、ボラティリティに応じたSL/TPを使うEAでは、価格幅と損益額の関係を確認しておくと安全です。

ただし、SL/TP価格がStopLevelに違反している場合や、FreezeLevelに近い場合、想定損益が計算できても注文自体は通らない可能性があります。損益計算と注文可否は分けて確認してください。

確認項目役割注意点
SL価格損失方向の決済価格BUYとSELLで位置が逆になる
TP価格利益方向の決済価格価格方向を間違えない
想定損失SL到達時の損失額OrderCalcProfitで確認できる
想定利益TP到達時の利益額手数料やスワップは別確認が必要
StopLevel注文価格からの最低距離SymbolInfoIntegerで確認する
FreezeLevel変更・決済が制限される距離注文変更時にも注意する
Point / Digits価格桁と最小単位pips換算を誤らない

OrderCheckと組み合わせる

OrderCalcMarginOrderCalcProfit は、必要証拠金と想定損益を確認するための関数です。一方で、注文前の総合的なチェックには OrderCheck を使います。

OrderCheck では、MqlTradeRequestを渡して、注文前にretcode、comment、margin、balance、equity、margin_freeなどを確認できます。実際の注文結果とは異なりますが、発注前に問題を見つけるための重要な情報になります。

実務では、OrderCalcMarginで必要証拠金を概算し、OrderCalcProfitでリスク額を確認し、MqlTradeRequestを組み立てた後にOrderCheckで最終確認し、それからOrderSendまたはCTradeへ進める構造が扱いやすくなります。

段階使う関数確認する内容
ロット・価格準備SymbolInfo系銘柄仕様、point、volume step、stops level
証拠金見積もりOrderCalcMargin必要証拠金
リスク額見積もりOrderCalcProfitSL/TP到達時の想定損益
注文前確認OrderCheckretcode、comment、margin、margin_free
注文送信OrderSend / CTrade実際の注文結果
結果確認MqlTradeResultretcode、deal、order、comment

OrderSendの結果ログについては、MQL5 OrderSend結果ログを実コードで解説で整理しています。

発注前チェック関数の構成例

以下は、必要証拠金とSL到達時の想定損失を確認する発注前チェック関数の簡易例です。実際のEAでは、銘柄仕様、スプレッド、時間条件、最大ポジション数、Magic Number、OrderCheck結果なども含めて責務を分けると保守しやすくなります。

bool CheckMarginAndRisk(
   string symbol,
   ENUM_ORDER_TYPE orderType,
   double volume,
   double entryPrice,
   double slPrice
)
{
   double requiredMargin = 0.0;
   double estimatedLoss = 0.0;

   if(!OrderCalcMargin(orderType, symbol, volume, entryPrice, requiredMargin))
   {
      Print("OrderCalcMargin failed. symbol=", symbol,
            " volume=", volume,
            " error=", GetLastError());
      return false;
   }

   if(!OrderCalcProfit(orderType, symbol, volume, entryPrice, slPrice, estimatedLoss))
   {
      Print("OrderCalcProfit failed. symbol=", symbol,
            " volume=", volume,
            " error=", GetLastError());
      return false;
   }

   double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);

   Print("PRECHECK margin=", requiredMargin,
         " freeMargin=", freeMargin,
         " estimatedLoss=", estimatedLoss);

   if(requiredMargin > freeMargin)
   {
      Print("PRECHECK_BLOCK reason=NOT_ENOUGH_MARGIN");
      return false;
   }

   return true;
}

この例では、必要証拠金が余剰証拠金を超えている場合に発注前で止めています。実際には、証拠金に余裕を持たせる、margin levelを確認する、最大DDや1回あたりリスク額を制限するなど、EAの仕様に応じて条件を追加します。

また、estimatedLoss は損失方向の場合にマイナス値になることがあります。ログでは符号を含めて確認し、必要なら絶対値でリスク額として扱うなど、仕様を明確にしてください。

GOLD / XAUUSDで注意すること

GOLD / XAUUSDでは、通貨ペアと比べて値幅、point、digits、tick value、contract size、必要証拠金、スプレッドが大きく異なることがあります。

そのため、OrderCalcMarginやOrderCalcProfitを使っていても、銘柄仕様の確認が不足していると、想定より大きな必要証拠金や損益額になる場合があります。

確認項目見る内容注意点
digits価格の小数桁pips換算を誤らない
point最小価格単位SL/TP距離計算に影響する
tick value1tickあたりの価値想定損益に影響する
contract size取引単位証拠金と損益額に影響する
volume stepロット刻みロット正規化が必要
stops levelSL/TPの最低距離注文前に確認する
spread売買価格差短期EAでは影響が大きい

GOLD / XAUUSD対応EAでは、ロット・SL幅・損益額・必要証拠金を必ず銘柄仕様とセットで確認してください。

バックテストで注文が出ない時の確認

バックテストで注文が出ない場合、シグナルが出ていないだけでなく、発注前チェックで止まっている可能性があります。特に、証拠金不足、ロット不正、スプレッド上限超過、StopLevel違反、取引時間外、最大ポジション数到達などを確認します。

OrderCalcMarginやOrderCalcProfitをログに出しておくと、必要証拠金や想定損失が原因で発注を止めているのか、シグナル自体が成立していないのかを切り分けやすくなります。

症状確認する内容見るログ
注文が一度も出ないシグナル成立、時間条件、取引許可SIGNAL、TIME、TRADE_ALLOWED
証拠金不足で止まるrequired margin、free marginOrderCalcMargin、OrderCheck
ロット不正で止まるmin、max、step、normalized volumeSymbolInfo、volume log
SL/TPで止まるStopLevel、FreezeLevel、距離stops level log
想定損失が大きすぎるOrderCalcProfit、SL幅、ロットestimated loss log
OrderSendで失敗するretcode、comment、GetLastErrorMqlTradeResult log

ログに残すべき項目

発注前チェックでは、計算した値をログに残すことで、後から注文が出ない原因を確認しやすくなります。

特に、OrderCalcMarginやOrderCalcProfitの結果は、EA内部で判定に使っていても、ログに出ていないと確認できません。検証用ログでは、数値とブロック理由を分けて出すと追跡しやすくなります。

ログ項目内容用途
symbol対象銘柄銘柄違いを確認する
orderTypeBUY / SELL価格方向を確認する
volume注文ロットロット計算の妥当性を見る
entryPrice想定エントリー価格ASK / BIDの確認に使う
slPriceSL価格想定損失計算に使う
requiredMargin必要証拠金証拠金不足を切り分ける
freeMargin余剰証拠金発注余力を確認する
estimatedProfitLoss想定損益SL/TP到達時の影響を見る
blockReason発注見送り理由原因を一目で確認する
retcodeOrderCheck / OrderSend結果注文前後の結果確認に使う

よくある失敗

OrderCalcMargin / OrderCalcProfitを使う時は、関数の役割を誤解したり、価格方向やロット仕様を誤ったりしないよう注意が必要です。

失敗例内容対策
OrderCalcMarginだけで発注可能と判断する必要証拠金だけを見ているOrderCheckも使う
OrderCalcProfitを利益保証のように扱う指定価格差の理論損益を誤解している想定値として扱う
BUY / SELLの価格方向を間違えるSL/TPの位置が逆になる注文方向をログに出す
ロット正規化をしないvolume stepに合わないSymbolInfo系で確認する
StopLevelを見ないSL/TP距離が不足するSymbolInfoIntegerで確認する
GOLDのpoint換算を誤る想定損益が大きくずれるdigits、point、tick valueを確認する
ログを出さない発注見送り理由が追えないPRECHECKログを出す

関連ページ

OrderCalcMargin / OrderCalcProfitは、発注前チェック、OrderCheck、OrderSend結果ログ、銘柄仕様確認と合わせて整理すると理解しやすくなります。

確認したい内容関連ページ
OrderCheckの基本MQL5 OrderCheckの使い方
証拠金・ロット・StopLevelを確認したいMQL5 OrderCheckで証拠金・ロット・StopLevelを確認する方法
発注前チェック全体を作りたいMQL5でEAの発注前チェックを作る考え方
銘柄仕様を確認したいMQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方
OrderSend結果ログを確認したいMQL5 OrderSend結果ログを実コードで解説
CTradeとMqlTradeRequestの違いを確認したいMQL5 CTradeとMqlTradeRequestの違い

OrderCalcMargin / OrderCalcProfitの実務チェック表

  • OrderCalcMarginとOrderCalcProfitの役割を分けている
  • BUYとSELLで価格方向を分けている
  • ロットを銘柄仕様に合わせて正規化している
  • 必要証拠金と余剰証拠金をログに出している
  • SL到達時の想定損失を確認している
  • StopLevelとFreezeLevelを別途確認している
  • OrderCheckでretcodeとcommentを確認している
  • OrderSend結果ログと発注前チェックログを分けている
  • GOLD / XAUUSDではpoint、digits、tick valueを確認している
  • バックテストで注文が出ない時に、証拠金・想定損益・retcodeを確認できる

よくある質問

OrderCalcMarginを使えば注文できるか分かりますか?

必要証拠金の見積もりはできますが、注文が必ず通るかまでは分かりません。注文前の総合確認にはOrderCheck、実際の注文結果確認にはOrderSendやCTradeの結果ログが必要です。

OrderCalcProfitは将来の損益予測ですか?

将来の損益予測ではありません。指定した価格差とロットに対する理論上の想定損益を計算するための関数です。実運用ではスプレッド、約定、手数料、スワップなどの影響があります。

BUYとSELLでOrderCalcProfitの使い方は変わりますか?

注文種別と価格方向が変わります。BUYは価格上昇が利益方向、SELLは価格下落が利益方向です。SL/TP価格の位置を間違えないように、注文方向と価格をログに出してください。

証拠金不足かどうかは何を見ればよいですか?

OrderCalcMarginで必要証拠金を計算し、AccountInfoDoubleの余剰証拠金と比較します。さらにOrderCheckのretcode、margin、margin_free、commentも確認してください。

GOLD / XAUUSDで損益計算がずれる原因は何ですか?

digits、point、tick value、contract size、ロット刻み、ブローカーごとの銘柄仕様差が原因になることがあります。SymbolInfoDouble / SymbolInfoIntegerで銘柄仕様を確認してください。

OrderCalcMarginで確認できることと確認できないこと

OrderCalcMargin は、指定した銘柄、注文方向、ロット、価格で必要証拠金を見積もるための関数です。発注前に証拠金目安を出す目的では有効ですが、この関数だけで注文可否を最終判断することはできません。

実際のEAでは、必要証拠金の計算に加えて、銘柄の取引可否、ロット最小値、ロット最大値、ロット刻み、StopLevel、FreezeLevel、スプレッド、取引時間、口座の取引許可状態、既存ポジション数、同一Magic Numberの状態を分けて確認します。

OrderCalcMarginの戻り値が正常でも、OrderSendが必ず成功するわけではありません。価格が変動した、StopLevelに抵触した、取引時間外になった、許容スプレッドを超えた、既存ポジション制限に達した、といった理由で発注を見送ることがあります。

分類OrderCalcMarginで確認できること別途確認すること
証拠金指定ロット・指定価格で必要になる証拠金目安余剰証拠金、証拠金維持率、既存ポジションの影響
銘柄対象銘柄に対する必要証拠金計算取引可否、注文種別、volume step、StopLevel
価格指定価格を使った計算現在Bid/Ask、価格更新、約定時点の変化
ロット渡したvolumeでの計算最小ロット、最大ロット、ロット刻みへの正規化
注文可否直接の最終判定ではないOrderCheck、OrderSend、retcode、comment

そのため、OrderCalcMarginは「発注前チェックの一部」として扱い、OrderCheckやOrderSend結果ログと組み合わせて使います。ログ上も、MARGIN、ORDER_CHECK、ORDER_SENDを別のreason_codeとして分けておくと、停止理由を追いやすくなります。

OrderCalcProfitで確認できることと確認できないこと

OrderCalcProfit は、指定した注文方向、銘柄、ロット、建値、決済価格を使って想定損益を計算するための関数です。SL到達時の想定損失、TP到達時の想定利益、任意価格まで動いた場合の損益目安をログへ残す時に使いやすい関数です。

ただし、OrderCalcProfitの結果は「指定価格で決済された場合の計算値」です。実運用では、約定価格、スリッページ、手数料、スワップ、部分決済、複数ポジション、通貨換算のタイミングなどにより、最終損益と完全一致しない場合があります。

EA開発では、OrderCalcProfitの値を「将来損益の予測」としてではなく、「現在の入力条件でどの程度の損益幅になるかを確認する診断ログ」として扱うのが安全です。

用途確認できること注意点
SL損失目安SL価格まで動いた場合の想定損失実際の約定価格や手数料で差が出る
TP利益目安TP価格まで動いた場合の想定利益価格到達や約定を保証するものではない
価格差確認指定した価格差の口座通貨ベース損益銘柄仕様とロットが前提になる
リスク表示EAパネルやログに損失目安を表示できる推奨ロットや利益保証の表示にしない
検証ログset変更前後の損益幅比較に使える同じ銘柄・同じロット条件で比較する

BUYとSELLで価格方向を分けて確認する

OrderCalcProfitを使う時は、BUYとSELLで損益方向が反対になる点に注意します。BUYでは、決済価格が建値より上なら利益方向、下なら損失方向です。SELLでは、決済価格が建値より下なら利益方向、上なら損失方向です。

SL価格やTP価格を計算する時に方向を取り違えると、想定損失と想定利益が逆になります。とくに、内部でpoint幅からSL/TP価格を作るEAでは、direction、entry、sl、tp、price_closeを必ずログに出してください。

注文方向損失方向利益方向ログで確認する値
BUYentryより低い価格entryより高い価格entry、SL、TP、bid/ask、volume
SELLentryより高い価格entryより低い価格entry、SL、TP、bid/ask、volume
BUYのSL確認price_close = SL価格損失値になる想定profitが負値か確認する
SELLのSL確認price_close = SL価格損失値になる想定profitが負値か確認する
TP確認利益方向の価格利益値になる想定profitが正値か確認する

想定損益ログで正負が意図と逆になっている場合は、注文方向、SL/TP価格、価格桁、point換算、銘柄仕様のいずれかを確認してください。

ロット正規化後に計算する

OrderCalcMarginやOrderCalcProfitへ渡すvolumeは、実際に発注するロットと一致させます。EA内部で算出した仮ロットをそのまま使うのではなく、銘柄の最小ロット、最大ロット、ロット刻みに合わせて正規化した後の値で計算することが重要です。

たとえば、ロット刻みが0.01の銘柄で0.123ロットを計算に使い、実際の発注では0.12に丸める場合、計算ログと注文結果がずれます。証拠金や想定損益をログへ出す場合は、正規化前ロットと正規化後ロットを分けて残すと確認しやすくなります。

確認項目ログに残す値理由
raw volumeEA内部で最初に算出したロット計算式の結果を確認するため
normalized volumevolume stepに合わせた発注予定ロット実際の発注値と一致させるため
volume min / max銘柄仕様上の最小・最大ロット範囲外ロットを止めるため
volume stepロット刻み丸め処理の根拠にするため
margin / profit正規化後ロットでの計算結果注文予定値に対する確認にするため

OrderCalcMargin / OrderCalcProfitをログ設計に組み込む

発注前チェックでは、単に計算関数を呼ぶだけではなく、どの入力値で計算し、どの結果になり、どの理由で発注を許可または停止したかをログに残します。

ログ設計では、SIGNAL、GATE、SPREAD、LOT、MARGIN、SLTP、ORDER_CHECK、ORDER_SENDを分けると、バックテストで注文が出ない時や、実運用で注文エラーが出た時に原因を追いやすくなります。

ログ層主なログ内容OrderCalc系との関係
SIGNAL売買候補が出たか計算前の判定
SPREAD現在スプレッドと許容スプレッド高スプレッド時は計算前に止める場合がある
LOTraw volume、normalized volumeOrderCalcへ渡すvolumeを確定する
MARGINrequired_margin、free_marginOrderCalcMarginの結果を出す
SLTPentry、SL、TP、想定損益OrderCalcProfitの結果を出す
ORDER_CHECKretcode、comment、margin、margin_freeリクエスト全体を確認する
ORDER_SENDOrderSendのretcode、deal、order最終送信結果を確認する

このように分けておくと、「シグナルは出たが証拠金で止まった」「証拠金は足りたがOrderCheckで止まった」「OrderCheckは通ったがOrderSendでretcodeが返った」といった状態を確認できます。

バックテストで確認する時の注意点

Strategy TesterでOrderCalcMarginやOrderCalcProfitを確認する時は、実口座の約定やサーバー条件を完全に再現しているわけではない点に注意します。バックテストでは、EA内部のロット計算、価格指定、SL/TP設定、想定損益ログが意図どおり出ているかを確認します。

一方、実運用では、取引時間、価格変動、約定方式、リクオート、スリッページ、ブローカー側の制限、口座タイプ、VPSや通信状態が関係します。OrderCalc系の計算ログは、実運用での注文結果ログと合わせて比較してください。

確認環境確認しやすいこと注意点
バックテスト入力値、ロット、証拠金、想定損益、ログ出力約定環境までは完全再現しない
デモ口座実際のOrderCheck / OrderSend結果リアル口座と仕様が違う場合がある
リアル口座実運用時の約定・スプレッド・制限検証時はロットやリスク管理に注意する
ログ比較バックテストと実運用の差分時刻、銘柄、set、口座仕様をそろえる

OrderCalcMargin / OrderCalcProfitの実務チェック表

  • OrderCalcMarginとOrderCalcProfitの役割を分けている
  • OrderCalcMarginだけで注文可否を最終判断していない
  • OrderCalcProfitを将来損益の保証として扱っていない
  • BUYとSELLでSL/TP価格方向を分けて確認している
  • ロット正規化後のvolumeで証拠金と損益を計算している
  • GOLD / XAUUSDやCFDではpoint、digits、tick valueを確認している
  • 必要証拠金、余剰証拠金、想定損失、想定利益をログに残している
  • OrderCheckのretcodeとcommentをOrderCalc系ログと分けている
  • OrderSend結果ログを別に確認している
  • バックテストと実運用の差分を混同していない

まとめ

OrderCalcMargin は必要証拠金の見積もり、OrderCalcProfit は指定価格差に対する想定損益の見積もりに使う関数です。

この2つは注文を送る関数ではなく、発注前チェックやログ確認のために使う補助関数です。実際の注文可否は、銘柄仕様、ロット、SL/TP距離、取引許可状態、OrderCheck、OrderSend結果ログと合わせて確認してください。

EAの発注前チェックでは、必要証拠金、余剰証拠金、想定損益、ロット、StopLevel、retcode、commentをログに残すことで、バックテストや実運用で注文が出ない時の原因を追いやすくなります。

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