MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方|銘柄仕様と発注前チェック
MQL5でEAの発注処理やリスク確認を作る時は、対象銘柄の仕様を正しく取得する必要があります。
同じMT5でも、通貨ペア、GOLD / XAUUSD、CFD、指数、仮想通貨系銘柄では、point、digits、最小ロット、ロット刻み、stop level、spread、約定方式などが異なる場合があります。
SymbolInfoDouble、SymbolInfoInteger、SymbolInfoTickは、MQL5で銘柄情報や現在価格を確認するためによく使う関数です。EAが注文できない、ロットが合わない、SL / TPが近すぎる、GOLDだけ挙動が違う、といった問題では、これらの関数で取得した銘柄仕様ログが重要になります。
このページでは、MQL5のSymbolInfoDouble、SymbolInfoInteger、SymbolInfoTickを使って、銘柄仕様、Bid / Ask、point、digits、volume step、stop level、発注前チェックを確認する方法を整理します。
なお、このページはMQL5開発における技術確認を目的とした内容です。売買判断、推奨エントリー、推奨ロット、利益保証、損失回避保証を行うものではありません。
- この記事で確認すること
- SymbolInfoDoubleとは何か
- SymbolInfoIntegerとは何か
- SymbolInfoTickとは何か
- よく使う銘柄仕様
- 銘柄仕様をまとめてログ出力する
- 銘柄仕様はOrderCalcMarginやOrderCheckの前提になる
- ロット正規化で使う
- SL / TP距離確認で使う
- スプレッド確認で使う
- SymbolInfoTickとBid / Askの確認
- GOLD / XAUUSDやCFDで注意すること
- 発注前チェックで見る項目
- SymbolInfoDoubleとSymbolInfoIntegerを混同しない
- 成行注文前に確認するSymbolInfo値
- ロット正規化とSymbolInfoの接続
- バックテスト・デモ・リアル口座で差が出る項目
- SymbolInfo確認の実務チェック表
- SymbolInfo系ログで確認したい項目
- ログ出力例
- よくある失敗パターン
- 関連ページ
- 銘柄仕様と発注前チェック全体を確認する場合
- 開発依頼前に整理したい情報
- まとめ
この記事で確認すること
- SymbolInfoDouble / SymbolInfoInteger / SymbolInfoTickの役割
- point、digits、tick size、tick valueの確認
- volume min / volume step / volume maxの確認
- stops level、freeze level、trade modeの確認
- Bid / Askとスプレッドの確認
- OrderCalcMargin / OrderCheck前に確認する銘柄仕様
- GOLD / XAUUSDやCFDで注意する銘柄仕様
- 銘柄仕様ログと発注前チェックの分け方
SymbolInfoDoubleとは何か
SymbolInfoDoubleは、指定した銘柄のdouble型プロパティを取得する関数です。
EAでは、point、tick size、tick value、最小ロット、最大ロット、ロット刻みなど、小数値で扱う銘柄仕様の取得に使います。
void PrintSymbolDoubleSpec(const string symbol)
{
ResetLastError();
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
double tick_size = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
double tick_value = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double volume_min = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double volume_max = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double volume_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
PrintFormat("[SYMBOL_DOUBLE_SPEC] symbol=%s point=%.8f tick_size=%.8f tick_value=%.5f vol_min=%.2f vol_max=%.2f vol_step=%.2f last_error=%d",
symbol,
point,
tick_size,
tick_value,
volume_min,
volume_max,
volume_step,
GetLastError());
}取得した値が0や想定外の場合は、そのまま発注計算へ使わず、銘柄仕様ログとGetLastErrorを確認してください。
SymbolInfoIntegerとは何か
SymbolInfoIntegerは、指定した銘柄の整数系プロパティを取得する関数です。
EAでは、digits、spread、stop level、freeze level、trade mode、filling mode、execution modeなどの確認に使います。
void PrintSymbolIntegerSpec(const string symbol)
{
ResetLastError();
long digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
long spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD);
long stops_level = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
long freeze_level = SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
long trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
long filling_mode = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
PrintFormat("[SYMBOL_INTEGER_SPEC] symbol=%s digits=%d spread=%d stops_level=%d freeze_level=%d trade_mode=%d filling_mode=%d last_error=%d",
symbol,
(int)digits,
(int)spread,
(int)stops_level,
(int)freeze_level,
(int)trade_mode,
(int)filling_mode,
GetLastError());
}注文エラーを調査する時は、OrderSend結果だけでなく、SYMBOL_TRADE_STOPS_LEVEL、SYMBOL_TRADE_FREEZE_LEVEL、SYMBOL_FILLING_MODEも確認してください。
SymbolInfoTickとは何か
SymbolInfoTickは、指定した銘柄の現在価格情報をMqlTick構造体へ取得する関数です。
Bid、Ask、Last、Volume、時刻をまとめて確認したい場合に使います。成行注文前の価格確認や、発注前ログではSymbolInfoTickを使うと整理しやすくなります。
bool PrintCurrentTick(const string symbol)
{
MqlTick tick = {};
ResetLastError();
if(!SymbolInfoTick(symbol, tick))
{
PrintFormat("[SYMBOL_TICK_NG] symbol=%s last_error=%d",
symbol,
GetLastError());
return false;
}
PrintFormat("[SYMBOL_TICK_OK] symbol=%s time=%s bid=%.5f ask=%.5f last=%.5f volume=%I64d",
symbol,
TimeToString((datetime)tick.time, TIME_DATE|TIME_SECONDS),
tick.bid,
tick.ask,
tick.last,
tick.volume);
return true;
}BidとAskを別々に取得するより、同じタイミングのtick情報をまとめて確認したい場合はSymbolInfoTickが便利です。
よく使う銘柄仕様
EA開発でよく確認する銘柄仕様は、発注前チェック、ロット正規化、SL / TP距離確認、スプレッド確認、約定方式確認に関係します。
| 項目 | 取得例 | 確認用途 |
|---|---|---|
| SYMBOL_POINT | SymbolInfoDouble | 価格差、pips換算、SL / TP距離確認 |
| SYMBOL_DIGITS | SymbolInfoInteger | 価格表示桁数、NormalizeDouble確認 |
| SYMBOL_VOLUME_MIN | SymbolInfoDouble | 最小ロット確認 |
| SYMBOL_VOLUME_MAX | SymbolInfoDouble | 最大ロット確認 |
| SYMBOL_VOLUME_STEP | SymbolInfoDouble | ロット刻み確認 |
| SYMBOL_SPREAD | SymbolInfoInteger | 現在スプレッド確認 |
| SYMBOL_TRADE_STOPS_LEVEL | SymbolInfoInteger | SL / TPや保留注文価格の最小距離確認 |
| SYMBOL_TRADE_FREEZE_LEVEL | SymbolInfoInteger | 注文変更や決済制限の確認 |
| SYMBOL_FILLING_MODE | SymbolInfoInteger | FOK / IOCなどの約定方式確認 |
| SYMBOL_TRADE_MODE | SymbolInfoInteger | 取引可能状態の確認 |
特に、GOLD / XAUUSDやCFDでは、point、digits、tick value、contract size、volume stepが通貨ペアと異なることがあります。
銘柄仕様をまとめてログ出力する
EAのOnInitでは、対象銘柄の主要仕様をまとめてログへ出しておくと、問い合わせ時やバックテスト時に確認しやすくなります。
bool PrintSymbolSpecSummary(const string symbol)
{
ResetLastError();
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
double tick_size = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_SIZE);
double tick_value = SymbolInfoDouble(symbol, SYMBOL_TRADE_TICK_VALUE);
double volume_min = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double volume_max = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double volume_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
long digits = SymbolInfoInteger(symbol, SYMBOL_DIGITS);
long spread = SymbolInfoInteger(symbol, SYMBOL_SPREAD);
long stops_level = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
long freeze_level = SymbolInfoInteger(symbol, SYMBOL_TRADE_FREEZE_LEVEL);
long trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
long filling_mode = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
if(point <= 0.0 || volume_min <= 0.0 || volume_step <= 0.0)
{
PrintFormat("[SYMBOL_SPEC_NG] symbol=%s point=%.8f vol_min=%.2f vol_step=%.2f last_error=%d",
symbol,
point,
volume_min,
volume_step,
GetLastError());
return false;
}
PrintFormat("[SYMBOL_SPEC_OK] symbol=%s digits=%d point=%.8f tick_size=%.8f tick_value=%.5f vol_min=%.2f vol_max=%.2f vol_step=%.2f spread=%d stops_level=%d freeze_level=%d trade_mode=%d filling_mode=%d",
symbol,
(int)digits,
point,
tick_size,
tick_value,
volume_min,
volume_max,
volume_step,
(int)spread,
(int)stops_level,
(int)freeze_level,
(int)trade_mode,
(int)filling_mode);
return true;
}このような初期化ログを出しておくと、EAが動かない原因が、銘柄仕様なのか、発注条件なのか、設定値なのかを切り分けやすくなります。
銘柄仕様はOrderCalcMarginやOrderCheckの前提になる
SymbolInfoDouble / SymbolInfoIntegerで取得する銘柄仕様は、発注前チェックの基礎になります。
point、digits、tick value、contract size、volume min、volume step、stop level、freeze levelを確認しておかないと、OrderCalcMarginやOrderCheckの結果を正しく読めない場合があります。
| 確認項目 | 発注前チェックでの意味 |
|---|---|
| point / digits | 価格単位、SL/TP、スプレッド、ナンピン幅の換算に使う |
| volume min / step | ロットの最小値、丸め、注文可能ロットの確認に使う |
| tick value / contract size | 損益計算、必要証拠金、GOLD / XAUUSDの仕様確認に使う |
| stop level / freeze level | SL/TPや注文変更が可能かを確認するために使う |
必要証拠金や想定損益を確認する場合は、MQL5 OrderCalcMargin / OrderCalcProfitの使い方を確認してください。
注文条件の妥当性確認は、MQL5 OrderCheckの使い方、GOLD / XAUUSDの銘柄仕様を実務的に整理する場合は、MQL5でGOLD / XAUUSDの銘柄仕様を確認する方法も参考になります。
ロット正規化で使う
EAでロットを計算する場合は、SYMBOL_VOLUME_MIN、SYMBOL_VOLUME_MAX、SYMBOL_VOLUME_STEPを確認します。
計算上は0.013ロットになっても、対象銘柄のvolume stepが0.01であれば、発注可能な値へ丸める必要があります。
double NormalizeVolumeBySymbol(const string symbol,
const double requested_volume)
{
double volume_min = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
double volume_max = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
double volume_step = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
if(volume_min <= 0.0 || volume_step <= 0.0)
{
PrintFormat("[VOLUME_SPEC_NG] symbol=%s vol_min=%.2f vol_step=%.2f",
symbol,
volume_min,
volume_step);
return 0.0;
}
double volume = requested_volume;
if(volume < volume_min)
volume = volume_min;
if(volume > volume_max)
volume = volume_max;
volume = MathFloor(volume / volume_step) * volume_step;
volume = NormalizeDouble(volume, 2);
PrintFormat("[VOLUME_NORMALIZE] symbol=%s requested=%.4f normalized=%.4f min=%.2f max=%.2f step=%.2f",
symbol,
requested_volume,
volume,
volume_min,
volume_max,
volume_step);
return volume;
}実際には、銘柄ごとの桁数やブローカー仕様に合わせて丸め桁を調整してください。ロット正規化は、発注前チェックとセットで確認するのが安全です。
SL / TP距離確認で使う
SL / TPや保留注文価格を指定する場合は、SYMBOL_TRADE_STOPS_LEVELを確認します。
現在価格から近すぎるSL / TPを指定すると、OrderCheckやOrderSendで拒否される場合があります。
bool CheckStopDistance(const string symbol,
const double entry_price,
const double sl_price)
{
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
long stops_level = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
if(point <= 0.0)
{
PrintFormat("[STOP_DISTANCE_NG] symbol=%s reason=point_invalid point=%.8f",
symbol,
point);
return false;
}
double distance_points = MathAbs(entry_price - sl_price) / point;
bool ok = (distance_points >= (double)stops_level);
PrintFormat("[STOP_DISTANCE_CHECK] symbol=%s entry=%.5f sl=%.5f distance_points=%.1f stops_level=%d ok=%s",
symbol,
entry_price,
sl_price,
distance_points,
(int)stops_level,
(ok ? "true" : "false"));
return ok;
}stop levelは、銘柄やブローカー環境によって異なります。SL / TP、保留注文、注文変更では、価格距離の確認をログ化してください。
スプレッド確認で使う
最大スプレッドフィルターを作る場合は、SymbolInfoIntegerのSYMBOL_SPREADや、SymbolInfoTickのBid / Ask差を使って確認します。
どちらを使うかはEA仕様に合わせますが、ログでは基準を明確にしてください。
bool IsSpreadAllowed(const string symbol,
const int max_spread_points)
{
MqlTick tick = {};
if(!SymbolInfoTick(symbol, tick))
{
PrintFormat("[SPREAD_CHECK_NG] symbol=%s reason=tick_not_available last_error=%d",
symbol,
GetLastError());
return false;
}
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
if(point <= 0.0)
{
PrintFormat("[SPREAD_CHECK_NG] symbol=%s reason=point_invalid", symbol);
return false;
}
int spread_points = (int)MathRound((tick.ask - tick.bid) / point);
bool allowed = (spread_points <= max_spread_points);
PrintFormat("[SPREAD_CHECK] symbol=%s bid=%.5f ask=%.5f spread=%d max=%d allowed=%s",
symbol,
tick.bid,
tick.ask,
spread_points,
max_spread_points,
(allowed ? "true" : "false"));
return allowed;
}スプレッド確認では、points、pips、価格差を混同しないようにしてください。GOLD / XAUUSDでは、pointの意味をログで確認しておくと誤解を減らせます。
SymbolInfoTickとBid / Askの確認
成行注文では、BUYならAsk、SELLならBidを基準に確認する場面が多くあります。
SymbolInfoTickを使うと、BidとAskを同じtick情報として取得できます。
bool GetBidAsk(const string symbol,
double &bid,
double &ask)
{
MqlTick tick = {};
ResetLastError();
if(!SymbolInfoTick(symbol, tick))
{
PrintFormat("[BIDASK_NG] symbol=%s last_error=%d",
symbol,
GetLastError());
return false;
}
bid = tick.bid;
ask = tick.ask;
PrintFormat("[BIDASK_OK] symbol=%s bid=%.5f ask=%.5f time=%s",
symbol,
bid,
ask,
TimeToString((datetime)tick.time, TIME_DATE|TIME_SECONDS));
return true;
}発注前ログでは、order type、Bid、Ask、spread、point、volume、SL / TPをまとめて出すと、注文エラーの原因を追いやすくなります。
GOLD / XAUUSDやCFDで注意すること
GOLD / XAUUSDやCFDでは、通貨ペアと同じ感覚でpoint、pip、tick value、contract size、volume stepを扱うと、リスク計算やSL / TP幅の確認がずれる場合があります。
| 確認項目 | 確認理由 | ログ例 |
|---|---|---|
| point | 価格差をpointsへ変換する基準 | SYMBOL_POINT |
| digits | 価格表示桁数を確認する | SYMBOL_DIGITS |
| tick value | 損益計算やリスク目安に関係する | SYMBOL_TRADE_TICK_VALUE |
| tick size | 価格変動単位を確認する | SYMBOL_TRADE_TICK_SIZE |
| volume step | 発注可能なロット刻みを確認する | SYMBOL_VOLUME_STEP |
| stop level | SL / TPや保留注文価格の最小距離を確認する | SYMBOL_TRADE_STOPS_LEVEL |
| filling mode | FOK / IOCなどの約定方式を確認する | SYMBOL_FILLING_MODE |
GOLD / XAUUSD対応EAでは、OnInit時に銘柄仕様をログへ出し、setファイルの値と実際の銘柄仕様が合っているか確認してください。
発注前チェックで見る項目
SymbolInfo系の値は、OrderSend前の発注前チェックで使います。
発注前に、ロット、スプレッド、SL / TP距離、取引可能状態、約定方式、Bid / Askを確認しておくと、注文エラーの原因を分けやすくなります。
| チェック項目 | 使用する情報 | 確認すること |
|---|---|---|
| ロット | SYMBOL_VOLUME_MIN / MAX / STEP | 発注可能なロットか |
| スプレッド | SYMBOL_SPREAD または Bid / Ask差 | 最大スプレッド以内か |
| SL / TP距離 | SYMBOL_POINT / SYMBOL_TRADE_STOPS_LEVEL | 価格距離が近すぎないか |
| 注文変更制限 | SYMBOL_TRADE_FREEZE_LEVEL | 変更・決済制限にかからないか |
| 取引可否 | SYMBOL_TRADE_MODE | 銘柄が取引可能か |
| 約定方式 | SYMBOL_FILLING_MODE | 指定fillingが使えるか |
| 現在価格 | SymbolInfoTick | Bid / Askが取得できているか |
発注前チェックでは、NGになった理由をログ名で分けてください。単に「OrderSend failed」と出すだけでは、ロット、スプレッド、stop level、filling modeのどこで問題が起きたのか分かりにくくなります。
SymbolInfoDoubleとSymbolInfoIntegerを混同しない
SymbolInfoDoubleとSymbolInfoIntegerは、どちらも銘柄仕様を取得する関数ですが、取得できるプロパティの型が異なります。double型で取得する値とinteger / long / bool系で取得する値を混同すると、コンパイル上は見えても、実装上の意味が分かりにくくなります。
たとえば、SYMBOL_POINTやSYMBOL_VOLUME_STEPは小数値として扱うためSymbolInfoDoubleで確認します。一方、SYMBOL_DIGITS、SYMBOL_SPREAD、SYMBOL_TRADE_STOPS_LEVEL、SYMBOL_TRADE_FREEZE_LEVELなどはSymbolInfoIntegerで確認します。
| 分類 | 代表プロパティ | 確認する内容 | 主な用途 |
|---|---|---|---|
| double系 | SYMBOL_POINT | 価格の最小単位 | SL/TP距離、スプレッド換算、point計算 |
| double系 | SYMBOL_TRADE_TICK_SIZE | tick size | 価格刻み、銘柄仕様確認 |
| double系 | SYMBOL_TRADE_TICK_VALUE | tick value | 損益計算、リスク確認 |
| double系 | SYMBOL_VOLUME_MIN / STEP / MAX | ロット最小値、刻み、最大値 | ロット正規化、発注前validation |
| integer系 | SYMBOL_DIGITS | 価格桁数 | NormalizeDouble、ログ表示 |
| integer系 | SYMBOL_SPREAD | 現在スプレッド | スプレッド制限、発注見送り判定 |
| integer系 | SYMBOL_TRADE_STOPS_LEVEL | SL/TP最小距離 | INVALID_STOPS対策 |
| integer系 | SYMBOL_TRADE_MODE | 取引可否状態 | 銘柄停止、close only、disabled確認 |
成行注文前に確認するSymbolInfo値
EAの成行注文前チェックでは、現在価格だけでなく、ロット刻み、stop level、freeze level、trade mode、filling mode、スプレッドを確認します。これらを確認せずにOrderSendやCTrade.Buy / Sellへ進むと、注文エラーの原因が追いにくくなります。
特に、GOLD / XAUUSD、CFD、指数、仮想通貨系銘柄では、通貨ペアと同じ前提で距離やロットを扱うと、ロット不正、SL/TP距離不正、証拠金不足、想定損益のズレが起きやすくなります。
| 発注前に見る値 | 確認目的 | 不備がある時の症状 |
|---|---|---|
| Bid / Ask | 成行注文価格とスプレッド確認 | 価格0、古いtick、スプレッド異常 |
| SYMBOL_POINT | 価格距離の基準確認 | SL/TP距離、トレーリング幅がずれる |
| SYMBOL_DIGITS | 価格桁数の確認 | ログ表示やNormalizeDoubleが不自然 |
| SYMBOL_VOLUME_STEP | ロット刻み確認 | invalid volume、ロット丸め不整合 |
| SYMBOL_TRADE_STOPS_LEVEL | SL/TP最小距離確認 | invalid stops、SL/TP設定失敗 |
| SYMBOL_TRADE_FREEZE_LEVEL | 変更制限距離確認 | 決済・変更・トレーリング失敗 |
| SYMBOL_TRADE_MODE | 銘柄の取引可否確認 | 取引停止、close only、発注不可 |
| SYMBOL_FILLING_MODE | 許可される約定方式確認 | unsupported filling mode |
ロット正規化とSymbolInfoの接続
EAで計算したロットは、そのまま発注可能ロットとは限りません。銘柄ごとに、最小ロット、最大ロット、ロット刻みが決まっているため、SymbolInfoDoubleで仕様を取得し、発注前に正規化する必要があります。
ログでは、計算直後のraw volume、銘柄仕様に合わせて丸めたnormalized volume、最小・最大ロットによる制限後のfinal volumeを分けて出すと、注文エラーの切り分けがしやすくなります。
| 段階 | 見る値 | ログ例 | 確認目的 |
|---|---|---|---|
| 計算直後 | raw_volume | LOT_RAW | ロット計算式の結果を確認する |
| 刻み補正 | volume_step | LOT_STEP_NORMALIZE | volume stepに合っているか確認する |
| 最小制限 | volume_min | LOT_MIN_CLAMP | 最小ロット未満を補正したか確認する |
| 最大制限 | volume_max | LOT_MAX_CLAMP | 最大ロット超過を制限したか確認する |
| 発注直前 | final_volume | LOT_FINAL | 実際にOrderSendへ渡す値を確認する |
バックテスト・デモ・リアル口座で差が出る項目
SymbolInfo系で取得する銘柄仕様は、ブローカー、口座タイプ、銘柄名、テスト環境によって差が出る場合があります。バックテストで正常でも、デモ口座やリアル口座で同じ値になるとは限りません。
検証時は、バックテスト、デモ、リアルの各環境で、同じsymbolに対してどの値が取得されているかをログに残してください。特に、GOLD / XAUUSDのsuffix違い、StopLevel、FreezeLevel、volume step、tick valueは比較対象になります。
| 比較項目 | バックテスト | デモ/リアルで見ること |
|---|---|---|
| symbol名 | テスターで選んだ銘柄 | suffixやprefixが違わないか |
| spread | 固定または実ティック条件 | 時間帯で拡大しないか |
| stops level | テスター仕様 | 口座タイプで変わらないか |
| freeze level | 再現されにくい場合がある | 変更・決済・トレーリングに影響しないか |
| volume step | 銘柄仕様に依存 | ロット丸めが合っているか |
| tick value | 損益計算に影響 | 口座通貨ベースで想定どおりか |
| trade mode | テスト上は動く場合がある | 取引停止やclose onlyでないか |
SymbolInfo確認の実務チェック表
- 対象symbolをログに出した
- Bid / Ask / spreadを確認した
- pointとdigitsを確認した
- tick sizeとtick valueを確認した
- volume min / step / maxを確認した
- stops levelとfreeze levelを確認した
- trade modeとfilling modeを確認した
- GOLD / XAUUSDやCFDで固定値を前提にしていない
- OrderCalcMargin / OrderCheckへ進む前に銘柄仕様ログを確認した
- バックテスト・デモ・リアルで銘柄仕様差を確認した
SymbolInfo系ログで確認したい項目
SymbolInfoDouble、SymbolInfoInteger、SymbolInfoTickを使う処理では、取得値と判定結果をセットでログに出すと確認しやすくなります。
| ログ名 | 確認内容 | 用途 |
|---|---|---|
| SYMBOL_SPEC_OK | point、digits、volume step、stop level | 初期化時の銘柄仕様確認 |
| SYMBOL_SPEC_NG | pointやvolume stepが不正 | 銘柄仕様取得失敗の確認 |
| SYMBOL_TICK_OK | Bid、Ask、Last、tick time | 現在価格の確認 |
| VOLUME_NORMALIZE | 要求ロットと正規化後ロット | ロット刻み確認 |
| STOP_DISTANCE_CHECK | SL / TP距離とstop level | 価格距離確認 |
| SPREAD_CHECK | Bid、Ask、spread、最大値 | スプレッドフィルター確認 |
| FILLING_SUPPORT | SYMBOL_FILLING_MODE | 約定方式確認 |
通常運用では、銘柄仕様ログはOnInit時、価格やスプレッドログは発注前またはNG時に出すと確認しやすくなります。
ログ出力例
[SYMBOL_SPEC_OK] symbol=GOLD digits=2 point=0.01000000 tick_size=0.01000000 tick_value=1.00000 vol_min=0.01 vol_max=50.00 vol_step=0.01 spread=35 stops_level=50 freeze_level=0 trade_mode=4 filling_mode=3
[SYMBOL_TICK_OK] symbol=GOLD time=2026.05.26 10:15:00 bid=2350.10 ask=2350.45 last=2350.10 volume=12
[VOLUME_NORMALIZE] symbol=GOLD requested=0.0130 normalized=0.0100 min=0.01 max=50.00 step=0.01
[SPREAD_CHECK] symbol=GOLD bid=2350.10 ask=2350.45 spread=35 max=50 allowed=true
[STOP_DISTANCE_CHECK] symbol=GOLD entry=2350.45 sl=2349.80 distance_points=65.0 stops_level=50 ok=true
[FILLING_SUPPORT] symbol=GOLD mode=3 fok=true ioc=trueログ例の銘柄、価格、スプレッド、stop level、volume stepは確認用です。実際の値は、口座、ブローカー、銘柄、取引時間によって変わります。
よくある失敗パターン
| 失敗パターン | 問題点 | 確認方法 |
|---|---|---|
| pointを確認せずpips換算する | GOLDやCFDで距離計算がずれる | SYMBOL_POINTとdigitsをログへ出す |
| volume stepを無視する | 発注できないロットになる | SYMBOL_VOLUME_STEPで正規化する |
| stop levelを見ない | SL / TPが近すぎて注文エラーになる | SYMBOL_TRADE_STOPS_LEVELを確認する |
| Bid / Askを混同する | BUY / SELLの発注価格やスプレッド確認がずれる | SymbolInfoTickでbid / askを同時に出す |
| filling modeを固定する | 銘柄や口座によってOrderSendが失敗する | SYMBOL_FILLING_MODEを確認する |
| 銘柄仕様ログを出さない | 環境差の原因を追えない | OnInitでSYMBOL_SPEC_OKを出す |
| 取得値0をそのまま使う | 未取得・不正値を計算に使う恐れがある | 値の妥当性とGetLastErrorを確認する |
関連ページ
SymbolInfo系は、関数辞典、ロット・証拠金・銘柄仕様、発注前チェック、ORDER_FILLING、OrderSend結果ログと合わせて確認すると整理しやすくなります。
| 関連ページ | 確認できること |
|---|---|
| MQL5関数辞典 | SymbolInfoDouble、SymbolInfoInteger、Copy系関数など主要関数の整理 |
| MQL5 ORDER_FILLINGの違い | FOK、IOC、RETURN、SYMBOL_FILLING_MODEの確認 |
| MQL5 OrderSend結果ログを実コードで解説 | retcode、MqlTradeRequest、MqlTradeResult、注文結果ログの確認 |
| MQL5デバッグ・ログファースト開発完全ガイド | Expertsログ、再現条件、ログ設計の確認 |
銘柄仕様と発注前チェック全体を確認する場合
SymbolInfoDouble、SymbolInfoInteger、SymbolInfoTickは、EAで銘柄仕様や現在価格を確認するために使う関数です。point、digits、volume step、stop level、Bid / Ask、filling modeなどを確認する場合は、ロット・証拠金・発注前チェック全体の流れもあわせて整理すると、注文エラーの原因を追いやすくなります。
| 確認したいこと | 確認するページ | 主な確認内容 |
|---|---|---|
| ロット・証拠金・銘柄仕様の全体を確認したい | MQL5ロット・証拠金・銘柄仕様完全ガイド | ロット、証拠金、point、digits、volume step、stop level、銘柄仕様の確認 |
| EAの発注前チェックを整理したい | MQL5でEAの発注前チェックを作る考え方 | スプレッド、ロット、証拠金、SL / TP距離、取引可否、OrderSend前確認 |
銘柄仕様を確認する時は、取得した値をそのまま使うのではなく、point、digits、volume step、stop level、filling mode、Bid / Ask、GetLastErrorをログで確認してください。GOLD / XAUUSDやCFDでは、通貨ペアと同じ感覚で価格差やロットを扱わないように注意が必要です。
開発依頼前に整理したい情報
SymbolInfo系、銘柄仕様、発注前チェック、GOLD / XAUUSD対応、ロット正規化の実装を相談する場合は、次の情報を整理してください。
| 整理する情報 | 確認内容 |
|---|---|
| 対象EA | 新規EA、既存EA改修、注文エラー調査、銘柄追加対応のどれか |
| 対象銘柄 | GOLD / XAUUSD、USDJPY、CFD、指数、suffix付き銘柄など |
| 取得したい仕様 | point、digits、volume step、tick value、stop level、spreadなど |
| 発注前チェック | ロット、スプレッド、SL / TP距離、約定方式、取引可否 |
| 価格取得 | Bid、Ask、Last、SymbolInfoTickの使用有無 |
| 注文エラー | OrderCheck、OrderSend、retcode、comment、GetLastError |
| ロット計算 | 固定ロット、証拠金計算、リスク計算、ロット丸め |
| ログ | SYMBOL_SPEC_OK、SPREAD_CHECK、VOLUME_NORMALIZE、STOP_DISTANCE_CHECK |
| 検証条件 | デモ / リアル、ブローカー、銘柄仕様、setファイル、再現手順 |
注文エラーや銘柄仕様差を相談する場合は、OrderSendのエラーだけでなく、SymbolInfo系で取得した銘柄仕様ログを合わせて確認してください。
まとめ
SymbolInfoDouble、SymbolInfoInteger、SymbolInfoTickは、MQL5で銘柄仕様や現在価格を確認するための重要な関数です。
SymbolInfoDoubleではpoint、tick value、volume min / max / stepなどの小数値を確認し、SymbolInfoIntegerではdigits、spread、stop level、freeze level、trade mode、filling modeなどを確認します。
成行注文前のBid / Ask確認には、SymbolInfoTickを使うと、同じtick情報として価格を取得しやすくなります。
EA開発では、OnInitで銘柄仕様ログを出し、発注前にはロット、スプレッド、SL / TP距離、約定方式、現在価格を確認してください。これにより、GOLD / XAUUSDやCFDでの注文エラー、ロット不一致、stop level不足を追跡しやすくなります。
