//+------------------------------------------------------------------+ //| DailyFilter.mqh | //| Copyright 2025, Leo. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Leo." #property link "https://www.mql5.com" #property strict #ifndef MQLARTICLES_STRATEGY_UTILS_DAILYFILTER_MQH #define MQLARTICLES_STRATEGY_UTILS_DAILYFILTER_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "..\\..\\..\\TimeUtils\\TimeUtils.mqh" //+------------------------------------------------------------------+ //| Clase CWeeklyFilter | //+------------------------------------------------------------------+ class CWeeklyFilter { private: bool m_days[7]; bool m_operarCrypto; public: CWeeklyFilter(void); ~CWeeklyFilter(void); //--- Configuración de días void Set(bool lunes, bool martes, bool miercoles, bool jueves, bool viernes, bool sabado, bool domingo); void Set(const bool& arr[], int src_start = 0) { ArrayCopy(m_days, arr, 0, src_start, 7); } //--- Setters y Getters // Domingo inline bool Domingo(bool value) { return (m_days[0] = value); } __forceinline bool Domingo() const { return m_days[0]; } // Lunes inline bool Lunes(bool value) { return (m_days[1] = value); } __forceinline bool Lunes() const { return m_days[1]; } // Martes inline bool Martes(bool value) { return (m_days[2] = value); } __forceinline bool Martes() const { return m_days[2]; } // Miércoles inline bool Miercoles(bool value) { return (m_days[3] = value); } __forceinline bool Miercoles() const { return m_days[3]; } // Jueves inline bool Jueves(bool value) { return (m_days[4] = value); } __forceinline bool Jueves() const { return m_days[4]; } // Viernes inline bool Viernes(bool value) { return (m_days[5] = value); } __forceinline bool Viernes() const { return m_days[5]; } // Sábado inline bool Sabado(bool value) { return (m_days[6] = value); } __forceinline bool Sabado() const { return m_days[6]; } // Día de la semana (0-6, Domingo=0, Lunes=1, etc.) __forceinline bool DayOfWeek(int day, bool value) { return (m_days[day] = value); } __forceinline bool DayOfWeek(int day) const { return m_days[day]; } // Modo crypto inline bool OperarCrypto(bool value) { return (m_operarCrypto = value); } __forceinline bool OperarCrypto() const { return m_operarCrypto; } //--- Verificación de días de operación __forceinline bool IsDayTrade() const; __forceinline bool IsDayTrade(datetime time) const; bool IsDayTradeByDayOfWeek(int day_of_week) const; //--- Utilidades inline void EnableAll(); inline void DisableAll(); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CWeeklyFilter::CWeeklyFilter(void) { m_days[0] = false; // Domingo m_days[1] = true; // Lunes m_days[2] = true; // Martes m_days[3] = true; // Miércoles m_days[4] = true; // Jueves m_days[5] = true; // Viernes m_days[6] = false; // Sábado m_operarCrypto = false; } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CWeeklyFilter::~CWeeklyFilter(void) { } //+------------------------------------------------------------------+ //| Habilitar todos los días | //+------------------------------------------------------------------+ inline void CWeeklyFilter::EnableAll() { for(int i = 0; i < 7; i++) m_days[i] = true; } //+------------------------------------------------------------------+ //| Deshabilitar todos los días | //+------------------------------------------------------------------+ inline void CWeeklyFilter::DisableAll() { for(int i = 0; i < 7; i++) m_days[i] = false; } //+------------------------------------------------------------------+ //| Establecer todos los días de una vez | //+------------------------------------------------------------------+ void CWeeklyFilter::Set(bool lunes, bool martes, bool miercoles, bool jueves, bool viernes, bool sabado, bool domingo) { m_days[0] = domingo; m_days[1] = lunes; m_days[2] = martes; m_days[3] = miercoles; m_days[4] = jueves; m_days[5] = viernes; m_days[6] = sabado; } //+------------------------------------------------------------------+ //| Verificar si un día de la semana es un día de operación | //+------------------------------------------------------------------+ bool CWeeklyFilter::IsDayTradeByDayOfWeek(int day_of_week) const { if((day_of_week == 0 || day_of_week == 6) && !m_operarCrypto) return false; return m_days[day_of_week]; } //+------------------------------------------------------------------+ //| Verificar si un día específico es un día de operación | //+------------------------------------------------------------------+ __forceinline bool CWeeklyFilter::IsDayTrade(datetime time) const { return IsDayTradeByDayOfWeek(CTimeUtils::DayOfWeek(time)); } //+------------------------------------------------------------------+ //| Verificar si el día actual es un día de operación | //+------------------------------------------------------------------+ __forceinline bool CWeeklyFilter::IsDayTrade() const { return IsDayTrade(TimeCurrent()); } //+------------------------------------------------------------------+ #endif // MQLARTICLES_STRATEGY_UTILS_DAILYFILTER_MQH