mql5/Experts/_FrameWork/Market/DataProcessor.mqh
younglubah-gmail a4b935d8d8
2026-09-30 09:06:59 +02:00

135 lines
4.5 KiB
MQL5

//+------------------------------------------------------------------+
//| 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 <Collection/DynamicArraylist.mqh>
#include "../Analysers/AbstractAnalyser.mqh"
#include "../Events/Events/NewBarEvent.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class DataProcessor : public IEventListener
{
private:
EventBus* eventBus;
DataManager* m_data;
CArrayList<AbstractAnalyser*>* 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<AbstractAnalyser*>();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
DataProcessor:: ~DataProcessor()
{
delete analysers;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void DataProcessor::Update(string symbol, ENUM_TIMEFRAMES tf)
{
if(m_data == NULL)
return;
CArrayList<TimeFrameDataSeries*>* 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<TimeFrameDataSeries*>* 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);
}
//+------------------------------------------------------------------+