1. iEnvelopes関数の概要と実務での活用法
iEnvelopes(エンベロープ)は、移動平均線を中心に、上下に一定の割合(偏差)で離したラインを描画するインジケーターです。ボリンジャーバンドが標準偏差(ボラティリティ)で幅を変えるのに対し、エンベロープは常に固定の乖離率を保つのが特徴です。
実務での主な活用法:
1. 逆張り(平均回帰): 価格がバンドの外側にタッチした際、「売られすぎ・買われすぎ」と判断して反転を狙う手法。
2. 順張り(ブレイクアウト): バンドを強く抜けた方向にトレンドが発生したと判断し、追随する手法。
開発者がつまずきやすいポイント:
MQL4から移行してきた開発者が最も戸惑うのが、「関数を呼んでも即座に数値(価格)が返ってこない」という点です。MQL5のiEnvelopesは、インジケーターの「ハンドル番号」を取得するためのものであり、実際の値を取得するにはCopyBufferという別の関数を組み合わせる必要があります。この「ハンドル管理」の概念を理解することが、MQL5攻略の第一歩です。
2. 構文と戻り値
iEnvelopes関数は、インジケーターの計算設定を行い、その設定を指し示す「ハンドル(整数値)」を返します。
int iEnvelopes(
string symbol, // 通貨ペア名(NULLなら現在のチャート)
ENUM_TIMEFRAMES period, // 時間軸(PERIOD_CURRENTなら現在の足)
int ma_period, // 平均期間
int ma_shift, // 平均線のシフト(右方向へのずらし)
ENUM_MA_METHOD ma_method, // 平均線の種類(SMA, EMAなど)
ENUM_APPLIED_PRICE applied_price, // 適用価格(クローズ価格など)
double deviation // 乖離率(パーセント。例:0.1なら0.1%)
);
戻り値:
– 成功した場合:インジケーターのハンドル番号(int型)。
– 失敗した場合:INVALID_HANDLE(-1)。
取得したハンドルは、後にCopyBuffer関数で「上部バンド」や「下部バンド」の数値を取り出す際に使用します。
3. 具体的な使い方・実践サンプルコード
以下は、エンベロープの上限・下限にタッチした際にログを出力する、実践的なEA(エキスパートアドバイザー)のテンプレートです。
//+------------------------------------------------------------------+
//| EnvelopeSample.mq5 |
//| Copyright 2023, Quant Engineer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int InpMAPeriod = 14; // 移動平均の期間
input double InpDeviation = 0.1; // 乖離率 (%)
input ENUM_MA_METHOD InpMethod = MODE_SMA; // 平均計算手法
// グローバル変数
int handleEnv; // エンベロープのハンドルを格納
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. エンベロープのハンドルを取得
handleEnv = iEnvelopes(_Symbol, _Period, InpMAPeriod, 0, InpMethod, PRICE_CLOSE, InpDeviation);
// ハンドル取得失敗時のエラーチェック
if(handleEnv == INVALID_HANDLE)
{
Print("iEnvelopesの作成に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double upperBand[]; // 上限値を格納する配列
double lowerBand[]; // 下限値を格納する配列
// 配列を時系列(最新の足がインデックス0)に設定
ArraySetAsSeries(upperBand, true);
ArraySetAsSeries(lowerBand, true);
// 2. CopyBufferを使って最新の2本分のデータを取得
// バッファ番号: 0 = UPPER_LINE (上限), 1 = LOWER_LINE (下限)
if(CopyBuffer(handleEnv, 0, 0, 2, upperBand) < 0 ||
CopyBuffer(handleEnv, 1, 0, 2, lowerBand) < 0)
{
Print("データのコピーに失敗しました。");
return;
}
// 現在の終値を取得
double closePrice = iClose(_Symbol, _Period, 0);
// 3. 簡単な判定ロジック
if(closePrice > upperBand[0])
{
Print("価格がエンベロープの上限を上抜けました。");
}
else if(closePrice < lowerBand[0])
{
Print("価格がエンベロープの下限を下抜けました。");
}
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 使用したハンドルを解放してメモリを節約
IndicatorRelease(handleEnv);
}
4. 使用上の注意点とよくあるエラー
-
バッファ番号の間違い:
iEnvelopesのCopyBufferでは、0がUpper Band(上限ライン)、1がLower Band(下限ライン)です。これを取り違えると、逆張りロジックが完全に崩壊します。 -
OnTick内でのハンドル作成:
iEnvelopes関数をOnTickの中で毎回呼び出さないでください。ハンドル作成は負荷が高い処理です。必ずOnInitで一度だけ作成し、OnTickではそのハンドルを再利用するのが鉄則です。 -
データ未準備のエラー:
MT5起動直後やEA適用直後は、ヒストリカルデータの読み込みが完了しておらず、CopyBufferがエラーを返すことがあります。必ず戻り値をチェックし、データが取得できたことを確認してから計算ロジックに進むようにしてください。 -
乖離率の単位:
パラメーターのdeviationは「パーセント」です。0.1を入力すると「0.1%」として計算されます。pips単位ではないため、通貨ペアのボラティリティに合わせて調整が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
FXのシステムトレードにおいて、ロジックの優位性と同じくらい重要なのが「実行環境の低レイテンシ(遅延の少なさ)」です。特にエンベロープを用いた逆張りやブレイクアウト手法では、ミリ秒単位の遅延がエントリー価格を滑らせ、本来得られるはずだった利益を削り取ります。
自宅のPCでMT5を稼働させる場合、家庭用インターネット回線の不安定さやルートの複雑さにより、証券会社サーバーへの到達速度(Ping値)が大幅に低下します。また、OSのアップデートによる突然の再起動や停電のリスクも無視できません。プロのクオンツ環境に近づけるためには、証券会社のデータセンターに近い場所に設置された「FX専用VPS」の導入が必須です。専用VPSを利用することで、ネットワーク遅延を極限まで抑え、24時間365日、理想的な約定スピードでシステムを稼働させることが可能になります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント