MQLArticles/Strategy/Utils/DailyFilter.mqh
2025-12-05 16:33:47 -05:00

163 lines
No EOL
10 KiB
MQL5

//+------------------------------------------------------------------+
//| 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