dualea/Experts/Advisors/DualEA/Include/CRegimeAwareStrategy.mqh
2026-10-28 00:31:51 -04:00
52 lines
1.6 KiB
MQL5
#ifndef DUALEA_REGIME_AWARE_STRATEGY_MQH
#define DUALEA_REGIME_AWARE_STRATEGY_MQH
#include "CGateFeatureCache.mqh"
#include "AdvancedRegimeDetector.mqh"
// Adapt the existing regime detector to the master controller interface.
class CRegimeAwareStrategy
{
private:
CAdvancedRegimeDetector m_detector;
SRegimeResult m_result;
datetime m_last_bar;
public:
CRegimeAwareStrategy(CGateFeatureCache *cache=NULL) : m_detector(_Symbol, _Period), m_last_bar(0) {}
void Update()
{
datetime bar = iTime(_Symbol, _Period, 0);
if(bar <= 0 || bar == m_last_bar) return;
m_result = m_detector.DetectCurrentRegime();
m_last_bar = bar;
}
ENUM_REGIME_TYPE GetCurrentRegime() { return m_result.current_regime; }
string RegimeToString(ENUM_REGIME_TYPE regime) { return m_detector.RegimeToString(regime); }
bool IsTradingAllowed(string &reason)
{
reason = "";
if(m_result.current_regime == REGIME_UNDEFINED)
{
reason = "Market regime is not available";
return false;
}
return true;
}
double GetMinConfidenceThreshold()
{
return m_result.current_regime == REGIME_CHOPPY ? 0.75 : 0.60;
}
double AdjustPositionSize(double volume)
{
switch(m_result.current_regime)
{
case REGIME_UNDEFINED: return 0.0;
case REGIME_CHOPPY: return volume * 0.5;
case REGIME_VOLATILE_UP:
case REGIME_VOLATILE_DOWN:
case REGIME_RANGING_HIGH: return volume * 0.75;
}
return volume;
}
};
CRegimeAwareStrategy *g_regime_strategy = NULL;
#endif