MQLArticles/Strategy/Utils/DailyFilter.mqh

163 lines
10 KiB
MQL5
Raw Permalink Normal View History

2025-12-05 16:33:47 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| 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<EFBFBD>as a la vez
void Set(bool lunes, bool martes, bool miercoles, bool jueves, bool viernes, bool sabado, bool domingo);
// Establecer d<EFBFBD>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<EFBFBD>a actual es un d<EFBFBD>a de operaci<EFBFBD>n
inline bool IsDayTrade();
// Verificar si un d<EFBFBD>a espec<EFBFBD>fico es un d<EFBFBD>a de operaci<EFBFBD>n
bool IsDayTrade(datetime time);
// Verificar si un d<EFBFBD>a de la semana es un d<EFBFBD>a de operaci<EFBFBD>n
bool IsDayTradeByDayOfWeek(int day_of_week);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CWeeklyFilter::CWeeklyFilter(void)
{
// Por defecto, operar en d<EFBFBD>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<EFBFBD>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<EFBFBD>a actual es un d<EFBFBD>a de operaci<EFBFBD>n |
//+------------------------------------------------------------------+
bool CWeeklyFilter::IsDayTrade()
{
return IsDayTrade(TimeCurrent());
}
//+------------------------------------------------------------------+
//| Verificar si un d<EFBFBD>a espec<EFBFBD>fico es un d<EFBFBD>a de operaci<EFBFBD>n |
//+------------------------------------------------------------------+
bool CWeeklyFilter::IsDayTrade(datetime time)
{
MqlDateTime dt;
TimeToStruct(time, dt);
return IsDayTradeByDayOfWeek(dt.day_of_week);
}
//+------------------------------------------------------------------+
//| Verificar si un d<EFBFBD>a de la semana es un d<EFBFBD>a de operaci<EFBFBD>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<EFBFBD>rcoles
case 4:
return m_jueves; // Jueves
case 5:
return m_viernes; // Viernes
case 6:
return m_sabado; // S<EFBFBD>bado
default:
return false; // Por si acaso
}
}
//+------------------------------------------------------------------+
#endif // MQLARTICLES_STRATEGY_UTILS_DAILYFILTER_MQH