forked from Princeec13/mql5
290 lines
11 KiB
MQL5
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
|
|
}
|