//+------------------------------------------------------------------+ //| SignalITF.mqh | //| Copyright 2000-2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include "..\Expert\ExpertSignalCustom.mqh" // wizard description start //+------------------------------------------------------------------+ //| Description of the class | //| Title=Signals of intraday time filter | //| Type=SignalAdvanced | //| Name=IntradayTimeFilter | //| ShortName=ITF | //| Class=CSignalITF | //| Page=signal_time_filter | //| Parameter=GoodHourOfDay,int,-1,Good hour | //| Parameter=BadHoursOfDay,int,0,Bad hours (bit-map) | //| Parameter=GoodDayOfWeek,int,-1,Good day of week | //| Parameter=BadDaysOfWeek,int,0,Bad days of week (bit-map) | //+------------------------------------------------------------------+ // wizard description end //+------------------------------------------------------------------+ //| Class CSignalITF. | //| Appointment: Class trading signals time filter. | //| Derives from class CExpertSignal. | //+------------------------------------------------------------------+ class CSignalITF : public CExpertSignalCustom { protected: //--- input parameters int m_good_minute_of_hour; long m_bad_minutes_of_hour; int m_good_hour_of_day; int m_bad_hours_of_day; int m_good_day_of_week; int m_bad_days_of_week; public: CSignalITF(void); ~CSignalITF(void); //--- methods initialize protected data void GoodMinuteOfHour(int value) { m_good_minute_of_hour = value; } void BadMinutesOfHour(long value) { m_bad_minutes_of_hour = value; } void GoodHourOfDay(int value) { m_good_hour_of_day = value; } void BadHoursOfDay(int value) { m_bad_hours_of_day = ConvertToBinary(value); } void GoodDayOfWeek(int value) { m_good_day_of_week = value; } void BadDaysOfWeek(int value) { m_bad_days_of_week = ConvertToBinary(value); } //--- methods of checking conditions of entering the market virtual double Direction(void); private: //--- helper method for explicit conversion to binary int ConvertToBinary(int decimalValue); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CSignalITF::CSignalITF(void) : m_good_minute_of_hour(-1), m_bad_minutes_of_hour(0), m_good_hour_of_day(-1), m_bad_hours_of_day(0), m_good_day_of_week(-1), m_bad_days_of_week(0) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CSignalITF::~CSignalITF(void) { } //+------------------------------------------------------------------+ //| Check conditions for time filter. | //+------------------------------------------------------------------+ double CSignalITF::Direction(void) { MqlDateTime s_time; //--- TimeCurrent(s_time); //--- check days conditions if(!((m_good_day_of_week == -1 || m_good_day_of_week == s_time.day_of_week) && !(m_bad_days_of_week & (1 << s_time.day_of_week)))) return(EMPTY_VALUE); //--- check hours conditions if(!((m_good_hour_of_day == -1 || m_good_hour_of_day == s_time.hour) && !(m_bad_hours_of_day & (1 << s_time.hour)))) return(EMPTY_VALUE); //--- check minutes conditions if(!((m_good_minute_of_hour == -1 || m_good_minute_of_hour == s_time.min) && !(m_bad_minutes_of_hour & (1 << s_time.min)))) return(EMPTY_VALUE); //--- condition OK return(0.0); } //+------------------------------------------------------------------+ //| Convert decimal value to binary. | //+------------------------------------------------------------------+ int CSignalITF::ConvertToBinary(int decimalValue) { int binaryValue = 0; int base = 1; while(decimalValue > 0) { binaryValue += (decimalValue % 2) * base; decimalValue /= 2; base *= 10; } return binaryValue; } //+------------------------------------------------------------------+