mql5/Include/Experts/Risk/RiskParameters.mqh
2025-08-16 12:30:04 -04:00

290 lines
11 KiB
MQL5

//+------------------------------------------------------------------+
//| 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
}