MQL4MQL5 EA(エキスパートアドバイザー) 時間・取引条件
スプレッドが広いときは注文しないようにしたい
結論:SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) で現在のスプレッド(ポイント)を取得し、上限を超えていたら注文をやめます。
考え方
早朝や経済指標の発表前後はスプレッドが大きく広がることがあり、そのタイミングで注文すると不利な価格で約定します。注文の前に現在のスプレッドを確認し、上限を超えていたら見送るフィルターを入れておくと安心です。
- 現在のスプレッドをポイントで取得する(Ask − Bid から計算してもよい)
- 上限(パラメーター)を超えていたら注文しない
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4・MQL5 共通
#property strict
// スプレッドが上限を超えているときは注文しない EA のひな形
input double InpMaxSpreadPips = 2.0; // 許容スプレッド(pips)
double SpreadPips()
{
double pip = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
return (SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID)) / pip;
}
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
double sp = SpreadPips();
if(sp > InpMaxSpreadPips)
{
Comment("スプレッド ", DoubleToString(sp, 1), " pips:注文を見送り中");
return;
}
Comment("スプレッド ", DoubleToString(sp, 1), " pips");
// ここに新規注文の判定を書く
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- ポイントのまま比べたいときは、(int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) を使います。
注意点
- バックテストのスプレッドは、テスターの設定(現在値・固定値)に従います。実際の口座のスプレッドとは違うことがあります。
このコードで使っている関数
あわせて読みたいレシピ
「時間・取引条件」のレシピ一覧
- 取引する時間帯を限定したい
- 金曜日の指定時刻にポジションを決済したい(週末持ち越しを避けたい)
- 日本時間で時刻を判定したい
- スプレッドが広いときは注文しないようにしたい












