日中の決まった時間帯に発生した仕掛けシグナルのみを採用するタイムフィルタの例です。
共通ライブラリには、開始時刻(時・分)と終了時刻(時・分)を指定して、現在その時刻かがその範囲内に入っているかどうかを判別する関数isTimeRange()
があります。
//共通ライブラリ
#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 EndHour = 20; // 終了時刻(時)
//フィルタ関数
int FilterSignal(int signal)
{
int ret = 0; //シグナルの初期化
//売買シグナルのフィルタ
if(isTimeRange(StartHour, 0, EndHour, 0)) ret = signal;
return ret; //シグナルの出力
}
isTimeRange()
は、開始時刻の時hour_from
、分min_from
、終了時刻の時hour_to
、分min_to
と4つの引数をとります。
この例では、開始時刻、終了時刻の時として別途宣言したStartHour
、EndHour
をそれぞれhour_from
、hour_to
に代入します。min_from
、min_to
には、0分という意味で0
をそれぞれ代入します。
isTimeRange()
は、現在の時刻が開始時刻と終了時刻の範囲内であれば、true
を返す関数なので、if文の条件式のところに書いておくだけです。
なお、開始時刻と終了時刻の範囲内にシグナルを無効にした場合は、以下のようにシグナルの初期化の値と、if文で設定するシグナルの値を逆にすればOKです。
input int StartHour = 12; // 開始時刻(時)
input int EndHour = 20; // 終了時刻(時)
//フィルタ関数
int FilterSignal(int signal)
{
int ret = signal; //シグナルの初期化
//売買シグナルのフィルタ
if(isTimeRange(StartHour, 0, EndHour, 0)) ret = 0;
return ret; //シグナルの出力
}