MQL4MQL5 銘柄・レート情報
SymbolInfoDouble()
- できること
- 銘柄の Bid・Ask・ロット・ポイントなど小数の情報を取得する
- 対応
- MQL4・MQL5
SymbolInfoDouble() とは
銘柄の小数の情報(現在の Bid・Ask、ポイントの大きさ、最小ロット・最大ロット・刻み幅、ティックの価値など)を取得する関数です。MQL5 で現在の価格を取る基本の関数で、MQL4 でも使えます。
SymbolInfoDouble() の書式と引数
引数の組み合わせが違う 2 通りの書き方があります。
double SymbolInfoDouble(
string name,
ENUM_SYMBOL_INFO_DOUBLE prop_id
)
bool SymbolInfoDouble(
string name,
ENUM_SYMBOL_INFO_DOUBLE prop_id,
double &double_var
)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
name | string | 必須 | 銘柄名。 |
prop_id | ENUM_SYMBOL_INFO_DOUBLE | 必須 | 取得する項目。SYMBOL_BID、SYMBOL_ASK、SYMBOL_POINT、SYMBOL_VOLUME_MIN(最小ロット)、SYMBOL_VOLUME_MAX、SYMBOL_VOLUME_STEP(刻み幅)、SYMBOL_TRADE_TICK_VALUE、SYMBOL_TRADE_TICK_SIZE など。 |
double_var | double & | 必須 | 2つ目の書き方で、値を受け取る変数。 |
戻り値
1つ目の書き方は値そのもの(取得できないと 0)。2つ目の書き方は成功したら true を返し、値は double_var に入ります。
SymbolInfoDouble() の使い方(コード例)
MQL4・MQL5 共通
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double minL = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
Print("Ask=", ask, " Bid=", bid, " 最小ロット=", minL, " 刻み=", step);
// 取得に成功したか確認する書き方
double usdjpyBid;
if(!SymbolInfoDouble("USDJPY", SYMBOL_BID, usdjpyBid))
Print("USDJPY の価格が取れません error=", GetLastError());OnTick()・OnStart() などの関数の中に書いて使う例です。MetaEditor でコンパイルできることを確認済みです。
SymbolInfoDouble() の注意点
- ほかの通貨ペアの情報を取るときは、その銘柄が気配値表示に入っている必要があります。入っていなければ SymbolSelect(銘柄, true) で追加します。
- 桁数(SYMBOL_DIGITS)・スプレッド(SYMBOL_SPREAD)・ストップレベル(SYMBOL_TRADE_STOPS_LEVEL)は整数なので SymbolInfoInteger() で取得します。
MQL4 と MQL5 の違い
MQL4 の Ask・Bid(定義済み変数)や MarketInfo(銘柄, MODE_ASK) の代わりに使います。MQL4 でも使えるので、両方で動くコードを書くときに便利です。
SymbolInfoDouble() でよく出るエラー
SymbolInfoDouble() を使う逆引きレシピ
- アラートウィンドウを出したいAlert() を使います。ポップアップの画面が開き、音も鳴ります。
- 前日の高値・安値ブレイクを判定したいiHigh(_Symbol, PERIOD_D1, 1)・iLow(_Symbol, PERIOD_D1, 1) で前日の高値・安値を取得し、現在値と比べます。
- 利益が出たら半分だけ決済したいMQL4 は OrderClose() のロットに保有量より小さい値、MQL5 は trade.PositionClosePartial(チケット, ロット) を使います。
- 資金の◯%のリスクでロット数を計算したい「許容損失額 ÷(損切り幅 × 1ロットあたりの1ポイントの価値)」で計算し、最小ロット・刻み幅に合わせます。
- ロット数を最小ロット・刻み幅に合わせたいSYMBOL_VOLUME_STEP(刻み幅)で切り捨て、SYMBOL_VOLUME_MIN・SYMBOL_VOLUME_MAX の範囲に収めます。
- pips とポイントを正しく換算したい(3桁・5桁対応)_Digits が 3 か 5 の口座では 1pips = 10 ポイント(_Point × 10)、2 か 4 の口座では 1pips = 1 ポイントです。
- スプレッドが広いときは注文しないようにしたいSymbolInfoInteger(_Symbol, SYMBOL_SPREAD) で現在のスプレッド(ポイント)を取得し、上限を超えていたら注文をやめます。












