5.6 KiB
5.6 KiB
Unified System Guide
Overview
The DualEA system features a Unified Architecture that eliminates redundancy by consolidating insights management and gating pipeline into three core components: ConfigManager, EventBus, and SystemMonitor.
Core Components
1. ConfigManager (ConfigManager.mqh)
Singleton configuration manager providing centralized configuration for gates, insights, and system settings.
// Access the singleton instance
CConfigManager* config = CConfigManager::GetInstance();
// Configure gate parameters
config->SetGateThreshold("SignalRinse", 0.65);
config->SetGateEnabled("MarketSoap", true);
// Configure insights
config->SetInsightsAutoReload(true);
config->SetInsightsFreshnessMinutes(60);
// System settings
config->SetVerboseLogging(true);
config->SetNoConstraintsMode(false);
Key Features:
- Per-gate configuration (8 gates with individual thresholds)
- Insights auto-reload settings
- System-wide flags (NoConstraintsMode, verbose logging)
- Thread-safe singleton pattern
2. EventBus (EventBus.mqh)
Cross-component communication with priority-based event logging.
// Log events with priority
EventBus.Info("strategy_signal", "ADXStrategy generated buy signal");
EventBus.Warning("gate_blocked", "RiskWash blocked entry: spread too high");
EventBus.Error("policy_load", "Failed to parse policy.json");
// Query recent events
string recentErrors[];
int count = EventBus.GetRecentErrors(recentErrors, 10);
Event Priorities:
LOG_ERROR(0): Critical failures requiring immediate attentionLOG_WARNING(1): Anomalies and gating blocksLOG_INFO(2): Normal operations and signalsLOG_DEBUG(3): Detailed diagnostics (verbose mode only)
3. SystemMonitor (SystemMonitor.mqh)
Real-time health monitoring and performance metrics.
// Record gate processing time
SystemMonitor.RecordGateTime("SignalRinse", elapsedMicroseconds);
// Update health score
SystemMonitor.UpdateHealthScore(gateSuccessRate);
// Get status report
string report = SystemMonitor.GetStatusReport();
Metrics Tracked:
- Gate success rates per slice
- Average processing times
- Memory usage
- Health score (0.0 - 1.0)
- System alerts
Integration Architecture
Unified Gate System
// Initialize unified system (enabled by default)
CGateManager* gateManager = new CGateManager(symbol, timeframe, learning, true);
// The unified system automatically:
// 1. Loads configuration from ConfigManager
// 2. Logs all events via EventBus
// 3. Reports metrics to SystemMonitor
Backward Compatibility
Legacy code continues to work with unified components:
// Old approach (still works)
CGateManager* gateManager = new CGateManager();
gateManager.Initialize(config);
// New unified approach (recommended)
CConfigManager* config = CConfigManager::GetInstance();
CEfficientGateManagerEnhanced* gateManager = new CEfficientGateManagerEnhanced();
gateManager.InitializeUnified();
Configuration Parameters
Gate Configuration
// News filtering
UseNewsFilter, NewsBufferBeforeMin, NewsBufferAfterMin, NewsImpactMin
// Trading windows
UsePromotionGate, PromoStartHour, PromoEndHour
// Market regime detection
UseRegimeGate, RegimeATRPeriod, RegimeMinATRPct, RegimeMaxATRPct
// Circuit breakers and insights
CircuitCooldownSec, NoConstraintsMode
InsightsAutoReload, InsightsLiveFreshMinutes, InsightsStaleHours
Execution Pipeline
- Early Phase: Market condition validation and news filtering
- 8-Stage Gate Processing: Signal refinement through unified gate system
- Risk Management: Position sizing and portfolio risk assessment
- Execution: Trade placement with full audit trail and telemetry
Key Benefits
- Single Source of Truth: All configuration in one place
- Event-Driven Architecture: Unified logging with severity levels
- Real-Time Monitoring: Health scoring and performance metrics
- Backward Compatibility: Legacy mode support
- Cross-EA Consistency: Identical behavior in PaperEA and LiveEA
Migration Guide
From Legacy GateManager
Before:
#include "Include/GateManager.mqh"
CGateManager* gateManager = new CGateManager();
gateManager.SetThreshold(0.6);
After:
#include "Include/ConfigManager.mqh"
#include "Include/EventBus.mqh"
CConfigManager* config = CConfigManager::GetInstance();
config->SetGateThreshold("SignalRinse", 0.6);
EventBus.Info("init", "Gate system initialized");
From Manual Logging
Before:
if(verbose) Print("[DEBUG] Signal generated: ", signal);
After:
EventBus.Debug("signal_gen", "Signal generated", signal);
Best Practices
- Always use ConfigManager for configuration changes
- Log all significant events via EventBus for observability
- Monitor health scores to detect system degradation
- Use appropriate log levels (Error for failures, Warning for blocks)
- Enable verbose logging only for debugging sessions
Troubleshooting
Events not appearing in logs
- Check
Verbositysetting (must be >= event priority) - Verify EventBus is initialized in
OnInit()
Config changes not taking effect
- Ensure
CConfigManager::GetInstance()is used - Check for conflicting direct gate configuration
High memory usage
- SystemMonitor caches recent events (configurable limit)
- Reduce
TelemetryBufferMaxin inputs
Related Documentation
- README.md - Main system documentation
- ConfigManager.mqh - Implementation
- EventBus.mqh - Event system
- SystemMonitor.mqh - Monitoring