MQL4MQL5 EA(エキスパートアドバイザー) 売買サイン・相場の判定
ボリンジャーバンドの ±2σ タッチを判定したい
結論:iBands() で上のバンド・下のバンドの値を取得し、確定足の高値・安値(または終値)と比べます。
考え方
ボリンジャーバンドは移動平均線の上下に、標準偏差の何倍かの幅で線を引いたものです。価格が ±2σ に届いたら逆張り、バンドに沿って動き続けたら順張り、と使い方はさまざまです。ここでは確定足の終値が +2σ を超えた・−2σ を下回ったときにアラートを出す EA を例にしています。
- iBands() で、確定した1本前の上のバンド・下のバンドの値を取得する
- 1本前の終値と比べて、バンドの外側で確定したかを判定する
- 新しい足ができたときだけ判定する
そのまま使えるコード
MetaEditor の「新規作成」で「エキスパートアドバイザ(テンプレート)」を選び、できたファイルの中身をすべてこのコードに置き換えてコンパイル(F7)します。ファイルは Experts フォルダに保存され、ナビゲーターからチャートにドラッグして使います。
MQL4(MT4)
#property strict
// 終値がボリンジャーバンド ±2σ の外で確定したらアラートを出す EA(MT4)
input int InpPeriod = 20; // 期間
input double InpDev = 2.0; // 偏差(σ)
datetime lastBar = 0;
int OnInit()
{
return INIT_SUCCEEDED;
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
lastBar = t;
double upper = iBands(_Symbol, 0, InpPeriod, InpDev, 0, PRICE_CLOSE, MODE_UPPER, 1);
double lower = iBands(_Symbol, 0, InpPeriod, InpDev, 0, PRICE_CLOSE, MODE_LOWER, 1);
double c1 = iClose(_Symbol, PERIOD_CURRENT, 1);
if(c1 > upper) Alert(_Symbol, " +", DoubleToString(InpDev, 1), "σ を上回って確定");
if(c1 < lower) Alert(_Symbol, " -", DoubleToString(InpDev, 1), "σ を下回って確定");
}MQL5(MT5)
// 終値がボリンジャーバンド ±2σ の外で確定したらアラートを出す EA(MT5)
input int InpPeriod = 20; // 期間
input double InpDev = 2.0; // 偏差(σ)
int hBands = INVALID_HANDLE;
datetime lastBar = 0;
int OnInit()
{
hBands = iBands(_Symbol, PERIOD_CURRENT, InpPeriod, 0, InpDev, PRICE_CLOSE);
return hBands == INVALID_HANDLE ? INIT_FAILED : INIT_SUCCEEDED;
}
void OnDeinit(const int reason)
{
IndicatorRelease(hBands);
}
void OnTick()
{
datetime t = iTime(_Symbol, PERIOD_CURRENT, 0);
if(t == lastBar) return;
double up[], lo[];
if(CopyBuffer(hBands, UPPER_BAND, 1, 1, up) < 1 || CopyBuffer(hBands, LOWER_BAND, 1, 1, lo) < 1) return;
lastBar = t;
double c1 = iClose(_Symbol, PERIOD_CURRENT, 1);
if(c1 > up[0]) Alert(_Symbol, " +", DoubleToString(InpDev, 1), "σ を上回って確定");
if(c1 < lo[0]) Alert(_Symbol, " -", DoubleToString(InpDev, 1), "σ を下回って確定");
}MT4 版・MT5 版とも MetaEditor でコンパイル(エラー・警告なし)を確認済みです。実際の口座で使う前に、デモ口座やストラテジーテスターで動作を確かめてください。
カスタマイズのポイント
- 「タッチ」を高値・安値で判定したいときは、c1 の代わりに iHigh(上)・iLow(下)と比べます。
- 3σ にしたいときは InpDev を 3.0 にします。
注意点
- MQL4 と MQL5 の iBands() は、偏差(deviation)とシフト(bands_shift)の引数の順番が逆です。












