//+------------------------------------------------------------------+ //| DataProcessor.mqh | //| Copyright 2026, Concrete Goonies | //| https://concrete-goonies.web.app | //+------------------------------------------------------------------+ #property copyright "Copyright 2026, Concrete Goonies" #property link "https://concrete-goonies.web.app" #property version "1.00" #include #include "../Analysers/AbstractAnalyser.mqh" #include "../Events/Events/NewBarEvent.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class DataProcessor : public IEventListener { private: EventBus* eventBus; DataManager* m_data; CArrayList* analysers; int FindExist(const string symbol, ENUM_TIMEFRAMES tf); void RunAnalyser(TimeFrameDataSeries* series, int barIndex) { for(int c = 0; c < analysers.Size(); c++) analysers.At(c).ProcessBar(series, barIndex); } public: DataProcessor(EventBus* p_eventBus, DataManager* data); ~DataProcessor(); void AddAnalyser(AbstractAnalyser* p_analyser); void Launch(); void Update(string symbol, ENUM_TIMEFRAMES tf); virtual void OnEvent(AbstractEvent * event) override { if(event.GetType() != NEW_BAR) return; NewBarEvent* e = (NewBarEvent*)event; Update(e.GetSymbolName(), e.GetTimeFrame()); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ DataProcessor::DataProcessor(EventBus* p_eventBus, DataManager* data): eventBus(p_eventBus), m_data(data) { analysers = new CArrayList(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ DataProcessor:: ~DataProcessor() { delete analysers; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DataProcessor::Update(string symbol, ENUM_TIMEFRAMES tf) { if(m_data == NULL) return; CArrayList* rawData = m_data.GetRawData(); int totalSeries = rawData.Size(); for(int i = 0; i < totalSeries; i++) { TimeFrameDataSeries* series = rawData.At(i); if(series.tf != tf || series.symbol != symbol) continue; //Check Reset if(m_data.CheckAndRelaunch(i)) { series.isReset = false; for(int k = 0; k < analysers.Size(); k++) { analysers.At(k).Reset(series.symbol, series.tf); } } int total = series.TotalBars(); // series.Update(total); for(int barIdx = 0; barIdx < total; barIdx++) RunAnalyser(series, barIdx); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DataProcessor::Launch() { if(m_data == NULL) return; CArrayList* rawData = m_data.GetRawData(); int totalSeries = rawData.Size(); for(int i = 0; i < totalSeries; i++) { TimeFrameDataSeries* series = rawData.At(i); int total = series.TotalBars(); series.Update(total); for(int barIdx = 0; barIdx < total; barIdx++) RunAnalyser(series, barIdx); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void DataProcessor::AddAnalyser(AbstractAnalyser* p_analyser) { p_analyser.Init(eventBus); analysers.Add(p_analyser); } //+------------------------------------------------------------------+