https://s3-us-west-2.amazonaws.com/secure.notion-static.com/547ca5bf-d357-4ad5-a73a-cecd457e26c5/chart3.png

RSIのレベルによる仕掛けシグナルに対して、MACDを使ったフィルタをかけ、シグナルを選別します。

MACDは、2本の指数移動平均の差をとったものです。

MACDがプラスの場合、短期移動平均線が長期移動平均線より上にあるので、上昇トレンドであると判断し、買いシグナルを採用します。

逆にMACDがマイナスの場合、短期移動平均線が長期移動平均線より下にあるので、下落トレンドであると判断し、売りシグナルを採用します。

トレンドに沿ったシグナルのみを採用する「トレンドフィルタ」となっています。

仕掛けフィルタ

<aside> 💡 買いシグナルの採用条件:1本前のMACDがプラスの場合 売りシグナルの採用条件:1本前のMACDがマイナスの場合

</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 FastEMAPeriod = 12; //短期EMAの期間
input int SlowEMAPeriod = 26; //長期EMAの期間

//仕掛けフィルタ関数
int FilterSignal(int signal)
{
   //1本前のMACD
   double MACD1 = iMACD(_Symbol, 0, FastEMAPeriod, SlowEMAPeriod, 1, PRICE_CLOSE, MODE_MAIN, 1);

   int ret = 0; //シグナルの初期化

   //買いシグナルのフィルタ
   if(signal > 0 && MACD1 > 0) ret = signal;

   //売りシグナルのフィルタ
   if(signal < 0 && MACD1 < 0) ret = signal;

   return ret; //シグナルの出力
}

説明

MACDは、[iMACD()](<https://toyolab-fx.notion.site/iMACD-MACD-e988976e849646278551633c5801d53f>)というテクニカル指標関数で求められます。

短期EMAの期間、長期EMAの期間として、別途宣言したFastEMAPeriodSlowEMAPeriodをそれぞれ引数fast_ema_periodslow_ema_periodに代入します。なお、MACDのシグナルラインは使わないので、signal_periodの引数には1を代入しておきます。

modeの引数には、MACDを求める場合、MODE_MAINを代入します。

1本前のMACDMACD1の符号よりフィルタの条件を判定します。