1年のうち、決まった日に発生した仕掛けシグナルをオフにするタイムフィルタの例です。

開始時刻(時・分)と終了時刻(時・分)も指定する場合、isDatetimeRange()が利用できます。

コード

//共通ライブラリ
#include "LibEA.mqh"

sinput double Lots = 0.1; //売買ロット数

//ティック時実行関数
void Tick()
{
   //12月24日12時に決済
   if(isDateOn(12,24) && isTimeAt(12,0)) 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 = signal; //シグナルの初期化

   //売買シグナルのフィルタ(12月24日から1月3日12時までシグナルをオフ)
   if(isDatetimeRange(ThisYear(12, 24), ThisYear(1, 3, 12))) ret = 0;

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

説明

isDatetimeRange()の2つの引数である開始時刻dt_from、終了時刻dt_toThisYear()という関数で作成します。例えば、12月24日の0時はThisYear(12, 24)、1月3日12時はThisYear(1, 3, 12)と表せます。

この開始時刻と終了時刻をisDatetimeRange()の引数に代入し、if文の条件式のところに書いておきます。

開始日と終了日の時間指定がない場合、isDateRange()で判別することもできます。例えば、12月24日から1月3日までに発生したシグナルをオフにするフィルタ関数は以下のように書けます。

//フィルタ関数
int FilterSignal(int signal)
{
   int ret = signal; //シグナルの初期化

   //売買シグナルのフィルタ
   if(isDateRange(12, 24, 1, 3)) ret = 0;

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

1日単位で指定する場合、共通ライブラリのisDateOn()が使えます。例えば、12月24日に発生したシグナルをオフにするフィルタ関数は以下のように書けます。

//フィルタ関数
int FilterSignal(int signal)
{
   int ret = signal; //シグナルの初期化

   //売買シグナルのフィルタ
   if(isDateOn(12, 24)) ret = 0;

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