MQL5 OrderCalcMargin / OrderCalcProfitの使い方|必要証拠金と想定損益の確認
MQL5でEAの発注前チェックを作る時は、注文を送る前に必要証拠金と想定損益を確認できるようにしておくと、注文失敗や想定外のロット、SL幅、証拠金不足を切り分けやすくなります。
その時に使う代表的な関数が、OrderCalcMargin と OrderCalcProfit です。OrderCalcMargin は指定した注文条件で必要証拠金を計算し、OrderCalcProfit は指定したエントリー価格と決済価格から想定損益を計算します。
ただし、この2つは実際に注文を送る関数ではありません。発注前の見積もり・検証・ログ確認に使う関数です。実際の注文可否、retcode、口座状態、銘柄仕様、SL/TP距離、取引許可状態を確認するには、OrderCheck、OrderSend、SymbolInfoDouble、SymbolInfoInteger などと組み合わせて確認します。
この記事では、MQL5の OrderCalcMargin / OrderCalcProfit の役割、必要証拠金と想定損益の確認方法、OrderCheckとの違い、EAの発注前チェックへ組み込む時の考え方、GOLD / XAUUSDのような銘柄で注意したい点、バックテストやログ確認で見るべき項目を整理します。
なお、本記事はMT5 / MQL5 EA開発における技術的な確認事項を整理するものです。特定の売買判断、推奨ロット、推奨銘柄、利益、勝率、損失回避、運用成績を示すものではありません。
- この記事で確認すること
- OrderCalcMarginとは
- OrderCalcProfitとは
- OrderCalcMargin / OrderCalcProfit / OrderCheckの違い
- OrderCalcMarginの基本コード
- OrderCalcProfitの基本コード
- 発注前チェックで確認する順序
- ロットと証拠金の関係を見る
- SL/TP幅と想定損益を確認する
- OrderCheckと組み合わせる
- 発注前チェック関数の構成例
- GOLD / XAUUSDで注意すること
- バックテストで注文が出ない時の確認
- ログに残すべき項目
- よくある失敗
- 関連ページ
- OrderCalcMargin / OrderCalcProfitの実務チェック表
- よくある質問
- OrderCalcMarginで確認できることと確認できないこと
- OrderCalcProfitで確認できることと確認できないこと
- BUYとSELLで価格方向を分けて確認する
- ロット正規化後に計算する
- OrderCalcMargin / OrderCalcProfitをログ設計に組み込む
- バックテストで確認する時の注意点
- OrderCalcMargin / OrderCalcProfitの実務チェック表
- まとめ
この記事で確認すること
- 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の違い
発注前チェックでは、OrderCalcMargin、OrderCalcProfit、OrderCheck を混同しないことが重要です。
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_BUY | BUY注文として計算する | 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と組み合わせる
OrderCalcMargin と OrderCalcProfit は、必要証拠金と想定損益を確認するための関数です。一方で、注文前の総合的なチェックには OrderCheck を使います。
OrderCheck では、MqlTradeRequestを渡して、注文前にretcode、comment、margin、balance、equity、margin_freeなどを確認できます。実際の注文結果とは異なりますが、発注前に問題を見つけるための重要な情報になります。
実務では、OrderCalcMarginで必要証拠金を概算し、OrderCalcProfitでリスク額を確認し、MqlTradeRequestを組み立てた後にOrderCheckで最終確認し、それからOrderSendまたはCTradeへ進める構造が扱いやすくなります。
| 段階 | 使う関数 | 確認する内容 |
|---|---|---|
| ロット・価格準備 | SymbolInfo系 | 銘柄仕様、point、volume step、stops level |
| 証拠金見積もり | OrderCalcMargin | 必要証拠金 |
| リスク額見積もり | OrderCalcProfit | SL/TP到達時の想定損益 |
| 注文前確認 | OrderCheck | retcode、comment、margin、margin_free |
| 注文送信 | OrderSend / CTrade | 実際の注文結果 |
| 結果確認 | MqlTradeResult | retcode、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 value | 1tickあたりの価値 | 想定損益に影響する |
| contract size | 取引単位 | 証拠金と損益額に影響する |
| volume step | ロット刻み | ロット正規化が必要 |
| stops level | SL/TPの最低距離 | 注文前に確認する |
| spread | 売買価格差 | 短期EAでは影響が大きい |
GOLD / XAUUSD対応EAでは、ロット・SL幅・損益額・必要証拠金を必ず銘柄仕様とセットで確認してください。
バックテストで注文が出ない時の確認
バックテストで注文が出ない場合、シグナルが出ていないだけでなく、発注前チェックで止まっている可能性があります。特に、証拠金不足、ロット不正、スプレッド上限超過、StopLevel違反、取引時間外、最大ポジション数到達などを確認します。
OrderCalcMarginやOrderCalcProfitをログに出しておくと、必要証拠金や想定損失が原因で発注を止めているのか、シグナル自体が成立していないのかを切り分けやすくなります。
| 症状 | 確認する内容 | 見るログ |
|---|---|---|
| 注文が一度も出ない | シグナル成立、時間条件、取引許可 | SIGNAL、TIME、TRADE_ALLOWED |
| 証拠金不足で止まる | required margin、free margin | OrderCalcMargin、OrderCheck |
| ロット不正で止まる | min、max、step、normalized volume | SymbolInfo、volume log |
| SL/TPで止まる | StopLevel、FreezeLevel、距離 | stops level log |
| 想定損失が大きすぎる | OrderCalcProfit、SL幅、ロット | estimated loss log |
| OrderSendで失敗する | retcode、comment、GetLastError | MqlTradeResult log |
ログに残すべき項目
発注前チェックでは、計算した値をログに残すことで、後から注文が出ない原因を確認しやすくなります。
特に、OrderCalcMarginやOrderCalcProfitの結果は、EA内部で判定に使っていても、ログに出ていないと確認できません。検証用ログでは、数値とブロック理由を分けて出すと追跡しやすくなります。
| ログ項目 | 内容 | 用途 |
|---|---|---|
| symbol | 対象銘柄 | 銘柄違いを確認する |
| orderType | BUY / SELL | 価格方向を確認する |
| volume | 注文ロット | ロット計算の妥当性を見る |
| entryPrice | 想定エントリー価格 | ASK / BIDの確認に使う |
| slPrice | SL価格 | 想定損失計算に使う |
| requiredMargin | 必要証拠金 | 証拠金不足を切り分ける |
| freeMargin | 余剰証拠金 | 発注余力を確認する |
| estimatedProfitLoss | 想定損益 | SL/TP到達時の影響を見る |
| blockReason | 発注見送り理由 | 原因を一目で確認する |
| retcode | OrderCheck / 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を必ずログに出してください。
| 注文方向 | 損失方向 | 利益方向 | ログで確認する値 |
|---|---|---|---|
| BUY | entryより低い価格 | entryより高い価格 | entry、SL、TP、bid/ask、volume |
| SELL | entryより高い価格 | 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 volume | EA内部で最初に算出したロット | 計算式の結果を確認するため |
| normalized volume | volume stepに合わせた発注予定ロット | 実際の発注値と一致させるため |
| volume min / max | 銘柄仕様上の最小・最大ロット | 範囲外ロットを止めるため |
| volume step | ロット刻み | 丸め処理の根拠にするため |
| margin / profit | 正規化後ロットでの計算結果 | 注文予定値に対する確認にするため |
OrderCalcMargin / OrderCalcProfitをログ設計に組み込む
発注前チェックでは、単に計算関数を呼ぶだけではなく、どの入力値で計算し、どの結果になり、どの理由で発注を許可または停止したかをログに残します。
ログ設計では、SIGNAL、GATE、SPREAD、LOT、MARGIN、SLTP、ORDER_CHECK、ORDER_SENDを分けると、バックテストで注文が出ない時や、実運用で注文エラーが出た時に原因を追いやすくなります。
| ログ層 | 主なログ内容 | OrderCalc系との関係 |
|---|---|---|
| SIGNAL | 売買候補が出たか | 計算前の判定 |
| SPREAD | 現在スプレッドと許容スプレッド | 高スプレッド時は計算前に止める場合がある |
| LOT | raw volume、normalized volume | OrderCalcへ渡すvolumeを確定する |
| MARGIN | required_margin、free_margin | OrderCalcMarginの結果を出す |
| SLTP | entry、SL、TP、想定損益 | OrderCalcProfitの結果を出す |
| ORDER_CHECK | retcode、comment、margin、margin_free | リクエスト全体を確認する |
| ORDER_SEND | OrderSendの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をログに残すことで、バックテストや実運用で注文が出ない時の原因を追いやすくなります。
