【MQL4関数】iEnvelopes関数の使い方!エンベロープでトレンドフィルターEAを作ろう

関数

エンベロープ(Envelopes)は移動平均線の上下に一定割合のバンドを描くインジケーターです。価格がバンドを超えたときの反転狙い、またはバンドを突破したときのトレンドフォローなど、さまざまな手法で活用されます。

MQL4では iEnvelopes() 関数を使ってエンベロープの値を取得できます。

iEnvelopes() の構文

double iEnvelopes(
    string  symbol,       // 通貨ペア(NULLで現在のチャート)
    int     timeframe,    // 時間足(0で現在の時間足)
    int     ma_period,    // 移動平均の期間
    int     ma_method,    // 移動平均の種類
    int     ma_shift,     // 移動平均のシフト
    int     applied_price,// 適用価格
    double  deviation,    // 偏差(%)
    int     mode,         // バンドの種類(上・下)
    int     shift         // 何本前のバーか(0=現在)
);

引数の詳細

引数 説明 よく使う値
symbol 通貨ペア NULL(現在のチャート)
timeframe 時間足 0(現在の時間足)
ma_period 移動平均の期間 20〜50
ma_method 移動平均の種類 MODE_SMA / MODE_EMA
ma_shift MAのシフト 0(通常)
applied_price 適用価格 PRICE_CLOSE
deviation バンドの偏差(%) 0.1〜0.5
mode 上下バンドの指定 MODE_UPPER / MODE_LOWER
shift 何本前のバーか 0(現在)/ 1(1本前)

mode の値

定数 説明
MODE_UPPER 1 上バンド(移動平均 + 偏差%)
MODE_LOWER 2 下バンド(移動平均 – 偏差%)

基本的な使い方

// 20期間SMA、偏差0.2%のエンベロープを取得する
double upperBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_UPPER, 0);
double lowerBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_LOWER, 0);

Print("上バンド: ", upperBand);
Print("下バンド: ", lowerBand);

実践例1:エンベロープのブレイクアウトでエントリー

価格が上バンドを上抜けたら買い、下バンドを下抜けたら売りのシグナルとして使う例です。

extern int    MagicNumber = 11001;
extern double Lots        = 0.1;
extern int    MA_Period   = 20;
extern double Deviation   = 0.2;  // バンド幅(%)

//+------------------------------------------------------------------+
//| エンベロープ ブレイクアウトEA                                       |
//+------------------------------------------------------------------+
void OnTick()
{
    // すでにポジションがある場合はスキップ
    if(OrdersTotal() > 0) return;

    double upperBand = iEnvelopes(NULL, 0, MA_Period, MODE_SMA, 0, PRICE_CLOSE, Deviation, MODE_UPPER, 1);
    double lowerBand = iEnvelopes(NULL, 0, MA_Period, MODE_SMA, 0, PRICE_CLOSE, Deviation, MODE_LOWER, 1);
    double prevClose = iClose(NULL, 0, 2);  // 2本前の終値
    double lastClose = iClose(NULL, 0, 1);  // 1本前の終値

    // 上バンドを上抜け → 買いエントリー
    if(prevClose < upperBand && lastClose > upperBand)
    {
        OrderSend(Symbol(), OP_BUY, Lots, Ask, 20, 0, 0,
                  "Envelope Breakout", MagicNumber, 0, clrBlue);
    }

    // 下バンドを下抜け → 売りエントリー
    if(prevClose > lowerBand && lastClose < lowerBand)
    {
        OrderSend(Symbol(), OP_SELL, Lots, Bid, 20, 0, 0,
                  "Envelope Breakout", MagicNumber, 0, clrRed);
    }
}

実践例2:エンベロープをトレンドフィルターとして使う

価格が上バンドより上にある=上昇トレンドと判断し、他のシグナルと組み合わせるフィルターとして活用する例です。

// トレンドフィルター関数
// 戻り値: 1=上昇トレンド / -1=下降トレンド / 0=レンジ
int GetTrend()
{
    double upperBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_UPPER, 1);
    double lowerBand = iEnvelopes(NULL, 0, 20, MODE_SMA, 0, PRICE_CLOSE, 0.2, MODE_LOWER, 1);
    double lastClose = iClose(NULL, 0, 1);

    if(lastClose > upperBand) return  1;  // 上昇トレンド
    if(lastClose < lowerBand) return -1;  // 下降トレンド
    return 0;                             // レンジ(バンド内)
}

void OnTick()
{
    int trend = GetTrend();

    if(trend == 1)
        Comment("トレンド: 上昇(買いシグナルのみ有効)");
    else if(trend == -1)
        Comment("トレンド: 下降(売りシグナルのみ有効)");
    else
        Comment("トレンド: レンジ(様子見)");
}

実践例3:反転狙い(逆張り)

価格がバンドに触れたら反転を狙う逆張り戦略です。

extern int    MagicNumber = 11002;
extern double Lots        = 0.1;
extern int    MA_Period   = 30;
extern double Deviation   = 0.3;

void OnTick()
{
    if(OrdersTotal() > 0) return;

    double upperBand = iEnvelopes(NULL, 0, MA_Period, MODE_EMA, 0, PRICE_CLOSE, Deviation, MODE_UPPER, 1);
    double lowerBand = iEnvelopes(NULL, 0, MA_Period, MODE_EMA, 0, PRICE_CLOSE, Deviation, MODE_LOWER, 1);
    double high1     = iHigh(NULL, 0, 1);
    double low1      = iLow(NULL, 0, 1);

    // 上バンドに高値が触れた → 売り(反転狙い)
    if(high1 >= upperBand)
    {
        OrderSend(Symbol(), OP_SELL, Lots, Bid, 20, 0, 0,
                  "Envelope Mean Reversion", MagicNumber, 0, clrRed);
    }

    // 下バンドに安値が触れた → 買い(反転狙い)
    if(low1 <= lowerBand)
    {
        OrderSend(Symbol(), OP_BUY, Lots, Ask, 20, 0, 0,
                  "Envelope Mean Reversion", MagicNumber, 0, clrBlue);
    }
}

偏差(deviation)の目安

通貨ペア 推奨偏差 補足
USDJPY 0.1〜0.3% ボラティリティが低め
EURUSD 0.1〜0.2% 標準的な設定
GBPJPY 0.3〜0.5% ボラティリティが高め

偏差が小さすぎるとノイズが多くなり、大きすぎるとシグナルが少なくなります。バックテストで最適な値を見つけましょう。

まとめ

  • iEnvelopes() は移動平均の上下にバンドを描くインジケーター関数
  • MODE_UPPER で上バンド、MODE_LOWER で下バンドの値を取得
  • ブレイクアウト(トレンドフォロー)と反転狙い(逆張り)の両方に応用できる
  • deviation パラメーターはバックテストで通貨ペアに合わせて調整する