RSIのレベルによる仕掛けシグナルに対して、エンベロープを使ったフィルタをかけ、シグナルを選別します。
エンベロープは、移動平均線の上下に一定割合だけシフトした2本のラインからなる指標です。
終値が上位ラインを上回っていると、上昇トレンドであると判断し、買いシグナルを採用します。
逆に終値が下位ラインを下回っていると、下降トレンドであると判断し、売りシグナルを採用します。
トレンドに沿ったシグナルのみを採用する「トレンドフィルタ」となっています。
<aside> 💡 買いシグナルの採用条件:1本前の終値がエンベロープの上位ラインより上の場合 売りシグナルの採用条件:1本前の終値がエンベロープの下位ラインより下の場合
</aside>
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
int sig_entry = EntrySignal(); //仕掛けシグナル
int sig_filter = FilterSignal(sig_entry); //トレンドフィルタ
//成行売買
MyOrderSendMarket(sig_filter, sig_entry, Lots);
}
input int RSIPeriod = 5; //RSIの期間
//仕掛けシグナル関数
int EntrySignal()
{
//1本前のRSI
double RSI1 = iRSI(_Symbol, 0, RSIPeriod, PRICE_CLOSE, 1);
int ret = 0; //シグナルの初期化
//買いシグナル
if(RSI1 < 30) ret = 1;
//売りシグナル
if(RSI1 > 70) ret = -1;
return ret; //シグナルの出力
}
input int EnvPeriod = 200; //エンベロープの期間
input double EnvDev = 0.1; //偏差%
//仕掛けフィルタ関数
int FilterSignal(int signal)
{
//1本前のエンベロープ
double EnvUpper1= iEnvelopes(_Symbol, 0, EnvPeriod, MODE_SMA, 0, PRICE_CLOSE, EnvDev, MODE_UPPER, 1);
double EnvLower1 = iEnvelopes(_Symbol, 0, EnvPeriod, MODE_SMA, 0, PRICE_CLOSE, EnvDev, MODE_LOWER, 1);
int ret = 0; //シグナルの初期化
//買いシグナルのフィルタ
if(signal > 0 && Close[1] > EnvUpper1) ret = signal;
//売りシグナルのフィルタ
if(signal < 0 && Close[1] < EnvLower1) ret = signal;
return ret; //シグナルの出力
}
エンベロープは、iEnvelopes()
というテクニカル指標関数で求められます。
移動平均の期間として、別途宣言したEnvPeriod
を引数ma_period
に代入します。
終値を対象とした単純移動平均の場合、applied_price
の引数にPRICE_CLOSE
を、ma_method
の引数にMODE_SMA
を代入します。
移動平均線から上下にシフトする割合(%)として、別途宣言したEnvDev
を引数deviation
に代入します。
mode
の引数には、上位ラインを求める場合、MODE_UPPER
を、下位ラインを求める場合、MODE_LOWER
をそれぞれ代入します。
仕掛けシグナルsignal
の符号と、終値Close[1]
、エンベロープの上位ラインEnvUpper
、下位ラインEnvLower
の大小関係でシグナルの採用条件を判別します。