技術辞典

MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方|銘柄仕様と発注前チェック

EAファンクラブ

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の役割
  • 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_POINTSymbolInfoDouble価格差、pips換算、SL / TP距離確認
SYMBOL_DIGITSSymbolInfoInteger価格表示桁数、NormalizeDouble確認
SYMBOL_VOLUME_MINSymbolInfoDouble最小ロット確認
SYMBOL_VOLUME_MAXSymbolInfoDouble最大ロット確認
SYMBOL_VOLUME_STEPSymbolInfoDoubleロット刻み確認
SYMBOL_SPREADSymbolInfoInteger現在スプレッド確認
SYMBOL_TRADE_STOPS_LEVELSymbolInfoIntegerSL / TPや保留注文価格の最小距離確認
SYMBOL_TRADE_FREEZE_LEVELSymbolInfoInteger注文変更や決済制限の確認
SYMBOL_FILLING_MODESymbolInfoIntegerFOK / IOCなどの約定方式確認
SYMBOL_TRADE_MODESymbolInfoInteger取引可能状態の確認

特に、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 levelSL/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 levelSL / TPや保留注文価格の最小距離を確認するSYMBOL_TRADE_STOPS_LEVEL
filling modeFOK / 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が使えるか
現在価格SymbolInfoTickBid / 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_SIZEtick size価格刻み、銘柄仕様確認
double系SYMBOL_TRADE_TICK_VALUEtick value損益計算、リスク確認
double系SYMBOL_VOLUME_MIN / STEP / MAXロット最小値、刻み、最大値ロット正規化、発注前validation
integer系SYMBOL_DIGITS価格桁数NormalizeDouble、ログ表示
integer系SYMBOL_SPREAD現在スプレッドスプレッド制限、発注見送り判定
integer系SYMBOL_TRADE_STOPS_LEVELSL/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_LEVELSL/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_volumeLOT_RAWロット計算式の結果を確認する
刻み補正volume_stepLOT_STEP_NORMALIZEvolume stepに合っているか確認する
最小制限volume_minLOT_MIN_CLAMP最小ロット未満を補正したか確認する
最大制限volume_maxLOT_MAX_CLAMP最大ロット超過を制限したか確認する
発注直前final_volumeLOT_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_OKpoint、digits、volume step、stop level初期化時の銘柄仕様確認
SYMBOL_SPEC_NGpointやvolume stepが不正銘柄仕様取得失敗の確認
SYMBOL_TICK_OKBid、Ask、Last、tick time現在価格の確認
VOLUME_NORMALIZE要求ロットと正規化後ロットロット刻み確認
STOP_DISTANCE_CHECKSL / TP距離とstop level価格距離確認
SPREAD_CHECKBid、Ask、spread、最大値スプレッドフィルター確認
FILLING_SUPPORTSYMBOL_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系で取得した銘柄仕様ログを合わせて確認してください。

MT4/MT5の開発・改修相談はこちら

まとめ

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不足を追跡しやすくなります。

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