MQL4では、通貨ペアの情報を取得したいとき、

`MarketInfo(symbol, MODE_XXX)`という、

1つの関数さえ覚えておけば、

Bid/Ask・Point・最小ロット・ストップレベルなど、

たいていの値がまとめて取得できました。

ところがMQL5でこのコードをそのまま貼り付けると、

`MarketInfo`という識別子自体が見つからず、コンパイルエラーになります。

MQL5ではMarketInfo()という関数そのものが廃止され、

戻り値の型(double/int・long/string)ごとに、

`SymbolInfoDouble()`・`SymbolInfoInteger()`・

`SymbolInfoString()`という3つの関数へ分かれています。

この記事では、Bid/Ask以外で実務上つまずきやすい「ロットの刻み幅」

と「最小ストップ距離」を例に、3つの関数の使い分けを解説します。

MQL4のMarketInfo(): 1つの関数にMODE定数を渡すだけ

MQL4では、取得したい情報の種類を`MODE_`で始まる定数で指定します。

double point      = MarketInfo(symbol, MODE_POINT);
double digits     = MarketInfo(symbol, MODE_DIGITS);
double stopLevel  = MarketInfo(symbol, MODE_STOPLEVEL);
double minLot     = MarketInfo(symbol, MODE_MINLOT);
double lotStep    = MarketInfo(symbol, MODE_LOTSTEP);

`MarketInfo()`は常にdouble型を返すため、

整数として使いたい値(Digits等)も、

一度double型で受け取ってから丸める必要がありました。

MQL5: 戻り値の型ごとに3つの関数に分かれる

MQL5では、値の型に応じて呼び出す関数自体を変えます。

double SymbolInfoDouble(string symbol, ENUM_SYMBOL_INFO_DOUBLE prop_id);
long   SymbolInfoInteger(string symbol, ENUM_SYMBOL_INFO_INTEGER prop_id);
string SymbolInfoString(string symbol, ENUM_SYMBOL_INFO_STRING prop_id);

MQL4のMODE定数に対応するMQL5側の定数は、次のように整理できます。

  • MarketInfo(symbol, MODE_POINT) → SymbolInfoDouble(symbol, SYMBOL_POINT)
  • MarketInfo(symbol, MODE_DIGITS) → SymbolInfoInteger(symbol, SYMBOL_DIGITS)
  • MarketInfo(symbol, MODE_STOPLEVEL) → SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL)
  • MarketInfo(symbol, MODE_MINLOT/MAXLOT/LOTSTEP) → SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN/MAX/STEP)
  • 通貨ペアの説明文(MQL4に相当関数なし) → SymbolInfoString(symbol, SYMBOL_DESCRIPTION)

DIGITS(桁数)やSTOPLEVEL(ストップ距離)は整数値なので、

MQL5では`SymbolInfoInteger()`が対応する関数になっている点に、

注意してください。

double型の`SymbolInfoDouble()`に渡すと、

型が合わずコンパイルエラーになります。

実務的な落とし穴: ロット刻みとストップ距離を無視すると発注が拒否される

Bid/Askの取得ミスはコンパイル時点でエラーになるため気づきやすい一方、

ロットの刻み幅(`SYMBOL_VOLUME_STEP`)や、

最小ストップ距離(`SYMBOL_TRADE_STOPS_LEVEL`)は、

値を取得しなくてもコンパイルは通ってしまいます。

問題が表面化するのは、実際に発注した瞬間です。

たとえばブローカーのロット刻みが0.01なのに、

コード側で0.015のような刻みに合わないロット数を送ると発注が拒否されますし、

現在値に近すぎる損切り・利確を指定すると、

gc-dc.mdで解説したエラー130(Invalid stops)と、

同じ原因で発注が失敗します。

MQL5のOrderSend(ordersend-mql5.mdで解説した構造体版)を、

使う場合も、

発注前にこの2つの値を確認しておくことで、

実行時になって初めて気づくエラーを未然に防げます。

実際に動くコード全体

通貨ペアの基本情報を表示し、

指定したストップ幅とロット数がこのブローカーの取引条件を満たすかどうかを事前に検証する、

実際にMetaEditorでコンパイルできるスクリプトです。

//+------------------------------------------------------------------+
//|                                    SymbolInfoCheckDemo.mq5        |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property script_show_inputs

input string TargetSymbol    = "";//空欄なら現在チャートの通貨ペア
input int    DesiredStopPips = 5;//発注しようとしている損切り幅(pips)
input double DesiredLots     = 0.015;//発注しようとしているロット数(わざと刻みからずらした例)

