191 lines
6.3 KiB
MQL5
191 lines
6.3 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| Runtime.mqh |
| |
//| Copyright 2025, MetaQuotes Ltd. |
| |
//| https://www.mql5.com |
| |
//+------------------------------------------------------------------+
| |
#property copyright "Copyright 2025, MetaQuotes Ltd."
| |
#property link "https://www.mql5.com"
| |
#property version "1.00"
| |
| |
#include "Market/DataManager.mqh"
| |
#include "Market/DataProcessor.mqh"
| |
#include "Events/EventBus/EventBus.mqh"
| |
| |
#include "Events/LoadingListener.mqh"
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
class ListenerRegistration
| |
{
| |
public:
| |
EventType eventType;
| |
IEventListener* listener;
| |
};
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
class Runtime final
| |
{
| |
private:
| |
| |
bool init;
| |
| |
EventBus* eventBus;
| |
DataManager* dataManager;
| |
DataProcessor* dataProcessor;
| |
LoadingListener* loaderListener;
| |
| |
CArrayList<ListenerRegistration*>* m_registrations;
| |
| |
void SubscribeAll();
| |
void UnsubscribeAll();
| |
void ClearRegistrations();
| |
| |
public:
| |
Runtime();
| |
~Runtime();
| |
| |
int Initialize(EAConfig &eaConfig);
| |
void Update(int count = 3);
| |
| |
void AddListener(EventType eventType, IEventListener* listener);
| |
void AddAnalyser(AbstractAnalyser* analyser)
| |
{
| |
dataProcessor.AddAnalyser(analyser) ;
| |
}
| |
};
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
Runtime::Runtime()
| |
{
| |
init = false;
| |
eventBus = new EventBus();
| |
dataManager = new DataManager(eventBus);
| |
dataProcessor = new DataProcessor(eventBus, dataManager);
| |
m_registrations = new CArrayList<ListenerRegistration*>();
| |
loaderListener = new LoadingListener();
| |
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
Runtime::~Runtime()
| |
{
| |
UnsubscribeAll();
| |
ClearRegistrations();
| |
| |
delete dataManager;
| |
delete eventBus;
| |
delete dataProcessor;
| |
| |
delete m_registrations;
| |
delete loaderListener;
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
int Runtime::Initialize(EAConfig &eaConfig)
| |
{
| |
if(!loaderListener.Initialize())
| |
return INIT_FAILED;
| |
| |
eventBus.Subscribe(LOADING, loaderListener);
| |
| |
// --- Loading sequence -------------------------------------------
| |
eventBus.Push(new LoadingEvent(START, 6, "Starting..."));
| |
eventBus.Dispatch();
| |
| |
eventBus.Push(new LoadingEvent(UPDATE, "Initializing Data Manager..."));
| |
eventBus.Dispatch();
| |
dataManager.Initialize(eaConfig);
| |
| |
eventBus.Push(new LoadingEvent(UPDATE, "Subscribing..."));
| |
eventBus.Dispatch();
| |
AddListener(NEW_BAR, dataProcessor);
| |
SubscribeAll();
| |
Sleep(500);
| |
| |
eventBus.Push(new LoadingEvent(UPDATE, "Initializing Trade Executor..."));
| |
eventBus.Dispatch();
| |
//executor.SetMagic(eaConfig.magicNumber);
| |
//executor.SetDeviation(eaConfig.Slippage);
| |
Sleep(500);
| |
| |
eventBus.Push(new LoadingEvent(UPDATE, "Initializing Systems..."));
| |
eventBus.Dispatch();
| |
Sleep(500);
| |
| |
eventBus.Push(new LoadingEvent(UPDATE, "Launching..."));
| |
eventBus.Dispatch();
| |
Sleep(500);
| |
| |
eventBus.Push(new LoadingEvent(UPDATE, "Finished"));
| |
eventBus.Dispatch();
| |
Sleep(25);
| |
| |
eventBus.Push(new LoadingEvent(CLOSE, ""));
| |
eventBus.Dispatch();
| |
| |
return INIT_SUCCEEDED;
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void Runtime::Update(int count = 3)
| |
{
| |
| |
if(init == true)
| |
{
| |
dataManager.Update(count);
| |
}
| |
else
| |
{
| |
dataProcessor.Launch();
| |
init = true;
| |
}
| |
eventBus.Dispatch();
| |
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void Runtime::AddListener(EventType eventType, IEventListener* listener)
| |
{
| |
ListenerRegistration* reg = new ListenerRegistration();
| |
reg.eventType = eventType;
| |
reg.listener = listener;
| |
m_registrations.Add(reg);
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void Runtime::SubscribeAll()
| |
{
| |
for(int i = 0; i < m_registrations.Size(); i++)
| |
{
| |
ListenerRegistration* reg = m_registrations.At(i);
| |
eventBus.Subscribe(reg.eventType, reg.listener);
| |
}
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void Runtime::UnsubscribeAll()
| |
{
| |
for(int i = 0; i < m_registrations.Size(); i++)
| |
{
| |
ListenerRegistration* reg = m_registrations.At(i);
| |
eventBus.Unsubscribe(reg.eventType, reg.listener);
| |
}
| |
}
| |
//+------------------------------------------------------------------+
| |
//| |
| |
//+------------------------------------------------------------------+
| |
void Runtime::ClearRegistrations()
| |
{
| |
for(int i = 0; i < m_registrations.Size(); i++)
| |
delete m_registrations.At(i);
| |
m_registrations.Clear();
| |
}
| |
//+------------------------------------------------------------------+
|