forked from Princeec13/mql5
239 lines
8.7 KiB
MQL5
239 lines
8.7 KiB
MQL5
|
//+------------------------------------------------------------------+
|
||
|
//| 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();
|
||
|
}
|