MT4のサンプルコードを調べていると、Bid/Ask/Pointの取得に、

MarketInfo()を使っているものが今でもたくさん見つかります。

ところが現在の公式リファレンスを見ると、MarketInfo()の代わりに、

SymbolInfoDouble系の関数を使うよう案内されています。

この記事では、SymbolInfoDouble()の書式と、

MarketInfo()のMODE_定数との対応関係、

戻り値版とbool版の使い分けについて解説します。

この記事で分かること
・SymbolInfoDouble()の2種類の書式の違い
・MarketInfo()のMODE_定数との対応関係
・戻り値版とbool版、どちらを使うべきか
・SymbolInfoInteger/SymbolInfoStringとの関係

なぜ今さらSymbolInfoDoubleを覚える必要があるのか

まず、この関数を覚える必要性について整理します。

MarketInfo()で動くコードが多いのに今さら必要?

MarketInfo()は今も動作しますし、ネット上のサンプルコードの多くは、

MarketInfo()で書かれています。

しかし、新しく書くコードであれば、現行の公式リファレンスが案内する方法を、

知っておく価値があります。

ビルド600以降に追加された経緯

SymbolInfoDouble/Integer/Stringは、

MT4がMQL5との構文の共通化を進めた際に追加された関数群です。

MarketInfo()よりも後に登場したため、「新しいAPI」という位置づけになります。

この記事で扱う範囲

この記事では、Bid/Ask/Pointといった、数値(double型)の情報を取得する、

SymbolInfoDoubleを中心に扱います。

整数値を取るSymbolInfoInteger、

文字列を取るSymbolInfoStringは、5節で関係だけ紹介します。

SymbolInfoDouble()の基本的な使い方

関数の書式と、取得できる代表的な値を確認します。

関数の書式(戻り値版とbool版の2種類)

double SymbolInfoDouble(
   string                 name,       // シンボル名
   ENUM_SYMBOL_INFO_DOUBLE prop_id    // プロパティの識別子
   );

bool SymbolInfoDouble(
   string                  name,       // シンボル名
   ENUM_SYMBOL_INFO_DOUBLE  prop_id,    // プロパティの識別子
   double&                  double_var  // 値を受け取る変数
   );

1つの関数名に対して、戻り値で直接値を返す版と、

成功/失敗をboolで返す版の、2種類の書式が用意されています。

代表的なENUM_SYMBOL_INFO_DOUBLE識別子一覧

識別子 取得できる値
SYMBOL_BID 現在のBid価格
SYMBOL_ASK 現在のAsk価格
SYMBOL_POINT 1ポイントの価格換算値

ここに挙げた3つが、既存のEA・インジケーター記事で最も使われている値です。

MarketInfo()との対応関係

物理的に同じ値を指す組み合わせを表にまとめます。

MarketInfo() SymbolInfoDouble()
MODE_BID SYMBOL_BID
MODE_ASK SYMBOL_ASK
MODE_POINT SYMBOL_POINT

この対応表は公式リファレンスの一覧ではなく、

両関数が指す値が同じであることに基づく、この記事での整理です。

実際に動くコード全体(MarketInfo版との比較)

同じ値を2つの方法で取得して見比べるスクリプトです。

比較のポイント

MarketInfo版とSymbolInfoDouble版で、同じ値が返ってくることを、

Comment()で確認できるようにします。

書き換え前後で挙動が変わらないことの確認に使えます。

コード全文

//+------------------------------------------------------------------+
//|                                  MarketInfoVsSymbolInfoScript.mq4 |
//|                     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 strict
#property show_inputs

void OnStart()
  {
   double bidOld = MarketInfo(_Symbol, MODE_BID);
   double askOld = MarketInfo(_Symbol, MODE_ASK);
   double pointOld = MarketInfo(_Symbol, MODE_POINT);

   double bidNew = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double askNew = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double pointNew = SymbolInfoDouble(_Symbol, SYMBOL_POINT);

   string msg = "";
   msg += "Bid: " + DoubleToString(bidOld, _Digits) + " / " + DoubleToString(bidNew, _Digits) + "\n";
   msg += "Ask: " + DoubleToString(askOld, _Digits) + " / " + DoubleToString(askNew, _Digits) + "\n";
   msg += "Point: " + DoubleToString(pointOld, _Digits) + " / " + DoubleToString(pointNew, _Digits);

   Alert(msg);
  }

