| //+------------------------------------------------------------------+
|
| //| RiskManager.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
|
|
|
| #include "RiskParameters.mqh"
|
| #include "RiskMetrics.mqh"
|
| #include "PositionSizer.mqh"
|
| #include "DrawdownManager.mqh"
|
| #include "CorrelationMatrix.mqh"
|
|
|
| //+------------------------------------------------------------------+
|
| //| Risk Manager Class |
|
| //+------------------------------------------------------------------+
|
| class CRiskManager
|
| {
|
| private:
|
| // Components
|
| CRiskParameters* m_params; // Risk parameters
|
| CRiskMetrics* m_metrics; // Risk metrics calculator
|
| CPositionSizer* m_sizer; // Position sizer
|
| CDrawdownManager* m_drawdownMgr; // Drawdown manager
|
| CCorrelationMatrix*m_corrMatrix; // Correlation matrix
|
|
|
| // State
|
| bool m_isInitialized; // Initialization flag
|
| double m_accountEquity; // Current account equity
|
| double m_maxRiskPerTrade; // Max risk per trade (% of equity)
|
| double m_maxDailyLoss; // Max daily loss (% of equity)
|
|
|
| // Private methods
|
| bool CalculatePositionSize(const string symbol, const double stopLossPips, double &size);
|
| bool CheckCorrelation(const string symbol1, const string symbol2, double &correlation);
|
|
|
| public:
|
| // Constructor/Destructor
|
| CRiskManager();
|
| ~CRiskManager();
|
|
|
| // Initialization
|
| bool Initialize(const string symbol = NULL, const ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT);
|
| void Deinitialize();
|
|
|
| // Risk Assessment
|
| bool IsTradeAllowed(const string symbol, const ENUM_ORDER_TYPE type,
|
| const double price, const double stopLoss, const double takeProfit);
|
| double GetMaxPositionSize(const string symbol, const double stopLossPips);
|
|
|
| // State Management
|
| void UpdateAccountInfo();
|
| void UpdateMarketConditions();
|
|
|
| // Getters
|
| bool IsInitialized() const { return m_isInitialized; }
|
| double GetAccountEquity() const { return m_accountEquity; }
|
| double GetMaxRiskPerTrade() const { return m_maxRiskPerTrade; }
|
|
|
| // Configuration
|
| bool SetRiskParameters(const double riskPerTrade, const double dailyLossLimit);
|
| };
|
|
|
| //+------------------------------------------------------------------+
|
| //| Constructor |
|
| //+------------------------------------------------------------------+
|
| CRiskManager::CRiskManager() :
|
| m_params(NULL),
|
| m_metrics(NULL),
|
| m_sizer(NULL),
|
| m_drawdownMgr(NULL),
|
| m_corrMatrix(NULL),
|
| m_isInitialized(false),
|
| m_accountEquity(0.0),
|
| m_maxRiskPerTrade(1.0), // Default 1% risk per trade
|
| m_maxDailyLoss(5.0) // Default 5% max daily loss
|
| {
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Destructor |
|
| //+------------------------------------------------------------------+
|
| CRiskManager::~CRiskManager()
|
| {
|
| Deinitialize();
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Initialize risk manager |
|
| //+------------------------------------------------------------------+
|
| bool CRiskManager::Initialize(const string symbol = NULL, const ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT)
|
| {
|
| if (m_isInitialized)
|
| return true;
|
|
|
| // Initialize components
|
| m_params = new CRiskParameters();
|
| m_metrics = new CRiskMetrics();
|
| m_sizer = new CPositionSizer();
|
| m_drawdownMgr = new CDrawdownManager();
|
| m_corrMatrix = new CCorrelationMatrix();
|
|
|
| // Initialize components
|
| if (!m_params.Initialize() ||
|
| !m_metrics.Initialize(symbol, timeframe) ||
|
| !m_sizer.Initialize() ||
|
| !m_drawdownMgr.Initialize() ||
|
| !m_corrMatrix.Initialize())
|
| {
|
| Print("Failed to initialize risk manager components");
|
| return false;
|
| }
|
|
|
| // Update account info
|
| UpdateAccountInfo();
|
|
|
| m_isInitialized = true;
|
| Print("Risk Manager initialized successfully");
|
| return true;
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Deinitialize risk manager |
|
| //+------------------------------------------------------------------+
|
| void CRiskManager::Deinitialize()
|
| {
|
| // Clean up components
|
| if (m_params != NULL)
|
| {
|
| delete m_params;
|
| m_params = NULL;
|
| }
|
|
|
| if (m_metrics != NULL)
|
| {
|
| m_metrics.Deinitialize();
|
| delete m_metrics;
|
| m_metrics = NULL;
|
| }
|
|
|
| if (m_sizer != NULL)
|
| {
|
| m_sizer.Deinitialize();
|
| delete m_sizer;
|
| m_sizer = NULL;
|
| }
|
|
|
| if (m_drawdownMgr != NULL)
|
| {
|
| m_drawdownMgr.Deinitialize();
|
| delete m_drawdownMgr;
|
| m_drawdownMgr = NULL;
|
| }
|
|
|
| if (m_corrMatrix != NULL)
|
| {
|
| m_corrMatrix.Deinitialize();
|
| delete m_corrMatrix;
|
| m_corrMatrix = NULL;
|
| }
|
|
|
| m_isInitialized = false;
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Check if trade is allowed based on risk parameters |
|
| //+------------------------------------------------------------------+
|
| bool CRiskManager::IsTradeAllowed(const string symbol, const ENUM_ORDER_TYPE type,
|
| const double price, const double stopLoss, const double takeProfit)
|
| {
|
| if (!m_isInitialized)
|
| return false;
|
|
|
| // Check daily loss limit
|
| if (m_drawdownMgr.GetDailyDrawdownPercent() >= m_maxDailyLoss)
|
| {
|
| Print("Trade rejected: Daily loss limit reached");
|
| return false;
|
| }
|
|
|
| // Check maximum position size
|
| double maxSize = GetMaxPositionSize(symbol, stopLoss);
|
| if (maxSize <= 0.0)
|
| {
|
| Print("Trade rejected: Invalid position size");
|
| return false;
|
| }
|
|
|
| // Check correlation with existing positions
|
| if (!m_corrMatrix.ValidateNewPosition(symbol, type, price, stopLoss, maxSize))
|
| {
|
| Print("Trade rejected: Correlation check failed");
|
| return false;
|
| }
|
|
|
| // Additional risk checks can be added here
|
|
|
| return true;
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Calculate maximum position size based on risk parameters |
|
| //+------------------------------------------------------------------+
|
| double CRiskManager::GetMaxPositionSize(const string symbol, const double stopLossPips)
|
| {
|
| if (!m_isInitialized || stopLossPips <= 0.0)
|
| return 0.0;
|
|
|
| double size = 0.0;
|
| if (!m_sizer.CalculateSize(symbol, stopLossPips, m_maxRiskPerTrade, m_accountEquity, size))
|
| return 0.0;
|
|
|
| return size;
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Update account information |
|
| //+------------------------------------------------------------------+
|
| void CRiskManager::UpdateAccountInfo()
|
| {
|
| m_accountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
|
|
|
| // Update drawdown manager
|
| if (m_drawdownMgr != NULL)
|
| m_drawdownMgr.UpdateEquity(m_accountEquity);
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Update market conditions |
|
| //+------------------------------------------------------------------+
|
| void CRiskManager::UpdateMarketConditions()
|
| {
|
| if (!m_isInitialized)
|
| return;
|
|
|
| // Update volatility metrics
|
| m_metrics.UpdateVolatility();
|
|
|
| // Update correlation matrix
|
| m_corrMatrix.Update();
|
|
|
| // Update position sizer with latest market conditions
|
| double volatility = m_metrics.GetCurrentVolatility();
|
| m_sizer.UpdateVolatility(volatility);
|
| }
|
|
|
| //+------------------------------------------------------------------+
|
| //| Set risk parameters |
|
| //+------------------------------------------------------------------+
|
| bool CRiskManager::SetRiskParameters(const double riskPerTrade, const double dailyLossLimit)
|
| {
|
| if (riskPerTrade <= 0.0 || riskPerTrade > 10.0) // Max 10% risk per trade
|
| return false;
|
|
|
| if (dailyLossLimit <= 0.0 || dailyLossLimit > 50.0) // Max 50% daily loss
|
| return false;
|
|
|
| m_maxRiskPerTrade = riskPerTrade;
|
| m_maxDailyLoss = dailyLossLimit;
|
|
|
| return true;
|
| }
|