1. SymbolInfoDouble関数の概要と実務での活用法
SymbolInfoDoubleは、指定した通貨ペア(シンボル)に関する「double型(浮動小数点数)」の情報を取得するためのMQL5組み込み関数です。最新のBid(売値)やAsk(買値)といった価格情報のほか、取引単位の最小ステップやストップレベル、スワップポイントなど、EA(エキスパートアドバイザー)が正確な注文を出すために不可欠な数値データを取得するために使用します。
実務レベルの開発で初心者が特につまずきやすいのが、「価格データの鮮度」と「精度の取り扱い」です。例えば、指値注文を入れる際に、現在のストップレベルを無視した価格を指定するとエラーとなり、売買チャンスを逃してしまいます。また、単純に「0.1ロット」と計算しても、ブローカーによって「最小ロット単位(ロットステップ)」が異なるため、この関数を使って動的に仕様をチェックしなければ、実運用で動かないEAになってしまいます。
プロのクオンツエンジニアは、これらの数値をハードコーディング(数値を直接入力すること)せず、必ずSymbolInfoDoubleを用いて実行環境からリアルタイムに取得します。これにより、異なるブローカーや通貨ペアでも柔軟に動作する堅牢なアルゴリズムを構築できるのです。
2. 構文と戻り値
SymbolInfoDoubleには、用途に合わせて2つの書き方(オーバーロード)があります。
書き方1:値を直接受け取る(簡便な方法)
double SymbolInfoDouble(
string name, // 通貨ペア名(例:_Symbol)
ENUM_SYMBOL_INFO_DOUBLE prop_id // 取得したいプロパティの種類
);
書き方2:成否を判定する(安全な方法)
実務では、データ取得に失敗した場合のバグを防ぐため、こちらの書き方が推奨されます。
bool SymbolInfoDouble(
string name, // 通貨ペア名
ENUM_SYMBOL_INFO_DOUBLE prop_id, // 取得したいプロパティの種類
double& double_var // 値を格納する変数(参照渡し)
);
- 戻り値: 成功すれば
true、失敗すればfalseを返します。
主なプロパティID(ENUM_SYMBOL_INFO_DOUBLE)
SYMBOL_BID: 現在の売値SYMBOL_ASK: 現在の買値SYMBOL_POINT: ポイントサイズ(例:0.00001など)SYMBOL_TRADE_TICK_SIZE: 最小価格変化幅(Tickサイズ)SYMBOL_VOLUME_STEP: ロット数の最小変化単位SYMBOL_SWAP_LONG / SHORT: スワップポイント
3. 具体的な使い方・実践サンプルコード
以下は、現在のAsk価格を取得し、それに基づいた適切な損切り価格やロット調整を行うための実戦的なコード例です。
void OnTick()
{
// 1. 変数の宣言
double askPrice;
double bidPrice;
double tickSize;
double lotStep;
// 2. SymbolInfoDoubleを使用して安全にデータを取得
// _Symbol は現在EAをセットしているチャートの通貨ペア名を指します
if(!SymbolInfoDouble(_Symbol, SYMBOL_ASK, askPrice)) {
Print("Ask価格の取得に失敗しました。エラーコード:", GetLastError());
return;
}
if(!SymbolInfoDouble(_Symbol, SYMBOL_BID, bidPrice)) {
Print("Bid価格の取得に失敗しました。");
return;
}
// 3. 注文時に重要な「最小ティックサイズ」と「ロットステップ」を取得
tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
// ログに出力(デバッグ用)
PrintFormat("シンボル: %s, Ask: %.5f, Bid: %.5f, 最小刻み: %.5f",
_Symbol, askPrice, bidPrice, tickSize);
// 4. 実践的な活用例:現在の価格から500ポイント下に損切りラインを設定
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
double stopLossLevel = bidPrice - (500 * point);
// 価格を正規化(ブローカーの最小刻みに合わせる処理。これを行わないとエラーの原因になります)
stopLossLevel = NormalizeDouble(stopLossLevel, _Digits);
Print("計算された損切り価格: ", stopLossLevel);
}
4. 使用上の注意点とよくあるエラー
-
「気配値表示」ウィンドウの確認
SymbolInfoDoubleでデータを取得しようとする通貨ペアが、MT5の「気配値表示」に含まれていない場合、関数は失敗するか古い値を返すことがあります。EAが参照するシンボルは必ず気配値リストに追加しておきましょう。 -
ゼロ除算の罠
ロット計算などでSYMBOL_TRADE_TICK_SIZEを分母にする場合、万が一取得に失敗して値が 0 になると、EAは「Zero Divide」エラーで停止します。必ず取得した値が 0 より大きいかチェックするガードコードを入れるのがプロの作法です。 -
NormalizeDoubleとの併用
SymbolInfoDoubleで取得した価格を用いて計算した注文価格は、必ずNormalizeDouble()関数で適切な桁数(_Digits)に処理してください。微小な浮動小数点の誤差があるだけで、サーバーに注文が拒絶されるケースが多々あります。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、SymbolInfoDoubleで取得する1ミリ秒単位の価格変化は収益に直結します。多くの個人開発者が陥る致命的なミスは、自宅のPC環境でEAを稼働させてしまうことです。自宅のネット回線は物理的な距離やプロバイダの経由地点が多く、FXサーバーに注文が届くまでに数十〜数百ミリ秒の「レイテンシ(遅延)」が発生します。
この遅延の間に価格が動き、取得したBid/Askと実際の約定価格が乖離する「スリッページ」が発生し、期待したエッジが削り取られてしまいます。特にボラティリティが高い場面では、1ミリ秒の遅れが致命的な損失を招きます。プロのクオンツ環境では、取引サーバーと物理的に近いデータセンターに設置された「専用VPS」の導入はオプションではなく、勝つための必須要件です。安定した電源、24時間の稼働、そして極限まで短縮された通信ラグ。このインフラの差が、シストレにおける「利益が出るEA」と「理論値通りに動かないEA」の境界線となります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント