MQL5ロット・証拠金・銘柄仕様完全ガイド|volume step・tick value・stops levelの確認
MQL5でEAの注文処理を作る時、ロット、証拠金、銘柄仕様の確認は非常に重要です。シグナルが出ていても、ロットが銘柄仕様に合っていない、証拠金が不足している、SL/TP距離が近すぎる、StopLevelやFreezeLevelを満たしていない、といった理由で注文は失敗します。
特にMT5では、銘柄ごとに最小ロット、最大ロット、volume step、tick size、tick value、contract size、digits、point、stops level、freeze level、取引可否などが異なります。USDJPY、EURUSD、GOLD / XAUUSD、指数、仮想通貨CFDなどを同じ感覚で扱うと、ロット計算やSL/TP距離、必要証拠金の確認で誤りが起きやすくなります。
この記事では、MQL5でEAのロット・証拠金・銘柄仕様を確認するために、SymbolInfoDouble、SymbolInfoInteger、OrderCalcMargin、OrderCheck、volume min / max / step、tick size / tick value、point / digits、contract size、stops level、freeze level、ログ設計、バックテスト確認までを実務目線で整理します。
なお、この記事はMT5 / MQL5のEA開発、発注前チェック、銘柄仕様確認、ログ確認を目的とした技術記事です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。
- この記事で確認すること
- MQL5で銘柄仕様を確認する理由
- SymbolInfoDoubleとSymbolInfoIntegerの基本
- volume min / max / step を確認する
- ロットを銘柄仕様に合わせて丸める考え方
- point・digits・pipsを混同しない
- tick size・tick value・contract sizeを確認する
- stops levelとfreeze levelの違い
- SL/TP距離を確認する基本コード例
- OrderCalcMarginで必要証拠金を確認する
- OrderCheckとの関係
- CTradeやOrderSendの前に確認すること
- GOLD / XAUUSD対応EAで特に注意すること
- 複数銘柄EAでの銘柄仕様確認
- バックテストでロット・証拠金・銘柄仕様を確認する
- ログ設計で確認しやすくする
- よくある不具合と確認ポイント
- 開発依頼前に整理する情報
- ロット・証拠金・銘柄仕様の実務チェック表
- よくある質問
- 関連ページ
- まとめ
この記事で確認すること
- MQL5でロット・証拠金・銘柄仕様を確認する理由
- volume min / max / step の確認
- ロットを銘柄仕様に合わせて丸める考え方
- point、digits、pipsの混同を避ける考え方
- tick size、tick value、contract size の確認
- stops level と freeze level の違い
- SL/TP距離を銘柄仕様に合わせて確認する方法
- OrderCalcMarginで必要証拠金を確認する方法
- OrderCheck、CTrade、OrderSendとの関係
- GOLD / XAUUSDなど銘柄差が大きい環境での注意点
- バックテストと実運用で結果が違う時の確認
- ロット・証拠金・銘柄仕様のログ設計
MQL5で銘柄仕様を確認する理由
EAの発注処理では、ロジックが正しくても銘柄仕様に合っていない注文は失敗します。たとえば、最小ロットより小さいロット、volume stepに合わないロット、現在価格に近すぎるSL/TP、取引不可の銘柄、証拠金不足の注文は、発注前またはOrderSend時点で失敗する可能性があります。
このため、EA開発では「エントリー条件が成立したか」だけでなく、「その銘柄で注文可能な形に整っているか」を確認します。MQL5では、SymbolInfoDoubleやSymbolInfoIntegerを使って、銘柄ごとの仕様を取得できます。
ロット・証拠金・銘柄仕様を確認しないままEAを作ると、バックテストでは動いたが実チャートでは注文できない、USDJPYでは動くがXAUUSDでは失敗する、デモでは通るが別口座ではロットエラーになる、といった問題が起きやすくなります。
| 確認項目 | 内容 | 発注失敗との関係 |
|---|---|---|
| 最小ロット | その銘柄で注文できる最小数量。 | これ未満のロットは不正になります。 |
| 最大ロット | その銘柄で注文できる最大数量。 | これを超える注文は不正になります。 |
| volume step | ロットの刻み幅。 | 刻み幅に合わないロットは失敗要因になります。 |
| point / digits | 価格単位と小数桁。 | SL/TP距離や価格丸めに影響します。 |
| tick size / tick value | 最小変動幅と価値。 | 損益計算や銘柄差確認に使います。 |
| contract size | 1ロットあたりの契約サイズ。 | 証拠金や損益の感覚に影響します。 |
| stops level | SL/TPや指値を置く時の最小距離に関係します。 | invalid stops の原因になります。 |
| freeze level | 注文変更が制限される距離に関係します。 | トレーリングやPositionModify失敗に関係します。 |
| trade mode | 銘柄の取引可否。 | 取引不可銘柄では注文できません。 |
SymbolInfoDoubleとSymbolInfoIntegerの基本
MQL5で銘柄仕様を取得する時は、SymbolInfoDoubleやSymbolInfoIntegerを使います。double型の銘柄情報はSymbolInfoDouble、整数型の銘柄情報はSymbolInfoIntegerで取得するのが基本です。
ロット関係では、SYMBOL_VOLUME_MIN、SYMBOL_VOLUME_MAX、SYMBOL_VOLUME_STEPを確認します。価格や損益計算では、SYMBOL_POINT、SYMBOL_TRADE_TICK_SIZE、SYMBOL_TRADE_TICK_VALUE、SYMBOL_TRADE_CONTRACT_SIZEを確認します。小数桁やStopLevel、FreezeLevelはSymbolInfoIntegerで確認する場面があります。
void PrintSymbolSpec(string symbol)
{
double vol_min = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double vol_max = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double vol_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
double tick_size = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
double tick_val = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double contract = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE);
long digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
long stops_level = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
long freeze_lv = SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
long trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
PrintFormat("SYMBOL_SPEC symbol=%s vol_min=%.2f vol_max=%.2f vol_step=%.2f point=%.10f digits=%d tick_size=%.10f tick_value=%.2f contract=%.2f stops=%d freeze=%d trade_mode=%d",
symbol,
vol_min,
vol_max,
vol_step,
point,
digits,
tick_size,
tick_val,
contract,
stops_level,
freeze_lv,
trade_mode);
}このように、EA起動時や発注前に銘柄仕様をログに残すと、注文失敗時の原因を追いやすくなります。特に、複数銘柄EAやGOLD / XAUUSD対応EAでは、銘柄ごとに仕様が違うため、固定値で判断しないようにしてください。
volume min / max / step を確認する
EAで注文ロットを扱う時は、最小ロット、最大ロット、volume stepを確認します。EA側で計算したロットが、銘柄の許容範囲と刻みに合っていない場合、OrderSendやCTradeで注文が失敗することがあります。
たとえば、計算上は0.037ロットになっても、銘柄のvolume stepが0.01なら0.03または0.04へ丸める必要があります。volume stepが0.10の銘柄で0.03ロットを送ると、ロット不正になる可能性があります。
| プロパティ | 意味 | 確認ポイント |
|---|---|---|
SYMBOL_VOLUME_MIN | 最小ロット。 | 要求ロットがこれ未満なら補正または発注停止します。 |
SYMBOL_VOLUME_MAX | 最大ロット。 | 要求ロットがこれを超える場合は上限を確認します。 |
SYMBOL_VOLUME_STEP | ロットの刻み幅。 | 要求ロットが刻みに合うように丸めます。 |
| 要求ロット | EA側で計算したロット。 | 残高連動、リスク%、固定ロットなどで計算します。 |
| 発注ロット | 銘柄仕様に合わせたロット。 | 注文に使う最終値をログに残します。 |
ロットを銘柄仕様に合わせて丸める考え方
ロットを計算した後は、volume stepに合わせて丸めます。丸め方はEAの仕様によって変わります。安全側に倒すなら切り下げ、目標リスクに近づけるなら四捨五入、必ず最小ロット以上にするなら下限補正を行います。
ただし、丸め処理で最小ロット未満になった場合に、無理に最小ロットへ引き上げると、想定リスクより大きい注文になる場合があります。EAの仕様として、最小ロット未満なら発注しないのか、最小ロットへ補正するのかを明確にしてください。
double NormalizeVolumeBySymbol(string symbol, double raw_volume)
{
double vol_min = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double vol_max = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double vol_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
if(vol_step <= 0.0)
return 0.0;
double volume = MathFloor(raw_volume / vol_step) * vol_step;
if(volume < vol_min)
volume = 0.0;
if(volume > vol_max)
volume = vol_max;
volume = NormalizeDouble(volume, 2);
PrintFormat("LOT_NORMALIZE symbol=%s raw=%.6f normalized=%.2f min=%.2f max=%.2f step=%.2f",
symbol,
raw_volume,
volume,
vol_min,
vol_max,
vol_step);
return volume;
}この例では、raw_volumeをvolume stepで切り下げ、最小ロット未満なら0として発注しない判断にしています。実際のEAでは、最小ロット未満を発注停止にするのか、最小ロットへ引き上げるのかを仕様として決めてください。
point・digits・pipsを混同しない
MQL5でSL/TP距離やスプレッドを扱う時は、point、digits、pipsを混同しないことが重要です。MQL5上の価格計算では、基本的にpointとdigitsを使って銘柄の価格単位を確認します。
FX通貨ペア、GOLD / XAUUSD、指数、仮想通貨CFDでは、価格の桁やpointの感覚が違うことがあります。たとえば、USDJPYの1 pointとXAUUSDの1 pointでは、価格上の見え方や損益感覚が異なる場合があります。
EAのinputで「pips」と書いていても、内部ではpoint換算で扱っている場合があります。読者や利用者に見せる表記と、MQL5内部で使う単位を混同しないようにしてください。
| 項目 | 意味 | 注意点 |
|---|---|---|
| digits | 銘柄価格の小数桁。 | 価格表示や丸めに使います。 |
| point | 価格の最小単位。 | SL/TP距離、スプレッド、stops level確認に使います。 |
| pips | 取引上の慣用的な値幅表現。 | MQL5内部のpointと必ず一致するとは限りません。 |
| tick size | 実際の最小価格変動幅。 | pointと同じとは限らないため確認します。 |
| tick value | tick size分動いた時の価値。 | 損益計算や銘柄比較で確認します。 |
tick size・tick value・contract sizeを確認する
tick size、tick value、contract sizeは、銘柄ごとの損益感覚や証拠金計算を確認する時に重要です。特にGOLD / XAUUSD、指数、仮想通貨CFDのように、通貨ペアとは価格単位や契約サイズの感覚が異なる銘柄では確認が必要です。
tick sizeは最小変動幅、tick valueはその変動幅に対する価値、contract sizeは1ロットあたりの契約サイズです。EAのロット計算や損益見込みを作る場合、これらの値を固定で考えず、SymbolInfoDoubleで取得する前提にしてください。
| プロパティ | 意味 | 使いどころ |
|---|---|---|
SYMBOL_TRADE_TICK_SIZE | 最小価格変動幅。 | 価格がどの刻みで動くか確認します。 |
SYMBOL_TRADE_TICK_VALUE | 1 tickの価値。 | 損益見込みやリスク計算の参考にします。 |
SYMBOL_TRADE_CONTRACT_SIZE | 1ロットあたりの契約サイズ。 | 銘柄差、証拠金、損益感覚の確認に使います。 |
SYMBOL_POINT | 価格のpoint単位。 | 距離計算やスプレッド確認に使います。 |
SYMBOL_DIGITS | 価格の小数桁。 | 価格丸めに使います。 |
損益計算やリスク計算を厳密に扱うEAでは、tick valueやcontract sizeだけでなく、口座通貨、銘柄の利益通貨、換算レート、手数料、スワップも関係する場合があります。単純な固定式だけで全銘柄へ対応できるとは限らないため、検証ログで確認することが重要です。
stops levelとfreeze levelの違い
SL/TPや指値注文、トレーリング、PositionModifyを扱うEAでは、stops levelとfreeze levelを確認します。stops levelは、SL/TPや指値・逆指値を置く時の最小距離に関係します。freeze levelは、現在価格に近い注文やポジション変更が制限される距離に関係します。
invalid stops が出る場合、SL/TPの価格が近すぎる、point換算を間違えている、BUYとSELLでSL/TPの方向を誤っている、digitsの丸めが合っていない、といった原因が考えられます。
| 項目 | 意味 | 影響する処理 |
|---|---|---|
| stops level | SL/TPや予約注文を置く時の最小距離に関係します。 | 新規注文、SL/TP設定、指値・逆指値。 |
| freeze level | 現在価格に近い注文やポジション変更の制限に関係します。 | PositionModify、トレーリング、建値移動。 |
| SL距離 | 現在価格からSLまでの距離。 | 損切り設定の妥当性確認。 |
| TP距離 | 現在価格からTPまでの距離。 | 利確設定の妥当性確認。 |
| 価格丸め | digitsに合わせた価格補正。 | 発注価格、SL/TP価格、変更価格。 |
SL/TP距離を確認する基本コード例
SL/TP距離を確認する時は、現在価格、point、stops level、freeze levelを使って距離を確認します。BUYとSELLでは、SL/TPの位置関係が逆になるため、方向ごとに分けて確認してください。
bool CheckStopsDistance(string symbol, ENUM_ORDER_TYPE order_type, double sl, double tp)
{
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
int stops_level = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
int freeze_level = (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
double base_price = (order_type == ORDER_TYPE_BUY) ? ask : bid;
double sl_points = (sl > 0.0) ? MathAbs(base_price - sl) / point : 0.0;
double tp_points = (tp > 0.0) ? MathAbs(tp - base_price) / point : 0.0;
bool sl_ok = (sl <= 0.0 || sl_points >= stops_level);
bool tp_ok = (tp <= 0.0 || tp_points >= stops_level);
PrintFormat("STOPS_CHECK symbol=%s type=%d price=%.*f sl=%.*f tp=%.*f sl_points=%.1f tp_points=%.1f stops=%d freeze=%d sl_ok=%s tp_ok=%s",
symbol,
order_type,
digits,
base_price,
digits,
sl,
digits,
tp,
sl_points,
tp_points,
stops_level,
freeze_level,
sl_ok ? "Y" : "N",
tp_ok ? "Y" : "N");
return (sl_ok && tp_ok);
}この例は、SL/TP距離がstops levelを満たしているかを確認するための簡略例です。実際のEAでは、BUYとSELLの方向、現在価格、価格丸め、予約注文、freeze level、ブローカー仕様もあわせて確認してください。
OrderCalcMarginで必要証拠金を確認する
OrderCalcMarginは、指定した注文条件で必要証拠金を計算するために使います。発注前に必要証拠金を確認しておくと、証拠金不足による注文失敗を切り分けやすくなります。
証拠金確認では、注文方向、銘柄、ロット、価格を指定し、必要証拠金を計算します。そのうえで、AccountInfoDoubleで取得できる余剰証拠金などと比較します。OrderCheckと組み合わせることで、発注前チェックの信頼性を高めやすくなります。
bool CheckMarginBeforeOrder(string symbol, ENUM_ORDER_TYPE order_type, double volume)
{
double price = (order_type == ORDER_TYPE_BUY)
? SymbolInfoDouble(symbol, SYMBOL_ASK)
: SymbolInfoDouble(symbol, SYMBOL_BID);
double margin = 0.0;
ResetLastError();
bool ok = OrderCalcMargin(order_type, symbol, volume, price, margin);
double free_margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
PrintFormat("MARGIN_CHECK symbol=%s type=%d volume=%.2f price=%.5f ok=%s required=%.2f free=%.2f last_error=%d",
symbol,
order_type,
volume,
price,
ok ? "Y" : "N",
margin,
free_margin,
GetLastError());
if(!ok)
return false;
return (free_margin > margin);
}この例では、OrderCalcMarginで必要証拠金を確認し、余剰証拠金と比較しています。実際には、証拠金が足りるかどうかだけでなく、発注後の余力、最大ポジション数、日次停止、ナンピンEAの追加余力なども設計上確認します。
OrderCheckとの関係
OrderCheckは、MqlTradeRequestで作成した注文リクエストについて、注文前に確認するための関数です。ロット、価格、証拠金、SL/TPなどの確認結果をMqlTradeCheckResultで受け取れます。
OrderCalcMarginは必要証拠金の確認に使いやすく、OrderCheckは注文リクエスト全体の確認に使いやすいという違いがあります。EAの発注前チェックでは、SymbolInfoで銘柄仕様を確認し、ロットやSL/TPを整え、必要に応じてOrderCalcMarginやOrderCheckで最終確認する流れが実務的です。
| 確認方法 | 主な役割 | 確認できること |
|---|---|---|
| SymbolInfoDouble / SymbolInfoInteger | 銘柄仕様の取得。 | ロット、point、digits、tick value、stops levelなど。 |
| OrderCalcMargin | 必要証拠金の計算。 | 指定ロットで必要な証拠金。 |
| OrderCheck | 注文リクエストの事前確認。 | retcode、margin、margin_free、commentなど。 |
| OrderSend / CTrade | 実際の注文送信。 | 注文結果、retcode、order、deal、comment。 |
| Expertsログ | EA側の判断記録。 | 発注前チェック、見送り理由、注文結果。 |
CTradeやOrderSendの前に確認すること
CTradeのBuy / SellやOrderSendを呼び出す前には、EA側で発注前チェックを行います。シグナルが出たからすぐ注文するのではなく、スプレッド、ロット、証拠金、SL/TP距離、最大ポジション数、取引可否を確認します。
この発注前チェックを分けておくと、注文できない時に「シグナルが出ていない」のか、「発注前チェックで止めた」のか、「CTradeやOrderSendで失敗した」のかを切り分けやすくなります。
| 工程 | 確認内容 | ログ例 |
|---|---|---|
| signal | BUY / SELL候補があるか。 | SIGNAL side=BUY reason=MA_CROSS |
| filter | スプレッド、時間帯、最大ポジション数。 | FILTER_BLOCK reason=SPREAD |
| lot | ロットがvolume stepに合っているか。 | LOT_NORMALIZE raw=0.037 lot=0.03 |
| stops | SL/TPがstops levelを満たすか。 | STOPS_CHECK sl_ok=Y tp_ok=Y |
| margin | 必要証拠金を満たすか。 | MARGIN_CHECK required=12000 free=15000 |
| execution | CTradeまたはOrderSendを実行する。 | ORDER_SEND retcode=10009 |
GOLD / XAUUSD対応EAで特に注意すること
GOLD / XAUUSD対応EAでは、通貨ペアと同じ感覚でロット、point、digits、tick value、contract sizeを扱うと誤りが起きやすくなります。ブローカーによって銘柄名、桁数、contract size、最小ロット、スプレッド、StopLevelが異なる場合があります。
たとえば、XAUUSD、GOLD、GOLDmicro、XAUUSDmのように銘柄名が異なる場合があります。EA側で固定銘柄名を前提にしていると、チャートへ適用できても、実際の発注や銘柄仕様取得で問題が出る可能性があります。
GOLD / XAUUSDではスプレッドが広がりやすい時間帯や、価格変動が大きい局面もあります。短期EA、スキャルピングEA、ナンピンEA、グリッドEAでは、ロット、証拠金、スプレッド、StopLevel、最大ポジション数、証拠金維持率を特に慎重に確認してください。
| 確認項目 | GOLD / XAUUSDでの注意点 | 確認方法 |
|---|---|---|
| 銘柄名 | ブローカーにより末尾記号や名称が異なる場合があります。 | チャート銘柄、Market Watch、_Symbolを確認します。 |
| digits / point | 価格桁の感覚が通貨ペアと異なる場合があります。 | SymbolInfoInteger / SymbolInfoDoubleで確認します。 |
| tick value | 損益感覚が通貨ペアと異なる場合があります。 | SYMBOL_TRADE_TICK_VALUEを確認します。 |
| contract size | 1ロットあたりの契約サイズが重要です。 | SYMBOL_TRADE_CONTRACT_SIZEを確認します。 |
| spread | 時間帯や相場状況で広がる場合があります。 | Bid / Ask差をログに出します。 |
| stops level | SL/TP距離不足で注文失敗する場合があります。 | SYMBOL_TRADE_STOPS_LEVELを確認します。 |
| margin | 必要証拠金が大きくなる場合があります。 | OrderCalcMarginやOrderCheckで確認します。 |
複数銘柄EAでの銘柄仕様確認
複数銘柄EAでは、銘柄ごとに仕様を取得して確認する必要があります。1つの銘柄で取得したvolume step、tick value、stops levelを別銘柄へ使い回すと、注文失敗や損益計算の誤りにつながります。
複数銘柄EAでは、対象銘柄ごとにSymbolInfoを取得し、ログに出す設計が安全です。銘柄ごとに取引可否、必要証拠金、最小ロット、スプレッド、データ取得状態も確認してください。
void PrintSpecsForSymbols(string &symbols[])
{
for(int i = 0; i < ArraySize(symbols); i++)
{
string symbol = symbols[i];
if(!SymbolSelect(symbol, true))
{
PrintFormat("SYMBOL_SELECT_FAIL symbol=%s last_error=%d", symbol, GetLastError());
continue;
}
PrintSymbolSpec(symbol);
}
}複数銘柄を扱う場合、Market Watchに銘柄が表示されていないと、情報取得やデータ取得で失敗することがあります。SymbolSelectで対象銘柄を選択できるか確認し、失敗時はログに残します。
バックテストでロット・証拠金・銘柄仕様を確認する
バックテストでは、EAの損益結果だけでなく、ロット、証拠金、銘柄仕様、SL/TP距離、スプレッド、StopLevel、OrderCheck結果を確認します。バックテストで注文できない場合、ロジックではなく、発注前チェックや銘柄仕様が原因のことがあります。
検証条件として、銘柄、時間足、期間、スプレッド、モデル、初期証拠金、レバレッジ、setファイルを保存してください。特にロット自動計算や証拠金チェックを行うEAでは、初期証拠金や口座条件によって結果が変わる可能性があります。
- EA名とバージョンを記録する
- 使用したsetファイルを保存する
- 銘柄、時間足、期間を記録する
- 初期証拠金、レバレッジ、スプレッド条件を記録する
- volume min / max / stepをログで確認する
- tick size / tick value / contract sizeを確認する
- stops level / freeze levelを確認する
- OrderCalcMarginまたはOrderCheckの結果を確認する
- 発注前チェックで止まった理由を確認する
- バックテスト結果を将来成績保証として扱わない
ログ設計で確認しやすくする
ロット・証拠金・銘柄仕様の確認では、ログ設計が重要です。注文が失敗した時に、どの条件で止まったのかを追えるようにしてください。単に「ORDER NG」と出すだけでは、ロット不正なのか、証拠金不足なのか、stops level不足なのか分かりません。
ログ名は、SYMBOL_SPEC、LOT_CHECK、STOPS_CHECK、MARGIN_CHECK、ORDER_CHECK、ORDER_SENDのように分けると検索しやすくなります。検証時だけ詳細ログを出し、通常運用時は必要な異常ログだけにする設計も有効です。
| ログ名 | 残す内容 | 目的 |
|---|---|---|
SYMBOL_SPEC | vol min/max/step、point、digits、tick value、stops level。 | 銘柄仕様を確認します。 |
LOT_CHECK | raw lot、normalized lot、min、max、step。 | ロット補正を確認します。 |
SPREAD_CHECK | Bid、Ask、spread、max spread。 | スプレッドによる発注停止を確認します。 |
STOPS_CHECK | SL/TP距離、stops level、freeze level。 | invalid stops対策に使います。 |
MARGIN_CHECK | 必要証拠金、余剰証拠金、ロット。 | 証拠金不足を確認します。 |
ORDER_CHECK | OrderCheckのretcode、margin、comment。 | 注文前チェック結果を確認します。 |
ORDER_SEND | OrderSend / CTradeのretcode、order、deal。 | 実際の注文結果を確認します。 |
よくある不具合と確認ポイント
ロット・証拠金・銘柄仕様に関する不具合は、注文できない原因として非常に多い領域です。シグナル条件ばかりを見直しても、銘柄仕様に合わない注文を送っていれば改善しません。
EAが注文しない時は、まずシグナル、フィルター、ロット補正、証拠金、stops level、OrderCheck、OrderSendの順に確認すると、原因を整理しやすくなります。
| 症状 | 確認する場所 | 主な原因候補 |
|---|---|---|
| invalid volume が出る | SYMBOL_VOLUME_MIN / MAX / STEP。 | ロットが最小未満、最大超過、step不一致。 |
| not enough money が出る | OrderCalcMargin、AccountInfoDouble、OrderCheck。 | 証拠金不足、ロット過大、口座条件差。 |
| invalid stops が出る | stops level、freeze level、SL/TP距離。 | SL/TPが近すぎる、価格方向が逆、point換算ミス。 |
| USDJPYでは動くがXAUUSDで失敗する | digits、point、tick value、contract size。 | 銘柄仕様の違いを固定値で処理している。 |
| バックテストと実運用で注文数が違う | スプレッド、取引時間、証拠金、銘柄仕様。 | 検証条件と実環境条件の差。 |
| トレーリングが失敗する | freeze level、StopLevel、現在価格。 | 変更価格が現在価格に近すぎる。 |
| ロット自動計算が想定と違う | tick value、contract size、口座通貨。 | 損益換算や銘柄差を考慮していない。 |
開発依頼前に整理する情報
ロット・証拠金・銘柄仕様に関する不具合を相談する場合は、対象EA、setファイル、銘柄、時間足、注文ロット、エラーログ、OrderCheckログ、OrderSend / CTradeログ、バックテスト条件を整理してください。
「注文できない」だけでは、ロジックが成立していないのか、ロットが不正なのか、証拠金が不足しているのか、SL/TP距離が近すぎるのか、取引不可なのかを判断できません。発注前チェックのログがあると、確認が進めやすくなります。
| 整理する情報 | 内容 | 理由 |
|---|---|---|
| EA名・バージョン | 対象ファイル名、更新日、バージョン。 | 確認対象を特定するため。 |
| setファイル | input設定一式。 | 同じ条件を再現するため。 |
| 銘柄 | USDJPY、XAUUSD、GOLDなど。 | 銘柄仕様が異なるため。 |
| ロット | 要求ロット、補正後ロット。 | volume step不一致を確認するため。 |
| SL/TP | 指定価格、距離、stops level。 | invalid stopsの確認に必要です。 |
| 証拠金 | 必要証拠金、余剰証拠金、初期証拠金。 | 証拠金不足を確認するため。 |
| Expertsログ | 発注前チェック、OrderCheck、OrderSendログ。 | EA側の判断を確認するため。 |
| Journalログ | MT5側の取引・環境ログ。 | プラットフォーム側の状態を確認するため。 |
| 送らない情報 | 口座番号、パスワード、APIキー、Webhook URL。 | 機密情報を保護するため。 |
ロット・証拠金・銘柄仕様の実務チェック表
- SYMBOL_VOLUME_MINを確認した
- SYMBOL_VOLUME_MAXを確認した
- SYMBOL_VOLUME_STEPを確認した
- 要求ロットをvolume stepに合わせて補正している
- 最小ロット未満の場合の扱いを仕様化している
- SYMBOL_POINTとSYMBOL_DIGITSを確認している
- tick size、tick value、contract sizeを確認している
- stops levelとfreeze levelを確認している
- SL/TP距離が銘柄仕様を満たしている
- OrderCalcMarginで必要証拠金を確認している
- OrderCheckまたは発注前チェックの結果をログに出している
- GOLD / XAUUSDなど銘柄差が大きい環境で固定値依存していない
- バックテスト条件とsetファイルを保存している
- 口座情報や認証情報をログへ出していない
よくある質問
MQL5でロット不正が出る時は何を確認しますか?
SYMBOL_VOLUME_MIN、SYMBOL_VOLUME_MAX、SYMBOL_VOLUME_STEPを確認します。EA側で計算したロットが最小ロット以上、最大ロット以下、volume stepに一致しているかを確認してください。
OrderCalcMarginは何のために使いますか?
OrderCalcMarginは、指定した注文条件で必要証拠金を計算するために使います。発注前に必要証拠金と余剰証拠金を比較することで、証拠金不足による注文失敗を切り分けやすくなります。
stops levelとは何ですか?
stops levelは、SL/TPや予約注文を現在価格からどの程度離す必要があるかに関係する値です。SL/TPが近すぎる場合、invalid stops の原因になることがあります。
freeze levelとは何ですか?
freeze levelは、現在価格に近い注文やポジションの変更が制限される距離に関係します。トレーリングストップやPositionModifyが失敗する時は、freeze levelの影響を確認してください。
pointとpipsは同じですか?
必ず同じとは限りません。MQL5内部ではpointとdigitsを使って価格単位を扱う場面が多くあります。EAのinputでpipsと表記していても、内部ではpoint換算が必要な場合があります。
GOLD / XAUUSDでロットやSL/TPが合わない時は何を見ますか?
銘柄名、digits、point、tick value、contract size、volume step、stops level、freeze level、スプレッド、必要証拠金を確認します。通貨ペアと同じ固定値で扱うと失敗しやすくなります。
バックテストで動くのに実運用で注文できない場合は何を確認しますか?
スプレッド、取引時間、証拠金、銘柄仕様、volume step、stops level、実口座の銘柄名、OrderCheck、OrderSend / CTradeのretcodeを確認します。バックテスト条件と実環境条件が一致しているかも確認してください。
関連ページ
ロット・証拠金・銘柄仕様を確認する時は、OrderCheck、CTrade、注文・ポジション管理、時系列データ、デバッグ、バックテスト、GOLD / XAUUSDの銘柄仕様をあわせて確認すると、発注失敗の切り分けがしやすくなります。
| 確認したい内容 | 関連ページ |
|---|---|
| OrderCheckで注文前確認をする | MQL5注文関数・取引構造体辞典 |
| CTradeを使った注文・決済を確認する | MQL5標準ライブラリ・CTrade完全ガイド |
| 注文・ポジション・履歴管理を確認する | MQL5注文・ポジション・履歴管理完全ガイド |
| ログ確認とデバッグを確認する | MQL5デバッグ・ログファースト開発完全ガイド |
| EA設計の責務分離を確認する | MQL5 EA設計パターン完全ガイド |
| MQL5開発環境を確認する | MQL5開発入門 |
| バックテストと最適化を確認する | MT5ストラテジーテスター・最適化完全ガイド |
| 時系列データと価格取得を確認する | MQL5時系列データ・価格取得完全ガイド |
| マルチシンボル対応を確認する | MQL5マルチシンボル・マルチタイムフレーム完全ガイド |
| GOLD / XAUUSDの銘柄仕様を確認する | MQL5でGOLD / XAUUSDの銘柄仕様を確認する方法 |
| GOLD / XAUUSD対応EAの導入前確認をする | GOLD / XAUUSD対応EAの導入前チェックリスト |
| EAログを問い合わせ前に確認する | EAのログを問い合わせ前に確認する方法 |
| 開発依頼前に用意する資料を確認する | MT5開発依頼前に用意する資料まとめ |
| 開発・改修相談の入口を確認する | 開発・改修の相談ページ |
まとめ
MQL5でEAの注文処理を作る時は、ロット、証拠金、銘柄仕様を発注前に確認することが重要です。シグナルが成立していても、volume step、最小ロット、最大ロット、stops level、freeze level、証拠金、取引可否が合っていなければ注文は失敗します。
SymbolInfoDoubleやSymbolInfoIntegerを使い、volume min / max / step、point、digits、tick size、tick value、contract size、stops level、freeze levelを確認してください。OrderCalcMarginやOrderCheckを組み合わせると、必要証拠金や注文前チェックの結果をログで追いやすくなります。
特にGOLD / XAUUSD、指数、仮想通貨CFD、複数銘柄EAでは、銘柄ごとの仕様差を固定値で処理しないことが重要です。バックテストや不具合調査では、setファイル、検証条件、銘柄仕様ログ、OrderCheckログ、OrderSend / CTradeログを保存し、注文できない理由を段階ごとに確認してください。
