日中の決まった時間帯に発生した仕掛けシグナルのみを採用するタイムフィルタの例ですが、ここでは、開始時刻と期間を指定します。
コードとしては、開始時刻と終了時刻をdatetime
型で指定して範囲を判別する共通ライブラリ関数isDatetimeRange()
を利用します。
//共通ライブラリ
#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 = 14; //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 StartHour = 12; //開始時刻(時)
input int StartMin = 30; //開始時刻(分)
input int TradeMin = 120; //フィルタ期間(分)
//フィルタ関数
int FilterSignal(int signal)
{
//開始時刻・終了時刻
datetime StartTime = Today(StartHour, StartMin);
datetime EndTime = StartTime + TradeMin*DT_MIN;
int ret = 0; //シグナルの初期化
//売買シグナルのフィルタ
if(isDatetimeRange(StartTime, EndTime)) ret = signal;
return ret; //シグナルの出力
}
isDatetimeRange()
は、開始時刻dt_from
、終了時刻dt_to
の2つの引数をとります。
この例では、開始時刻として別途宣言したStartHour
、StartMin
をToday()
の引数に代入することで、datetime
型の開始時刻StartTime
を求めます。
終了時刻EndTime
は、StartTime
に期間を加算して求めます。ここでは、別途宣言したTradeMin
(分)を秒換算するために、TradeMin*[DT_MIN](<https://toyolab-fx.notion.site/758c804cc2664a8eb01f9b5de0d839cc>)
を加算しています。
そして、StartTime
、EndTime
を引数としたisDatetimeRange()
をif文の条件式のところに書いておき、期間の範囲の判別を行います。