//+------------------------------------------------------------------+ //| EAEvents.mqh | //| Copyright 2025, Your Company Name | //| https://www.yoursite.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Your Company Name" #property link "https://www.yoursite.com" #property version "1.00" #property strict #include #include "EALogger.mqh" #include "EAState.mqh" //+------------------------------------------------------------------+ //| Event types | //+------------------------------------------------------------------+ enum ENUM_EVENT_TYPE { EVENT_TICK, // New tick event EVENT_TIMER, // Timer event EVENT_TRADE, // Trade event EVENT_ORDER, // Order event EVENT_POSITION, // Position event EVENT_SIGNAL // Signal event }; //+------------------------------------------------------------------+ //| Base event class | //+------------------------------------------------------------------+ class CBaseEvent : public CObject { protected: ENUM_EVENT_TYPE m_type; // Event type ulong m_id; // Event ID datetime m_time; // Event time public: // Constructor CBaseEvent(ENUM_EVENT_TYPE type) : m_type(type), m_id(0), m_time(0) { m_time = TimeCurrent(); } // Getters ENUM_EVENT_TYPE Type() const { return m_type; } ulong Id() const { return m_id; } datetime Time() const { return m_time; } // Virtual methods virtual bool Process() = 0; virtual string ToString() const = 0; }; //+------------------------------------------------------------------+ //| Tick event | //+------------------------------------------------------------------+ class CTickEvent : public CBaseEvent { private: MqlTick m_tick; public: CTickEvent() : CBaseEvent(EVENT_TICK) {} bool Process() { // Process tick event if (!SymbolInfoTick(Symbol(), m_tick)) return false; return true; } string ToString() const { return StringFormat("Tick: %s %.5f", TimeToString(m_tick.time), m_tick.last); } }; //+------------------------------------------------------------------+ //| Timer event | //+------------------------------------------------------------------+ class CTimerEvent : public CBaseEvent { public: CTimerEvent() : CBaseEvent(EVENT_TIMER) {} bool Process() { // Process timer event return true; } string ToString() const { return "Timer: " + TimeToString(Time()); } }; //+------------------------------------------------------------------+ //| Trade event | //+------------------------------------------------------------------+ class CTradeEvent : public CBaseEvent { private: ENUM_TRADE_EVENT m_tradeEvent; public: CTradeEvent(ENUM_TRADE_EVENT event) : CBaseEvent(EVENT_TRADE), m_tradeEvent(event) {} bool Process() { // Process trade event return true; } string ToString() const { return "Trade: " + EnumToString(m_tradeEvent); } }; //+------------------------------------------------------------------+ //| Event queue | //+------------------------------------------------------------------+ class CEventQueue { private: CArrayObj* m_events; // Event queue int m_maxSize; // Maximum queue size public: CEventQueue(int maxSize = 1000) : m_maxSize(maxSize) { m_events = new CArrayObj(); } ~CEventQueue() { if (m_events != NULL) { m_events.Clear(); delete m_events; } } bool Enqueue(CBaseEvent* event) { if (m_events.Total() >= m_maxSize) return false; return m_events.Add(event); } CBaseEvent* Dequeue() { if (m_events.Total() == 0) return NULL; CBaseEvent* event = m_events.At(0); m_events.Delete(0); return event; } int Size() const { return m_events.Total(); } bool IsEmpty() const { return m_events.Total() == 0; } }; //+------------------------------------------------------------------+ //| Event manager | //+------------------------------------------------------------------+ class CEAEvents { private: CEventQueue* m_eventQueue; // Event queue CEALogger* m_logger; // Logger instance CEAState* m_state; // State manager // Event handlers bool ProcessTickEvent(CBaseEvent* event); bool ProcessTimerEvent(CBaseEvent* event); bool ProcessTradeEvent(CBaseEvent* event); public: CEAEvents() : m_eventQueue(NULL), m_logger(NULL), m_state(NULL) {} ~CEAEvents() { Deinitialize(); } bool Initialize(CEALogger* logger, CEAState* state); void Deinitialize(); // Event processing bool ProcessTick(); bool ProcessTimer(); bool ProcessTrade(); // Event generation bool GenerateTickEvent(); bool GenerateTimerEvent(); bool GenerateTradeEvent(ENUM_TRADE_EVENT event); }; //+------------------------------------------------------------------+ //| Initialize event system | //+------------------------------------------------------------------+ bool CEAEvents::Initialize(CEALogger* logger, CEAState* state) { if (logger == NULL || state == NULL) return false; m_logger = logger; m_state = state; m_eventQueue = new CEventQueue(); m_logger.LogInfo("Event system initialized"); return true; } //+------------------------------------------------------------------+ //| Deinitialize event system | //+------------------------------------------------------------------+ void CEAEvents::Deinitialize() { if (m_eventQueue != NULL) { delete m_eventQueue; m_eventQueue = NULL; } m_logger = NULL; m_state = NULL; } //+------------------------------------------------------------------+ //| Process tick event | //+------------------------------------------------------------------+ bool CEAEvents::ProcessTick() { // Process all pending events while (!m_eventQueue.IsEmpty()) { CBaseEvent* event = m_eventQueue.Dequeue(); if (event == NULL) continue; bool result = false; switch (event.Type()) { case EVENT_TICK: result = ProcessTickEvent(event); break; case EVENT_TIMER: result = ProcessTimerEvent(event); break; case EVENT_TRADE: result = ProcessTradeEvent(event); break; default: break; } delete event; } return true; } //+------------------------------------------------------------------+ //| Process timer event | //+------------------------------------------------------------------+ bool CEAEvents::ProcessTimer() { // Process timer-based events return true; } //+------------------------------------------------------------------+ //| Process trade event | //+------------------------------------------------------------------+ bool CEAEvents::ProcessTrade() { // Process trade-related events return true; } //+------------------------------------------------------------------+ //| Process tick event | //+------------------------------------------------------------------+ bool CEAEvents::ProcessTickEvent(CBaseEvent* event) { if (event.Type() != EVENT_TICK) return false; CTickEvent* tick = (CTickEvent*)event; // Update state with new tick data if (m_state != NULL) m_state->UpdateLastTick(tick); return true; } //+------------------------------------------------------------------+ //| Process timer event | //+------------------------------------------------------------------+ bool CEAEvents::ProcessTimerEvent(CBaseEvent* event) { if (event.Type() != EVENT_TIMER) return false; // Process timer-based tasks return true; } //+------------------------------------------------------------------+ //| Process trade event | //+------------------------------------------------------------------+ bool CEAEvents::ProcessTradeEvent(CBaseEvent* event) { if (event.Type() != EVENT_TRADE) return false; // Process trade events return true; } //+------------------------------------------------------------------+ //| Generate tick event | //+------------------------------------------------------------------+ bool CEAEvents::GenerateTickEvent() { if (m_eventQueue == NULL) return false; CTickEvent* event = new CTickEvent(); return m_eventQueue.Enqueue(event); } //+------------------------------------------------------------------+ //| Generate timer event | //+------------------------------------------------------------------+ bool CEAEvents::GenerateTimerEvent() { if (m_eventQueue == NULL) return false; CTimerEvent* event = new CTimerEvent(); return m_eventQueue.Enqueue(event); } //+------------------------------------------------------------------+ //| Generate trade event | //+------------------------------------------------------------------+ bool CEAEvents::GenerateTradeEvent(ENUM_TRADE_EVENT event) { if (m_eventQueue == NULL) return false; CTradeEvent* tradeEvent = new CTradeEvent(event); return m_eventQueue.Enqueue(tradeEvent); }