出力結果の見方

「/」の左側がMarketInfo版、右側がSymbolInfoDouble版です。

スプレッドが変動する銘柄では、実行タイミングのずれで、

両者の値が食い違うことがあります。

厳密に比較したい場合は、1つの関数呼び出し内にまとめる必要があります。

bool版を使うべき場面(エラー処理)

2種類の書式のうち、どちらを使うべきかを整理します。

戻り値版では失敗時に0が返り判定できない

戻り値版は、指定したシンボルが存在しない等の理由で、

取得に失敗した場合、0.0を返すだけで、

失敗したこと自体は分かりません。

bool版+GetLastErrorでの判定

double bidValue = 0;
if(!SymbolInfoDouble(_Symbol, SYMBOL_BID, bidValue))
  {
   Print("SymbolInfoDouble失敗: エラーコード=", GetLastError());
  }

bool版は、成功/失敗を戻り値のtrue/falseで直接判定できるため、

GetLastError()と組み合わせたエラー処理を書きやすくなります。

実務でどちらを使うべきか

書き分けの目安
・自分のチャートのシンボルだけを扱う場合
→戻り値版で簡潔に書いてよい
・銘柄名を文字列変数で動的に扱う場合
→bool版でエラー処理を入れる

SymbolInfoInteger/SymbolInfoStringとの関係

double型以外の情報を取る、関連する2つの関数も確認します。

Integer版の代表識別子

SymbolInfoInteger()は、SYMBOL_DIGITSのような、

整数値のプロパティを取得します。

SYMBOL_DIGITSは、価格の小数点以下の桁数を表します。

String版の代表識別子

SymbolInfoString()は、SYMBOL_DESCRIPTIONのような、

文字列のプロパティを取得します。

SYMBOL_DESCRIPTIONは、銘柄の説明文を表します。

既刊MQL5記事への接続

MQL5側ではこの3つの関数がより頻繁に使われており、既刊記事で詳しく解説しています。

MQL4でも同じ名前・同じ引数構成で使えるため、

MQL5への移行時にそのまま読み替えられる知識になります。

よくある注意点

実装時につまずきやすい点をまとめます。

他シンボルの情報を取るときはSymbolSelectが必要

注意
・現在のチャート以外のシンボルを指定する場合
・事前にSymbolSelectで追加しておく必要がある
・追加していないと正しい値が返らないことがある

ENUM値を間違えると意図しない値が返る

SYMBOL_BIDとSYMBOL_BIDHIGHのように、

似た名前の識別子が複数存在するため、

エディタの自動補完で一覧を確認しながら書くのが安全です。

既存コードを一括置換しない

MarketInfo()は現在も動作するため、既存の動いているコードを、

無理に書き換える必要はありません。

新しく書くコード、または他の理由で改修するコードから、

徐々に置き換えていく程度で十分です。

よくある質問

SymbolInfoDoubleについて、よくある疑問に回答します。

MarketInfo()は今後使えなくなりますか?

現時点で使用禁止にはなっていません。

ただし公式リファレンスが新しい方法を案内している以上、

新規のコードではSymbolInfoDouble系を使う方が将来的に安心です。

MQL5でもMarketInfo()は使えますか?

MQL5にはMarketInfo()という関数自体が存在しません。

MQL5では最初からSymbolInfoDouble系を、

使う設計になっています(またはSymbolInfoTick)。

戻り値版とbool版で速度に差はありますか?

実務上、体感できるほどの速度差はありません。

選び方はエラー処理の必要性で判断して問題ありません。

【MQL4】MarketInfo()の後継「SymbolInfoDouble」の使い方について解説してみた(非推奨化の理由とSYMBOL_BID/ASK/POINTの書き方の違い):まとめ

MarketInfo()は今も動きますが、現行の公式リファレンスは、

SymbolInfoDouble系の使用を案内しています。

戻り値版は簡潔に書ける一方、失敗時の判定ができないため、

他シンボルを動的に扱うコードでは、bool版でエラー処理を入れるのが安全です。

SymbolInfoInteger/SymbolInfoStringも、

同じ考え方で使えるので、合わせて覚えておくとよいでしょう。

関連記事