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
|