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で実際に動かす手順
- MetaTrader 5の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
- 「ファイル」→「新規作成」→「スクリプト」を選び、名前を「SymbolInfoCheckDemo」にして作成する(中身は空のテンプレートで構いません)
- テンプレートの中身を全て削除し、上のコードを丸ごと貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートへドラッグ&ドロップし、「エキスパート」タブに通貨ペア情報と警告メッセージが表示されることを確認する
コピペしてコンパイルが通らない・想定と違う結果になるときに確認すること
- `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)を、
発注前に確認しておくことで、
実際に注文を送ってから初めて気づくエラーを事前に防げます。
コメント