290 строки
11 КиБ
MQL5
290 строки
11 КиБ
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
| |||
}
|