mql4 marketinfoは、通貨ペアやCFDなど銘柄ごとの取引条件をコードから取得できる重要関数です。
スプレッドや最小ロット、ポイント値を正しく扱えないと、EAやインジの計算がズレて損失につながることもあります。
この記事では、mql4 marketinfoで何が取れるのか、どこでハマりやすいのか、実戦での使い方までをまとめて解説します。
mql4 marketinfoでできること
銘柄スペックをプログラムで参照できる
mql4 marketinfoは、指定したシンボルの「市場情報」を返す関数です。
チャート上の見た目やブローカーの仕様に依存せず、EA内部で数値を取得して判断できます。
たとえば次のような用途で頻出します。
- スプレッドが一定以上ならエントリーしない
- 最小ロットやロットステップに合わせて発注数量を丸める
- ストップレベルを満たすようにSL/TPを調整する
- ポイントや桁数に合わせて価格計算を行う
とくに複数銘柄を扱うEAでは、mql4 marketinfoを使って「銘柄ごとの差」を吸収する設計が必須になります。
関数の書き方と代表的な戻り値
基本構文と型の注意点
mql4 marketinfoの基本形は次のとおりです。
double v = MarketInfo(Symbol(), MODE_SPREAD);
戻り値はdoubleです。
ただしMODE_DIGITSやMODE_SPREADなど「整数として扱いたい値」もdoubleで返るため、必要に応じてintへキャストして扱います。
int digits = (int)MarketInfo(Symbol(), MODE_DIGITS);
int spread = (int)MarketInfo(Symbol(), MODE_SPREAD);
また、取得対象のシンボルは文字列で指定できます。
複数銘柄を走査するロジックでもmql4 marketinfoはそのまま使えます。
string sym = "EURUSD";
double point = MarketInfo(sym, MODE_POINT);
よく使うMODE定数の一覧
mql4 marketinfoでよく参照される項目を、実務視点で整理します。
| MODE定数 | 意味 | 代表的な用途 | 注意点 |
|---|---|---|---|
| MODE_SPREAD | スプレッド(ポイント) | 取引フィルタ、コスト計算 | 固定/変動、時間帯で変化 |
| MODE_POINT | ポイント値(最小変動) | pips換算、SL/TP幅計算 | 5桁/3桁でpips換算がズレやすい |
| MODE_DIGITS | 小数点以下桁数 | 正規化、表示調整 | 価格はNormalizeDoubleと併用 |
| MODE_MINLOT | 最小ロット | 最小数量の下限チェック | 口座タイプで異なる場合あり |
| MODE_LOTSTEP | ロット刻み | 数量の丸め | 0.01固定とは限らない |
| MODE_MAXLOT | 最大ロット | 上限チェック | 銘柄で差が出やすい |
| MODE_STOPLEVEL | 逆指値の最小距離(ポイント) | SL/TPの最小距離制約対応 | 0でも実質制約があるブローカーも |
| MODE_TICKVALUE | 1ティックの価値 | 損益換算、リスク計算 | 口座通貨や銘柄で変動 |
| MODE_TICKSIZE | ティックサイズ | 正確な損益計算の補助 | CFDで重要 |
mql4 marketinfoは「何を返すか」を理解して使うほど、EAの安定性が上がります。
スプレッドとポイント計算で失敗しないコツ
pipsとpointを混同しない
mql4 marketinfoでMODE_SPREADを取得すると、単位は「ポイント」です。
一方、トレーダーが感覚的に使うのは「pips」であることが多く、ここで混乱が起きます。
例として、EURUSDが5桁表示の場合、1pipsは10ポイントです。
つまり、mql4 marketinfoで得たspreadが20なら、2.0pips相当になります。
pips換算の目安は次のように扱うと安全です。
int digits = (int)MarketInfo(Symbol(), MODE_DIGITS);
int spreadPoint = (int)MarketInfo(Symbol(), MODE_SPREAD);
double spreadPips;
if(digits == 5 || digits == 3) spreadPips = spreadPoint / 10.0;
else spreadPips = spreadPoint;
このようにmql4 marketinfoの値を「表示桁数」とセットで解釈すると、銘柄差に強くなります。
価格計算はNormalizeDoubleで整える
SL/TPや指値価格を計算するときは、MODE_POINTとMODE_DIGITSを組み合わせます。
計算後に桁数を揃えないと、発注エラーや意図しない丸めが起きます。
double point = MarketInfo(Symbol(), MODE_POINT);
int digits = (int)MarketInfo(Symbol(), MODE_DIGITS);
double sl = Bid - 50 * point; // 50ポイント
sl = NormalizeDouble(sl, digits);
mql4 marketinfoで取得したpointとdigitsを常にセットで扱う癖をつけると、バグが激減します。
ロット計算とリスク管理への活用
最小ロットとロットステップで数量を丸める
資金量に応じてロットを自動計算する場合、mql4 marketinfoのMODE_MINLOTとMODE_LOTSTEPが必須です。
ブローカーによっては0.01刻みではなく、0.1刻み、あるいは銘柄ごとに刻みが違うこともあります。
以下は、計算したロットを許容範囲に収め、刻みに合わせて丸める例です。
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
double step = MarketInfo(Symbol(), MODE_LOTSTEP);
double lot = 0.037; // 例
// 下限上限
lot = MathMax(lot, minLot);
lot = MathMin(lot, maxLot);
// ステップに合わせて切り下げ
lot = MathFloor(lot / step) * step;
mql4 marketinfoで仕様を取りに行けば、環境が変わってもEAが破綻しにくくなります。
TickValueを使った損失額ベースの設計
「何pipsで損切り」ではなく「何円(何ドル)で損切り」を基準にしたい場合、mql4 marketinfoのMODE_TICKVALUEが役立ちます。
ただし、MODE_TICKVALUEは銘柄・口座通貨・レートにより変動し、CFDでは期待通りにならないケースもあります。
そのため、MODE_TICKSIZEとセットで扱い、バックテストだけでなくフォワードでも値を確認する運用が現実的です。
ストップレベルと発注エラー対策
MODE_STOPLEVELでSL TPの最小距離を守る
mql4 marketinfoのMODE_STOPLEVELは、SL/TPを現在価格からどれだけ離す必要があるかをポイントで返します。
これを無視すると、OrderSendでエラー130(invalid stops)になりやすくなります。
最低距離を加味してSL/TPを補正する例です。
double point = MarketInfo(Symbol(), MODE_POINT);
int stopLevel = (int)MarketInfo(Symbol(), MODE_STOPLEVEL);
double minDist = stopLevel * point;
double sl = Bid - 30 * point;
if((Bid - sl) < minDist) sl = Bid - minDist;
mql4 marketinfoを使うことで、ブローカーごとの制約に合わせた「壊れない発注ロジック」を作れます。
取得値が0や異常値のときの考え方
環境によっては、mql4 marketinfoが0を返す、あるいは想定外に小さい値を返すことがあります。
代表例は、MODE_STOPLEVELが0でも実質的に制約があるケース、MODE_SPREADが急変するケースです。
対策としては次のような方針が有効です。
- 0や負値は安全側のデフォルトに置き換える
- スプレッドは直近平均や上限フィルタを併用する
- ログに取得値を出して、ブローカー仕様を把握する
mql4 marketinfoは万能ではありませんが、異常系を前提に設計すれば強力な武器になります。
実践パターン集 複数銘柄EAでのmql4 marketinfo
シンボルごとに条件を揃えて同じロジックを回す
複数銘柄EAでは、銘柄ごとにdigitsやpointが異なるため、固定値のまま計算すると破綻します。
そこで、毎回mql4 marketinfoで必要情報を取得し、共通関数に渡す構造が扱いやすいです。
void PrepareSpec(string sym, double &point, int &digits, int &spread){
point = MarketInfo(sym, MODE_POINT);
digits = (int)MarketInfo(sym, MODE_DIGITS);
spread = (int)MarketInfo(sym, MODE_SPREAD);
}
このようにmql4 marketinfoを入口に「銘柄スペックを標準化」すると、ロジックの再利用性が上がります。
スプレッドフィルタを入れて無駄なエントリーを減らす
mql4 marketinfoでMODE_SPREADを監視し、閾値を超えるときは取引しないだけでも、成績が安定することがあります。
特に指標前後や流動性の低い時間帯はスプレッドが拡大しやすいです。
int spread = (int)MarketInfo(Symbol(), MODE_SPREAD);
if(spread > 25) return; // 25ポイント超なら見送り
mql4 marketinfoの取得は軽量ですが、毎ティック多用する場合は必要なタイミングに絞るなど、設計面でも工夫するとよいでしょう。
まとめ
mql4 marketinfoを軸にするとEAの移植性が上がる
mql4 marketinfoは、スプレッド、ポイント、桁数、ロット制約、ストップレベルなど、EAが正しく動くための前提条件を取得できる関数です。
pipsとpointの違いを整理し、NormalizeDoubleやロット丸め、ストップレベル補正をセットで実装することで、発注エラーや計算ズレを大きく減らせます。
まずはあなたのEAにmql4 marketinfoの取得ログを入れ、ブローカーや銘柄の差を見える化してみてください。
その一歩が、環境が変わっても安定して動くロジック作りにつながります。



コメント