https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c64acd80-20e6-4b54-b692-14e8711717ef/chart3.png

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()](<https://toyolab-fx.notion.site/iEnvelopes-0583ca4cee4047cea1e4c62a79e7db64>)というテクニカル指標関数で求められます。

移動平均の期間として、別途宣言したEnvPeriodを引数ma_periodに代入します。

終値を対象とした単純移動平均の場合、applied_priceの引数にPRICE_CLOSEを、ma_methodの引数にMODE_SMAを代入します。

移動平均線から上下にシフトする割合(%)として、別途宣言したEnvDevを引数deviationに代入します。

modeの引数には、上位ラインを求める場合、MODE_UPPERを、下位ラインを求める場合、MODE_LOWERをそれぞれ代入します。

仕掛けシグナルsignalの符号と、終値Close[1]、エンベロープの上位ラインEnvUpper、下位ラインEnvLowerの大小関係でシグナルの採用条件を判別します。