mql5/Experts/Advisors/DualEA/LiveEA/LiveEA_StrategyBridge.mqh

141 lines
5.5 KiB
MQL5
Raw Permalink Normal View History

2025-09-20 02:28:46 -04:00
//+------------------------------------------------------------------+
//| LiveEA Strategy Bridge - Connects PaperEA insights to LiveEA |
//+------------------------------------------------------------------+
#include "..\Include\IStrategy.mqh"
#include "..\Include\Strategies\Registry.mqh"
#include "..\Include\InsightsLoader.mqh"
// Include all strategy headers
#include "..\Include\Strategies\BollAveragesStrategy.mqh"
#include "..\Include\Strategies\DonchianATRBreakoutStrategy.mqh"
#include "..\Include\Strategies\MeanReversionBBStrategy.mqh"
#include "..\Include\Strategies\RSI2BBReversionStrategy.mqh"
#include "..\Include\Strategies\SuperTrendADXKamaStrategy.mqh"
#include "..\Include\Strategies\OpeningRangeBreakoutStrategy.mqh"
#include "..\Include\Strategies\VWAPReversionStrategy.mqh"
#include "..\Include\Strategies\EMAPullbackStrategy.mqh"
#include "..\Include\Strategies\KeltnerMomentumStrategy.mqh"
#include "..\Include\Strategies\AcceleratorOscillatorStrategy.mqh"
#include "..\Include\Strategies\ADXStrategy.mqh"
#include "..\Include\Strategies\AlligatorStrategy.mqh"
#include "..\Include\Strategies\AroonStrategy.mqh"
#include "..\Include\Strategies\MultiIndicatorStrategy.mqh"
#include "..\Include\Strategies\GoldVolatilityStrategy.mqh"
#include "..\Include\Strategies\ForexTrendStrategy.mqh"
#include "..\Include\Strategies\IndicesEnergiesStrategy.mqh"
#include "..\Include\Strategies\AwesomeOscillatorStrategy.mqh"
#include "..\Include\Strategies\BearsPowerStrategy.mqh"
#include "..\Include\Strategies\BullsPowerStrategy.mqh"
class CLiveEAStrategyBridge
{
private:
IStrategy* m_strategies[];
string m_symbol;
ENUM_TIMEFRAMES m_tf;
bool m_initialized;
public:
CLiveEAStrategyBridge(const string symbol, const ENUM_TIMEFRAMES tf)
{
m_symbol = symbol;
m_tf = tf;
m_initialized = false;
ArrayResize(m_strategies, 0);
}
~CLiveEAStrategyBridge()
{
for(int i=0; i<ArraySize(m_strategies); ++i)
if(CheckPointer(m_strategies[i])==POINTER_DYNAMIC)
delete m_strategies[i];
}
bool Initialize()
{
if(m_initialized) return true;
string strategy_names[];
GetDefaultStrategyNames(strategy_names);
for(int i=0; i<ArraySize(strategy_names); ++i)
{
IStrategy* strategy = CreateStrategy(strategy_names[i], m_symbol, m_tf);
if(CheckPointer(strategy)!=POINTER_INVALID)
{
int size = ArraySize(m_strategies);
ArrayResize(m_strategies, size+1);
m_strategies[size] = strategy;
}
}
m_initialized = true;
return ArraySize(m_strategies) > 0;
}
IStrategy* CreateStrategy(const string name, const string symbol, const ENUM_TIMEFRAMES tf)
{
// Factory method to create strategies by name
if(name == "BollAveragesStrategy") return new CBollAveragesStrategy(symbol, tf);
if(name == "DonchianATRBreakoutStrategy") return new CDonchianATRBreakoutStrategy(symbol, tf);
if(name == "MeanReversionBBStrategy") return new CMeanReversionBBStrategy(symbol, tf);
if(name == "RSI2BBReversionStrategy") return new CRSI2BBReversionStrategy(symbol, tf);
if(name == "SuperTrendADXKamaStrategy") return new CSuperTrendADXKamaStrategy(symbol, tf);
if(name == "OpeningRangeBreakoutStrategy") return new COpeningRangeBreakoutStrategy(symbol, tf);
if(name == "VWAPReversionStrategy") return new CVWAPReversionStrategy(symbol, tf);
if(name == "EMAPullbackStrategy") return new CEMAPullbackStrategy(symbol, tf);
if(name == "KeltnerMomentumStrategy") return new CKeltnerMomentumStrategy(symbol, tf);
if(name == "AcceleratorOscillatorStrategy") return new CAcceleratorOscillatorStrategy(symbol, tf);
if(name == "ADXStrategy") return new CADXStrategy(symbol, tf);
if(name == "AlligatorStrategy") return new CAlligatorStrategy(symbol, tf);
if(name == "AroonStrategy") return new CAroonStrategy(symbol, tf);
if(name == "MultiIndicatorStrategy") return new CMultiIndicatorStrategy(symbol, tf);
if(name == "GoldVolatilityStrategy") return new CGoldVolatilityStrategy(symbol, tf);
if(name == "ForexTrendStrategy") return new CForexTrendStrategy(symbol, tf);
if(name == "IndicesEnergiesStrategy") return new CIndicesEnergiesStrategy(symbol, tf);
if(name == "AwesomeOscillatorStrategy") return new CAwesomeOscillatorStrategy(symbol, tf);
if(name == "BearsPowerStrategy") return new CBearsPowerStrategy(symbol, tf);
if(name == "BullsPowerStrategy") return new CBullsPowerStrategy(symbol, tf);
return NULL;
}
void RefreshAll()
{
if(!m_initialized) return;
for(int i=0; i<ArraySize(m_strategies); ++i)
if(CheckPointer(m_strategies[i])!=POINTER_INVALID)
m_strategies[i].Refresh();
}
TradeOrder CheckAllSignals()
{
TradeOrder best_order;
best_order.action = ACTION_NONE;
if(!m_initialized) return best_order;
RefreshAll();
for(int i=0; i<ArraySize(m_strategies); ++i)
{
if(CheckPointer(m_strategies[i])==POINTER_INVALID) continue;
TradeOrder order = m_strategies[i].CheckSignal();
if(order.action != ACTION_NONE)
{
// Simple priority: take the first valid signal
return order;
}
}
return best_order;
}
string GetStatus()
{
if(!m_initialized) return "Not initialized";
return StringFormat("Bridge active with %d strategies", ArraySize(m_strategies));
}
};