mql5/Include/Experts/EscapeEA_RiskIntegration.mqh

239 lines
8.7 KiB
MQL5
Raw Permalink Normal View History

2025-08-16 12:30:04 -04:00
//+------------------------------------------------------------------+
//| EscapeEA_RiskIntegration.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 "EscapeEARiskManager.mqh"
//+------------------------------------------------------------------+
//| Risk Integration for EscapeEA |
//+------------------------------------------------------------------+
class CEscapeEARiskIntegration
{
private:
static CEscapeEARiskIntegration* m_instance; // Singleton instance
CEscapeEARiskManager* m_riskManager; // Risk manager
// Risk parameters
double m_riskPerTrade; // Risk per trade (% of balance)
double m_maxDrawdownPct; // Maximum allowed drawdown (%)
double m_maxDailyLossPct; // Maximum daily loss (%)
// State
bool m_isInitialized; // Initialization flag
// Private constructor for singleton
CEscapeEARiskIntegration();
public:
// Destructor
~CEscapeEARiskIntegration();
// Singleton access
static CEscapeEARiskIntegration* Instance();
// Initialization
bool Initialize();
void Deinitialize();
void Update();
// Position management
bool CanOpenPosition(const string symbol, const ENUM_ORDER_TYPE type,
const double price, const double stopLoss,
const double takeProfit, double &suggestedSize);
bool ValidatePositionSize(const string symbol, const double size);
void UpdatePositionMetrics(const string symbol, const double size,
const double openPrice, const double currentPrice);
// Getters
bool IsInitialized() const { return m_isInitialized; }
double GetRiskPerTrade() const { return m_riskPerTrade; }
double GetMaxDrawdownPct() const { return m_maxDrawdownPct; }
double GetMaxDailyLossPct() const { return m_maxDailyLossPct; }
// Setters
void SetRiskPerTrade(const double risk) { m_riskPerTrade = risk; }
void SetMaxDrawdownPct(const double drawdown) { m_maxDrawdownPct = drawdown; }
void SetMaxDailyLossPct(const double loss) { m_maxDailyLossPct = loss; }
// Component access
CEscapeEARiskManager* GetRiskManager() { return m_riskManager; }
};
// Initialize static member
CEscapeEARiskIntegration* CEscapeEARiskIntegration::m_instance = NULL;
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CEscapeEARiskIntegration::CEscapeEARiskIntegration() :
m_riskManager(NULL),
m_riskPerTrade(1.0),
m_maxDrawdownPct(10.0),
m_maxDailyLossPct(5.0),
m_isInitialized(false)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CEscapeEARiskIntegration::~CEscapeEARiskIntegration()
{
Deinitialize();
}
//+------------------------------------------------------------------+
//| Get singleton instance |
//+------------------------------------------------------------------+
CEscapeEARiskIntegration* CEscapeEARiskIntegration::Instance()
{
if (m_instance == NULL)
m_instance = new CEscapeEARiskIntegration();
return m_instance;
}
//+------------------------------------------------------------------+
//| Initialize risk integration |
//+------------------------------------------------------------------+
bool CEscapeEARiskIntegration::Initialize()
{
if (m_isInitialized)
return true;
// Initialize risk manager
m_riskManager = CEscapeEARiskManager::Instance();
if (m_riskManager == NULL || !m_riskManager.Initialize())
{
Print("Failed to initialize risk manager");
return false;
}
// Configure risk parameters
if (m_riskManager.GetRiskParameters() != NULL)
{
m_riskManager.GetRiskParameters().SetRiskPerTrade(m_riskPerTrade);
m_riskManager.GetRiskParameters().SetMaxDrawdownPct(m_maxDrawdownPct);
m_riskManager.GetRiskParameters().SetMaxDailyLossPct(m_maxDailyLossPct);
}
m_isInitialized = true;
Print("EscapeEA Risk Integration initialized successfully");
return true;
}
//+------------------------------------------------------------------+
//| Deinitialize risk integration |
//+------------------------------------------------------------------+
void CEscapeEARiskIntegration::Deinitialize()
{
if (m_riskManager != NULL)
{
m_riskManager.Deinitialize();
m_riskManager = NULL;
}
if (m_instance != NULL)
{
delete m_instance;
m_instance = NULL;
}
m_isInitialized = false;
}
//+------------------------------------------------------------------+
//| Update risk integration state |
//+------------------------------------------------------------------+
void CEscapeEARiskIntegration::Update()
{
if (m_riskManager != NULL && m_isInitialized)
m_riskManager.Update();
}
//+------------------------------------------------------------------+
//| Check if a position can be opened with the given parameters |
//+------------------------------------------------------------------+
bool CEscapeEARiskIntegration::CanOpenPosition(const string symbol, const ENUM_ORDER_TYPE type,
const double price, const double stopLoss,
const double takeProfit, double &suggestedSize)
{
if (!m_isInitialized || m_riskManager == NULL)
return false;
return m_riskManager.CanOpenPosition(symbol, type, price, stopLoss, takeProfit, suggestedSize);
}
//+------------------------------------------------------------------+
//| Validate if position size is within allowed limits |
//+------------------------------------------------------------------+
bool CEscapeEARiskIntegration::ValidatePositionSize(const string symbol, const double size)
{
if (!m_isInitialized || m_riskManager == NULL)
return false;
return m_riskManager.ValidatePositionSize(symbol, size);
}
//+------------------------------------------------------------------+
//| Update position metrics |
//+------------------------------------------------------------------+
void CEscapeEARiskIntegration::UpdatePositionMetrics(const string symbol, const double size,
const double openPrice, const double currentPrice)
{
if (m_isInitialized && m_riskManager != NULL)
{
m_riskManager.UpdatePositionMetrics(symbol, size, openPrice, currentPrice);
}
}
//+------------------------------------------------------------------+
//| Global functions for easy access |
//+------------------------------------------------------------------+
// Initialize risk management
bool InitializeRiskManagement()
{
return CEscapeEARiskIntegration::Instance().Initialize();
}
// Update risk management
void UpdateRiskManagement()
{
CEscapeEARiskIntegration::Instance().Update();
}
// Check if position can be opened
bool CanOpenPosition(const string symbol, const ENUM_ORDER_TYPE type,
const double price, const double stopLoss,
const double takeProfit, double &suggestedSize)
{
return CEscapeEARiskIntegration::Instance().CanOpenPosition(symbol, type, price, stopLoss, takeProfit, suggestedSize);
}
// Validate position size
bool ValidatePositionSize(const string symbol, const double size)
{
return CEscapeEARiskIntegration::Instance().ValidatePositionSize(symbol, size);
}
// Update position metrics
void UpdatePositionMetrics(const string symbol, const double size,
const double openPrice, const double currentPrice)
{
CEscapeEARiskIntegration::Instance().UpdatePositionMetrics(symbol, size, openPrice, currentPrice);
}
// Get risk manager instance
CEscapeEARiskManager* GetRiskManager()
{
return CEscapeEARiskIntegration::Instance().GetRiskManager();
}