| #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
|