//+------------------------------------------------------------------+ //| CArchitectureConfig.mqh - Centralized Configuration Management | //| Replaces scattered input params with unified config system | //+------------------------------------------------------------------+ #ifndef CARCHITECTURE_CONFIG_MQH #define CARCHITECTURE_CONFIG_MQH //+------------------------------------------------------------------+ //| Configuration Validation Result | //+------------------------------------------------------------------+ struct SConfigValidationResult { bool is_valid; string errors[]; int error_count; void AddError(const string error) { int idx = ArraySize(errors); ArrayResize(errors, idx + 1); errors[idx] = error; error_count++; is_valid = false; } void Reset() { is_valid = true; error_count = 0; ArrayResize(errors, 0); } string GetSummary() { if(is_valid) return "Configuration valid"; string summary = StringFormat("Configuration invalid: %d errors\n", error_count); for(int i = 0; i < error_count; i++) summary += StringFormat(" [%d] %s\n", i+1, errors[i]); return summary; } }; //+------------------------------------------------------------------+ //| Subsystem Configuration Base | //+------------------------------------------------------------------+ class CSubsystemConfig : public CObject { protected: string m_name; bool m_enabled; SConfigValidationResult m_validation; public: CSubsystemConfig(const string name) : m_name(name), m_enabled(true) {} virtual void SetDefaults() = 0; virtual bool Validate() = 0; virtual string ToString() = 0; void Enable(bool enable) { m_enabled = enable; } bool IsEnabled() const { return m_enabled; } string GetName() const { return m_name; } SConfigValidationResult GetValidationResult() const { return m_validation; } string GetValidationSummary() { return m_validation.GetSummary(); } }; //+------------------------------------------------------------------+ //| Gate System Configuration | //+------------------------------------------------------------------+ class CGateSystemConfig : public CSubsystemConfig { public: // Per-gate budgets (microseconds) ulong gate_budgets_us[8]; ulong total_budget_us; // Gate enable flags bool gate_enabled[8]; bool risk_gates_protected; // Auto-tuning bool auto_tune_enabled; double learning_rate; int lookback_trades; CGateSystemConfig() : CSubsystemConfig("GateSystem") { SetDefaults(); } void SetDefaults() override { // Default: 2ms per gate, 15ms total for(int i = 0; i < 8; i++) gate_budgets_us[i] = 2000; total_budget_us = 15000; // All gates enabled by default for(int i = 0; i < 8; i++) gate_enabled[i] = true; risk_gates_protected = true; // G1, G4, G7, G8 never skipped auto_tune_enabled = true; learning_rate = 0.05; lookback_trades = 20; } bool Validate() override { m_validation.Reset(); for(int i = 0; i < 8; i++) { if(gate_budgets_us[i] < 500) // Minimum 0.5ms m_validation.AddError(StringFormat("Gate %d budget too small: %d us", i+1, gate_budgets_us[i])); } if(total_budget_us < 5000) m_validation.AddError("Total budget too small (min 5ms)"); if(learning_rate < 0.001 || learning_rate > 0.5) m_validation.AddError("Learning rate out of range [0.001, 0.5]"); return m_validation.is_valid; } string ToString() override { string result = StringFormat("[%s] Enabled=%s\n", m_name, m_enabled ? "Yes" : "No"); result += StringFormat(" Total Budget: %d us\n", total_budget_us); result += StringFormat(" Auto-tune: %s (lr=%.3f, lookback=%d)\n", auto_tune_enabled ? "Yes" : "No", learning_rate, lookback_trades); return result; } }; //+------------------------------------------------------------------+ //| Risk Engine Configuration | //+------------------------------------------------------------------+ class CRiskEngineConfig : public CSubsystemConfig { public: double max_drawdown_pct; double max_daily_loss_pct; int max_consecutive_losses; double var_confidence; // e.g., 0.95 for 95% VaR double kelly_fraction; // e.g., 0.25 for Quarter Kelly double max_correlation; double max_portfolio_risk_pct; CRiskEngineConfig() : CSubsystemConfig("RiskEngine") { SetDefaults(); } void SetDefaults() override { max_drawdown_pct = 10.0; max_daily_loss_pct = 5.0; max_consecutive_losses = 5; var_confidence = 0.95; kelly_fraction = 0.25; max_correlation = 0.70; max_portfolio_risk_pct = 15.0; } bool Validate() override { m_validation.Reset(); if(max_drawdown_pct <= 0 || max_drawdown_pct > 50) m_validation.AddError("Max drawdown must be in (0, 50]"); if(kelly_fraction <= 0 || kelly_fraction > 1.0) m_validation.AddError("Kelly fraction must be in (0, 1.0]"); if(var_confidence < 0.8 || var_confidence > 0.999) m_validation.AddError("VaR confidence must be in [0.8, 0.999]"); if(max_correlation < 0 || max_correlation > 1.0) m_validation.AddError("Max correlation must be in [0, 1.0]"); return m_validation.is_valid; } string ToString() override { return StringFormat( "[%s] Enabled=%s, MaxDD=%.1f%%, Kelly=%.2f, VaR=%.1f%%, MaxCorr=%.2f", m_name, m_enabled ? "Yes" : "No", max_drawdown_pct, kelly_fraction, var_confidence * 100, max_correlation); } }; //+------------------------------------------------------------------+ //| Unified Configuration Manager | //+------------------------------------------------------------------+ class CArchitectureConfig { private: CSubsystemConfig* m_configs[]; int m_config_count; string m_config_file_path; public: CGateSystemConfig GateSystem; CRiskEngineConfig RiskEngine; // Add more configs here as needed CArchitectureConfig() { m_config_count = 0; m_config_file_path = "DualEA/architecture_config.json"; // Register all configs RegisterConfig(&GateSystem); RegisterConfig(&RiskEngine); } ~CArchitectureConfig() { // Note: We don't delete configs because they're member variables } void SetAllDefaults() { for(int i = 0; i < m_config_count; i++) m_configs[i].SetDefaults(); } bool ValidateAll() { bool all_valid = true; for(int i = 0; i < m_config_count; i++) { if(!m_configs[i].Validate()) all_valid = false; } return all_valid; } string GetValidationReport() { string report = "=== Configuration Validation Report ===\n"; for(int i = 0; i < m_config_count; i++) { report += m_configs[i].ToString() + "\n"; if(!m_configs[i].GetValidationResult().is_valid) report += " ERRORS: " + m_configs[i].GetValidationSummary() + "\n"; } return report; } string GetSummary() { string summary = "=== Architecture Configuration ===\n"; for(int i = 0; i < m_config_count; i++) summary += m_configs[i].ToString() + "\n"; return summary; } private: void RegisterConfig(CSubsystemConfig* config) { int idx = m_config_count; ArrayResize(m_configs, idx + 1); m_configs[idx] = config; m_config_count++; } }; // Global configuration instance CArchitectureConfig* g_architecture_config = NULL; //+------------------------------------------------------------------+ //| Initialize configuration system | //+------------------------------------------------------------------+ bool InitializeArchitectureConfig() { if(g_architecture_config != NULL) delete g_architecture_config; g_architecture_config = new CArchitectureConfig(); g_architecture_config.SetAllDefaults(); if(!g_architecture_config.ValidateAll()) { Print(g_architecture_config.GetValidationReport()); return false; } Print(g_architecture_config.GetSummary()); return true; } //+------------------------------------------------------------------+ //| Shutdown configuration system | //+------------------------------------------------------------------+ void ShutdownArchitectureConfig() { if(g_architecture_config != NULL) { delete g_architecture_config; g_architecture_config = NULL; } } #endif // CARCHITECTURE_CONFIG_MQH