//+------------------------------------------------------------------+
//| 指定したpips幅がブローカーの最小ストップ距離を満たすか判定する      |
//+------------------------------------------------------------------+
bool IsStopDistanceValid(string symbol, int stopPips, double &minPipsOut)
  {
   long   stopLevelPoints = SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL);
   double point           = SymbolInfoDouble(symbol, SYMBOL_POINT);
   int    digits          = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
   double pointsPerPip    = (digits==3 || digits==5) ? 10.0 : 1.0;

   minPipsOut = stopLevelPoints / pointsPerPip;

   return(stopPips >= minPipsOut);
  }

//+------------------------------------------------------------------+
//| 指定したロット数がブローカーの刻み・最小・最大を満たすか判定する    |
//+------------------------------------------------------------------+
bool IsVolumeValid(string symbol, double volume, double &normalizedOut)
  {
   double minVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double maxVol = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   double step   = SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);

   normalizedOut = MathRound(volume/step)*step;

   return(normalizedOut >= minVol && normalizedOut <= maxVol);
  }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string symbol      = (TargetSymbol=="") ? _Symbol : TargetSymbol;
   string description = SymbolInfoString(symbol, SYMBOL_DESCRIPTION);

   PrintFormat("%s (%s) の通貨ペア情報", symbol, description);
   PrintFormat("Point=%.5f Digits=%d 最小ストップ距離=%dポイント",
               SymbolInfoDouble(symbol, SYMBOL_POINT),
               (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS),
               (int)SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL));

   double minPips;
   if(!IsStopDistanceValid(symbol, DesiredStopPips, minPips))
      PrintFormat("警告: %dpipsのストップは狭すぎます。最低%.1fpips以上にしてください。",
                  DesiredStopPips, minPips);
   else
      PrintFormat("%dpipsのストップは有効です(最低%.1fpips)。", DesiredStopPips, minPips);

   double normalizedLot;
   if(!IsVolumeValid(symbol, DesiredLots, normalizedLot))
      PrintFormat("警告: ロット数%.3fはこの銘柄の取引条件(最小/最大/刻み)を満たしません。丸めると%.2fです。",
                  DesiredLots, normalizedLot);
   else
      PrintFormat("ロット数%.3fは有効です(丸め後: %.2f)。", DesiredLots, normalizedLot);
  }
//+------------------------------------------------------------------+

MetaEditorで実際に動かす手順

  1. MetaTrader 5の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
  2. 「ファイル」→「新規作成」→「スクリプト」を選び、名前を「SymbolInfoCheckDemo」にして作成する(中身は空のテンプレートで構いません)
  3. テンプレートの中身を全て削除し、上のコードを丸ごと貼り付ける
  4. F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  5. チャートへドラッグ&ドロップし、「エキスパート」タブに通貨ペア情報と警告メッセージが表示されることを確認する

コピペしてコンパイルが通らない・想定と違う結果になるときに確認すること

  • `SymbolInfoDouble()`に`SYMBOL_DIGITS`のような整数系プロパティを渡していないか(型が合わずコンパイルエラーになる。整数系は`SymbolInfoInteger()`を使う)
  • `SYMBOL_TRADE_STOPS_LEVEL`が0を返す通貨ペア・ブローカーの場合、最小ストップ距離の制限自体が存在しない(0イコール制限なし、であって「距離0でよい」という意味ではないので実運用ではある程度の余裕を持たせる)
  • ロットの丸め計算で意図と違う値になる場合、`step`(刻み幅)がブローカーによって0.01ではなく0.1等に設定されていないか確認する
  • 他通貨ペアの情報を取得できない場合、`SymbolSelect(symbol, true)`で市場ウォッチに表示状態にしてから呼び出す

あわせて読みたい: 【MQL5入門】MQL4にはない”板情報”を取得する。MarketBookGet/MarketBookAdd/OnBookEventの使い方と落とし穴

あわせて読みたい: 【MQL5入門】約定(Deal)は取れるのに指値の”キャンセル履歴”が追えない?HistoryOrderGetDouble/Integer/Stringで注文状態を調べる

まとめ

MQL4のMarketInfo(symbol, MODE_XXX)は、

MQL5では戻り値の型に応じて、

SymbolInfoDouble・SymbolInfoInteger・

SymbolInfoStringという3つの関数に分かれました。

Bid/Ask以外にも、ロットの刻み幅(SYMBOL_VOLUME_STEP)や、

最小ストップ距離(SYMBOL_TRADE_STOPS_LEVEL)を、

発注前に確認しておくことで、

実際に注文を送ってから初めて気づくエラーを事前に防げます。

関連記事