//+------------------------------------------------------------------+ //| RiskParameters.mqh | //| Copyright 2025, Your Company Name | //| https://www.yoursite.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Your Company Name" #property link "https://www.yoursite.com" #property version "1.00" #property strict //+------------------------------------------------------------------+ //| Risk Parameters Class | //+------------------------------------------------------------------+ class CRiskParameters { private: // Risk parameters double m_riskPerTrade; // Risk per trade (% of equity) double m_dailyLossLimit; // Max daily loss (% of equity) double m_maxPositionSize; // Max position size (lots) double m_maxLeverage; // Maximum allowed leverage bool m_useVolatility; // Use volatility for position sizing bool m_useCorrelation; // Use correlation for risk calculation // Volatility parameters double m_volatilityFactor; // Volatility adjustment factor int m_volatilityPeriod; // Period for volatility calculation // Correlation parameters double m_maxCorrelation; // Maximum allowed correlation int m_correlationPeriod; // Period for correlation calculation // Position sizing parameters double m_minPositionSize; // Minimum position size (lots) double m_maxLotsPerTrade; // Maximum lots per trade // Internal state bool m_isInitialized; // Initialization flag public: // Constructor/Destructor CRiskParameters(); ~CRiskParameters() {} // Initialization bool Initialize(); // Getters double GetRiskPerTrade() const { return m_riskPerTrade; } double GetDailyLossLimit() const { return m_dailyLossLimit; } double GetMaxPositionSize() const { return m_maxPositionSize; } double GetMaxLeverage() const { return m_maxLeverage; } bool UseVolatility() const { return m_useVolatility; } bool UseCorrelation() const { return m_useCorrelation; } double GetVolatilityFactor() const { return m_volatilityFactor; } int GetVolatilityPeriod() const { return m_volatilityPeriod; } double GetMaxCorrelation() const { return m_maxCorrelation; } int GetCorrelationPeriod() const { return m_correlationPeriod; } double GetMinPositionSize() const { return m_minPositionSize; } double GetMaxLotsPerTrade() const { return m_maxLotsPerTrade; } // Setters with validation bool SetRiskPerTrade(const double risk); bool SetDailyLossLimit(const double limit); bool SetMaxPositionSize(const double size); bool SetMaxLeverage(const double leverage); void SetUseVolatility(const bool use) { m_useVolatility = use; } void SetUseCorrelation(const bool use) { m_useCorrelation = use; } bool SetVolatilityFactor(const double factor); bool SetVolatilityPeriod(const int period); bool SetMaxCorrelation(const double correlation); bool SetCorrelationPeriod(const int period); bool SetMinPositionSize(const double size); bool SetMaxLotsPerTrade(const double lots); // Validation static bool IsValidRisk(const double risk); static bool IsValidLeverage(const double leverage); static bool IsValidPositionSize(const double size); static bool IsValidCorrelation(const double correlation); private: // Internal methods void SetDefaults(); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CRiskParameters::CRiskParameters() : m_riskPerTrade(1.0), // 1% risk per trade by default m_dailyLossLimit(5.0), // 5% max daily loss by default m_maxPositionSize(100.0), // 100 lots max position size by default m_maxLeverage(100.0), // 1:100 leverage by default m_useVolatility(true), // Use volatility by default m_useCorrelation(true), // Use correlation by default m_volatilityFactor(1.0), // No additional factor by default m_volatilityPeriod(20), // 20-period lookback for volatility m_maxCorrelation(0.7), // 70% max correlation m_correlationPeriod(100), // 100-period lookback for correlation m_minPositionSize(0.01), // 0.01 lots minimum m_maxLotsPerTrade(50.0), // 50 lots maximum per trade m_isInitialized(false) { } //+------------------------------------------------------------------+ //| Initialize with default values | //+------------------------------------------------------------------+ bool CRiskParameters::Initialize() { SetDefaults(); return true; } //+------------------------------------------------------------------+ //| Set default parameters | //+------------------------------------------------------------------+ void CRiskParameters::SetDefaults() { // Load default values from account settings or config file m_riskPerTrade = 1.0; m_dailyLossLimit = 5.0; m_maxPositionSize = 100.0; m_maxLeverage = AccountInfoInteger(ACCOUNT_LEVERAGE); // Advanced settings m_useVolatility = true; m_useCorrelation = true; m_volatilityFactor = 1.0; m_volatilityPeriod = 20; m_maxCorrelation = 0.7; m_correlationPeriod = 100; m_minPositionSize = 0.01; m_maxLotsPerTrade = 50.0; m_isInitialized = true; } //+------------------------------------------------------------------+ //| Set risk per trade with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetRiskPerTrade(const double risk) { if (!IsValidRisk(risk)) return false; m_riskPerTrade = risk; return true; } //+------------------------------------------------------------------+ //| Set daily loss limit with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetDailyLossLimit(const double limit) { if (limit <= 0.0 || limit > 50.0) // Max 50% daily loss return false; m_dailyLossLimit = limit; return true; } //+------------------------------------------------------------------+ //| Set max position size with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetMaxPositionSize(const double size) { if (!IsValidPositionSize(size)) return false; m_maxPositionSize = size; return true; } //+------------------------------------------------------------------+ //| Set max leverage with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetMaxLeverage(const double leverage) { if (!IsValidLeverage(leverage)) return false; m_maxLeverage = leverage; return true; } //+------------------------------------------------------------------+ //| Set volatility factor with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetVolatilityFactor(const double factor) { if (factor <= 0.0 || factor > 10.0) // Arbitrary upper limit return false; m_volatilityFactor = factor; return true; } //+------------------------------------------------------------------+ //| Set volatility period with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetVolatilityPeriod(const int period) { if (period < 5 || period > 200) // Reasonable range for volatility calculation return false; m_volatilityPeriod = period; return true; } //+------------------------------------------------------------------+ //| Set max correlation with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetMaxCorrelation(const double correlation) { if (!IsValidCorrelation(correlation)) return false; m_maxCorrelation = correlation; return true; } //+------------------------------------------------------------------+ //| Set correlation period with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetCorrelationPeriod(const int period) { if (period < 10 || period > 500) // Reasonable range for correlation calculation return false; m_correlationPeriod = period; return true; } //+------------------------------------------------------------------+ //| Set min position size with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetMinPositionSize(const double size) { if (size <= 0.0 || size > m_maxLotsPerTrade) return false; m_minPositionSize = size; return true; } //+------------------------------------------------------------------+ //| Set max lots per trade with validation | //+------------------------------------------------------------------+ bool CRiskParameters::SetMaxLotsPerTrade(const double lots) { if (lots < m_minPositionSize || lots > 1000.0) // Arbitrary upper limit return false; m_maxLotsPerTrade = lots; return true; } //+------------------------------------------------------------------+ //| Validate risk percentage | //+------------------------------------------------------------------+ bool CRiskParameters::IsValidRisk(const double risk) { return (risk > 0.0 && risk <= 10.0); // Max 10% risk per trade } //+------------------------------------------------------------------+ //| Validate leverage | //+------------------------------------------------------------------+ bool CRiskParameters::IsValidLeverage(const double leverage) { return (leverage > 0.0 && leverage <= 1000.0); // Reasonable leverage range } //+------------------------------------------------------------------+ //| Validate position size | //+------------------------------------------------------------------+ bool CRiskParameters::IsValidPositionSize(const double size) { return (size > 0.0 && size <= 1000.0); // Reasonable position size range } //+------------------------------------------------------------------+ //| Validate correlation value | //+------------------------------------------------------------------+ bool CRiskParameters::IsValidCorrelation(const double correlation) { return (correlation >= 0.0 && correlation <= 1.0); // 0.0 to 1.0 range }