//+------------------------------------------------------------------+ //| 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 //+------------------------------------------------------------------+ //| Clase CWeeklyFilter | //+------------------------------------------------------------------+ class CWeeklyFilter { private: bool m_lunes; bool m_martes; bool m_miercoles; bool m_jueves; bool m_viernes; bool m_sabado; bool m_domingo; bool m_operarCrypto; // Indica si el bot opera en mercados crypto (24/7) public: CWeeklyFilter(void); ~CWeeklyFilter(void); // Configurar todos los días a la vez void Set(bool lunes, bool martes, bool miercoles, bool jueves, bool viernes, bool sabado, bool domingo); // Establecer días individuales void SetLunes(bool value) { m_lunes = value; } void SetMartes(bool value) { m_martes = value; } void SetMiercoles(bool value) { m_miercoles = value; } void SetJueves(bool value) { m_jueves = value; } void SetViernes(bool value) { m_viernes = value; } void SetSabado(bool value) { m_sabado = value; } void SetDomingo(bool value) { m_domingo = value; } // Establecer modo crypto void SetOperarCrypto(bool value) { m_operarCrypto = value; } // Verificar si el día actual es un día de operación inline bool IsDayTrade(); // Verificar si un día específico es un día de operación bool IsDayTrade(datetime time); // Verificar si un día de la semana es un día de operación bool IsDayTradeByDayOfWeek(int day_of_week); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CWeeklyFilter::CWeeklyFilter(void) { // Por defecto, operar en días laborables (lunes a viernes) m_lunes = true; m_martes = true; m_miercoles = true; m_jueves = true; m_viernes = true; m_sabado = false; m_domingo = false; m_operarCrypto = false; } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CWeeklyFilter::~CWeeklyFilter(void) { // No se requieren acciones de limpieza especiales } //+------------------------------------------------------------------+ //| 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_lunes = lunes; m_martes = martes; m_miercoles = miercoles; m_jueves = jueves; m_viernes = viernes; m_sabado = sabado; m_domingo = domingo; } //+------------------------------------------------------------------+ //| Verificar si el día actual es un día de operación | //+------------------------------------------------------------------+ bool CWeeklyFilter::IsDayTrade() { return IsDayTrade(TimeCurrent()); } //+------------------------------------------------------------------+ //| Verificar si un día específico es un día de operación | //+------------------------------------------------------------------+ bool CWeeklyFilter::IsDayTrade(datetime time) { MqlDateTime dt; TimeToStruct(time, dt); return IsDayTradeByDayOfWeek(dt.day_of_week); } //+------------------------------------------------------------------+ //| Verificar si un día de la semana es un día de operación | //+------------------------------------------------------------------+ bool CWeeklyFilter::IsDayTradeByDayOfWeek(int day_of_week) { if((day_of_week == 0 || day_of_week == 6) && !m_operarCrypto) { return false; } switch(day_of_week) { case 0: return m_domingo; // Domingo case 1: return m_lunes; // Lunes case 2: return m_martes; // Martes case 3: return m_miercoles; // Miércoles case 4: return m_jueves; // Jueves case 5: return m_viernes; // Viernes case 6: return m_sabado; // Sábado default: return false; // Por si acaso } } //+------------------------------------------------------------------+ #endif // MQLARTICLES_STRATEGY_UTILS_DAILYFILTER_MQH