forked from nique_372/MQLArticles
405 lines
26 KiB
MQL5
405 lines
26 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Events.mqh |
|
|
//| Niquel y Leo, Copyright 2025. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Niquel y Leo, Copyright 2025"
|
|
#property link "https://www.mql5.com"
|
|
#property strict
|
|
|
|
|
|
#ifndef MQLARTICLES_UTILS_FA_EVENTS_MQH
|
|
#define MQLARTICLES_UTILS_FA_EVENTS_MQH
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Include |
|
|
//+------------------------------------------------------------------+
|
|
#include "Managers.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Clase base para los eventos basicos |
|
|
//+------------------------------------------------------------------+
|
|
class CAllClassEventsBasic : public CSpecializedManager
|
|
{
|
|
protected:
|
|
//--- Impidimos la instanciacion solo ptr.. pero se debe de asignar..
|
|
CAllClassEventsBasic() {}
|
|
public:
|
|
~CAllClassEventsBasic() {}
|
|
|
|
//--- Eventos basicos
|
|
// Nota: Estos eventos son los basicos
|
|
virtual void OnNewDay(const datetime& curr_time) {}
|
|
virtual void OnNewWeek(const datetime& curr_time) {}
|
|
virtual void OnNewMonth(const datetime& curr_time) {}
|
|
};
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Clase base para los eventos |
|
|
//+------------------------------------------------------------------+
|
|
#define BASICEVENT_REG_FLAG_ON_NEW_DAY (1)
|
|
#define BASICEVENT_REG_FLAG_ON_NEW_WEEK (2)
|
|
#define BASICEVENT_REG_FLAG_ON_NEW_MON (4)
|
|
|
|
//---
|
|
#define BASICEVENT_REG_ALL_FLAG (BASICEVENT_REG_FLAG_ON_NEW_DAY|BASICEVENT_REG_FLAG_ON_NEW_WEEK|BASICEVENT_REG_FLAG_ON_NEW_MON)
|
|
|
|
|
|
//---
|
|
class CBasicEvents
|
|
{
|
|
private:
|
|
|
|
static bool m_free;
|
|
static CAllClassEventsBasic* m_on_new_day[];
|
|
static int m_on_new_day_size;
|
|
|
|
static CAllClassEventsBasic* m_on_new_week[];
|
|
static int m_on_new_week_size;
|
|
|
|
static CAllClassEventsBasic* m_on_new_mon[];
|
|
static int m_on_new_mon_size;
|
|
|
|
//---
|
|
static void RemoveFromArrayFast(CAllClassEventsBasic* &array[], int &size, CAllClassEventsBasic* &ptr);
|
|
|
|
public:
|
|
CBasicEvents(void) {}
|
|
~CBasicEvents(void) {}
|
|
|
|
//--- Registrar
|
|
static void Register(CAllClassEventsBasic* ptr, const uint8_t flags);
|
|
static void RegisterEvent(CAllClassEventsBasic* ptr, const uint8_t event);
|
|
|
|
static void Unregister(CAllClassEventsBasic* ptr, const uint8_t flags);
|
|
static void UnregisterEvent(CAllClassEventsBasic* ptr, const uint8_t event);
|
|
|
|
|
|
//--- Eventos
|
|
static void OnNewDay(const datetime& curr_time);
|
|
static void OnNewWeek(const datetime& curr_time);
|
|
static void OnNewMonth(const datetime& curr_time);
|
|
|
|
//---
|
|
static void Deinit(const int& reason);
|
|
|
|
//---
|
|
static __forceinline bool IsActive() { return !m_free; }
|
|
};
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::RemoveFromArrayFast(CAllClassEventsBasic* &array[], int &size, CAllClassEventsBasic* &ptr)
|
|
{
|
|
for(int i = 0; i < size; i++)
|
|
{
|
|
if(array[i] == ptr)
|
|
{
|
|
array[i] = array[size - 1];
|
|
ArrayResize(array, --size);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::Unregister(CAllClassEventsBasic* ptr, const uint8_t flags)
|
|
{
|
|
if(!CheckPointer(ptr))
|
|
{
|
|
FastLog(FUNCION_ACTUAL, WARNING_TEXT, "Invalid pointer for unregister");
|
|
return;
|
|
}
|
|
|
|
//--- OnNewDay
|
|
if((flags & BASICEVENT_REG_FLAG_ON_NEW_DAY) != 0)
|
|
RemoveFromArrayFast(m_on_new_day, m_on_new_day_size, ptr);
|
|
|
|
//--- OnNewWeek
|
|
if((flags & BASICEVENT_REG_FLAG_ON_NEW_WEEK) != 0)
|
|
RemoveFromArrayFast(m_on_new_week, m_on_new_week_size, ptr);
|
|
|
|
//--- OnNewMonth
|
|
if((flags & BASICEVENT_REG_FLAG_ON_NEW_MON) != 0)
|
|
RemoveFromArrayFast(m_on_new_mon, m_on_new_mon_size, ptr);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::UnregisterEvent(CAllClassEventsBasic *ptr, const uchar event)
|
|
{
|
|
if(!CheckPointer(ptr))
|
|
{
|
|
FastLog(FUNCION_ACTUAL, WARNING_TEXT, "Invalid pointer for unregister");
|
|
return;
|
|
}
|
|
|
|
//--- OnNewDay
|
|
if(event == BASICEVENT_REG_FLAG_ON_NEW_DAY)
|
|
RemoveFromArrayFast(m_on_new_day, m_on_new_day_size, ptr);
|
|
|
|
//--- OnNewWeek
|
|
else
|
|
if(event == BASICEVENT_REG_FLAG_ON_NEW_WEEK)
|
|
RemoveFromArrayFast(m_on_new_week, m_on_new_week_size, ptr);
|
|
//--- OnNewMonth
|
|
else
|
|
if(event == BASICEVENT_REG_FLAG_ON_NEW_MON)
|
|
RemoveFromArrayFast(m_on_new_mon, m_on_new_mon_size, ptr);
|
|
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::RegisterEvent(CAllClassEventsBasic *ptr, const uchar event)
|
|
{
|
|
//---
|
|
if(!CheckPointer(ptr))
|
|
{
|
|
FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, "No se puede registrar puntos invalidos");
|
|
Remover();
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if(event == BASICEVENT_REG_FLAG_ON_NEW_DAY)
|
|
{
|
|
m_on_new_day[ArrayResize(m_on_new_day, (++m_on_new_day_size)) - 1 ] = ptr;
|
|
}
|
|
//---
|
|
else
|
|
if(event == BASICEVENT_REG_FLAG_ON_NEW_WEEK)
|
|
{
|
|
m_on_new_week[ArrayResize(m_on_new_week, (++m_on_new_week_size)) - 1 ] = ptr;
|
|
}
|
|
//---
|
|
else
|
|
if(event == BASICEVENT_REG_FLAG_ON_NEW_MON)
|
|
{
|
|
m_on_new_mon[ArrayResize(m_on_new_mon, (++m_on_new_mon_size)) - 1 ] = ptr;
|
|
}
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::Register(CAllClassEventsBasic *ptr, const uint8_t flags)
|
|
{
|
|
//---
|
|
if(!CheckPointer(ptr))
|
|
{
|
|
FastLog(FUNCION_ACTUAL, FATAL_ERROR_TEXT, "No se puede registrar puntos invalidos");
|
|
Remover();
|
|
return;
|
|
}
|
|
|
|
//---
|
|
if((flags & BASICEVENT_REG_FLAG_ON_NEW_DAY) != 0)
|
|
{
|
|
m_on_new_day[ArrayResize(m_on_new_day, (++m_on_new_day_size)) - 1 ] = ptr;
|
|
}
|
|
|
|
//---
|
|
if((flags & BASICEVENT_REG_FLAG_ON_NEW_WEEK) != 0)
|
|
{
|
|
m_on_new_week[ArrayResize(m_on_new_week, (++m_on_new_week_size)) - 1 ] = ptr;
|
|
}
|
|
|
|
//---
|
|
if((flags & BASICEVENT_REG_FLAG_ON_NEW_MON) != 0)
|
|
{
|
|
m_on_new_mon[ArrayResize(m_on_new_mon, (++m_on_new_mon_size)) - 1 ] = ptr;
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::OnNewDay(const datetime& curr_time)
|
|
{
|
|
for(int i = 0; i < m_on_new_day_size; i++)
|
|
{
|
|
m_on_new_day[i].OnNewDay(curr_time);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::OnNewWeek(const datetime &curr_time)
|
|
{
|
|
for(int i = 0; i < m_on_new_week_size; i++)
|
|
{
|
|
m_on_new_week[i].OnNewWeek(curr_time);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::OnNewMonth(const datetime &curr_time)
|
|
{
|
|
for(int i = 0; i < m_on_new_mon_size; i++)
|
|
{
|
|
m_on_new_mon[i].OnNewMonth(curr_time);
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
static void CBasicEvents::Deinit(const int &reason)
|
|
{
|
|
if(m_free)
|
|
return; // Ya se libero
|
|
|
|
m_on_new_day_size = ArrayResize(m_on_new_day, 0);
|
|
m_on_new_week_size = ArrayResize(m_on_new_week, 0);
|
|
m_on_new_mon_size = ArrayResize(m_on_new_mon, 0);
|
|
|
|
//---
|
|
m_free = true;
|
|
}
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
CAllClassEventsBasic* CBasicEvents::m_on_new_day[] = {};
|
|
int CBasicEvents::m_on_new_day_size = 0;
|
|
//---
|
|
CAllClassEventsBasic* CBasicEvents::m_on_new_week[] = {};
|
|
int CBasicEvents::m_on_new_week_size = 0;
|
|
//---
|
|
CAllClassEventsBasic*CBasicEvents:: m_on_new_mon[] = {};
|
|
int CBasicEvents::m_on_new_mon_size = 0;
|
|
//---
|
|
bool CBasicEvents::m_free = false;
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
/* ---------- Experts
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
//---
|
|
|
|
//---
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert tick function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTick()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Timer function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTimer()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Trade function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTrade()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| TradeTransaction function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTradeTransaction(const MqlTradeTransaction& trans,
|
|
const MqlTradeRequest& request,
|
|
const MqlTradeResult& result)
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Tester function |
|
|
//+------------------------------------------------------------------+
|
|
double OnTester()
|
|
{
|
|
//---
|
|
double ret=0.0;
|
|
//---
|
|
|
|
//---
|
|
return(ret);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| TesterInit function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTesterInit()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| TesterPass function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTesterPass()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| TesterDeinit function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTesterDeinit()
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| ChartEvent function |
|
|
//+------------------------------------------------------------------+
|
|
void OnChartEvent(const int id,
|
|
const long &lparam,
|
|
const double &dparam,
|
|
const string &sparam)
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| BookEvent function |
|
|
//+------------------------------------------------------------------+
|
|
void OnBookEvent(const string &symbol)
|
|
{
|
|
//---
|
|
|
|
}
|
|
|
|
---
|
|
[L1, L2, L3, L4]
|
|
[0, 2, 3]
|
|
|
|
---
|
|
Eliminar L3
|
|
- [L1, L2, L4]
|
|
Eliminar indice 2
|
|
- [0, 3]
|
|
|
|
|
|
|
|
*/
|
|
//+------------------------------------------------------------------+
|
|
#endif // MQLARTICLES_UTILS_FA_EVENTS_MQH
|