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()
というテクニカル指標関数で求められます。
短期EMAの期間、長期EMAの期間として、別途宣言したFastEMAPeriod
、SlowEMAPeriod
をそれぞれ引数fast_ema_period
、slow_ema_period
に代入します。なお、MACDのシグナルラインは使わないので、signal_period
の引数には1
を代入しておきます。
mode
の引数には、MACDを求める場合、MODE_MAIN
を代入します。
1本前のMACDMACD1
の符号よりフィルタの条件を判定します。