1週間のうち、決まった曜日に発生した仕掛けシグナルのみを採用するタイムフィルタの例です。
開始時刻(時・分)と終了時刻(時・分)も指定する場合、共通ライブラリ関数のisDatetimeRange()
が利用できます。
//共通ライブラリ
#include "LibEA.mqh"
sinput double Lots = 0.1; //売買ロット数
//ティック時実行関数
void Tick()
{
//金曜日の23時30分に決済
if(isDayOfWeek(DT_FRI) && isTimeAt(23,30)) MyOrderClose();
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; //シグナルの出力
}
//フィルタ関数
int FilterSignal(int signal)
{
int ret = 0; //シグナルの初期化
//売買シグナルのフィルタ(月曜日の9時から金曜日の12時まで)
if(isDatetimeRange(ThisWeek(DT_MON, 9), ThisWeek(DT_FRI, 12))) ret = signal;
return ret; //シグナルの出力
}
isDatetimeRange()
の2つの引数である開始時刻dt_from
、終了時刻dt_to
をThisWeek()
という関数で作成します。例えば、月曜日の9時はThisWeek(DT_MON, 9)
、金曜日の12時はThisWeek(DT_FRI, 12)
と表せます。
この開始時刻と終了時刻をisDatetimeRange()
の引数に代入し、if文の条件式のところに書いておきます。
なお、開始日と終了日の時間指定がない場合、isDayOfWeek()
で判別することもできます。例えば、火曜日から木曜日までに発生したシグナルを採用するフィルタ関数は以下のように書けます。
//フィルタ関数
int FilterSignal(int signal)
{
int ret = 0; //シグナルの初期化
//売買シグナルのフィルタ
if(isDayOfWeek(DT_TUE | DT_WED | DT_THU)) ret = signal;
return ret; //シグナルの出力
}