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も、
同じ考え方で使えるので、合わせて覚えておくとよいでしょう。
コメント