121 lines
4.3 KiB
MQL5
121 lines
4.3 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| SecurityEnhancements.mqh |
| |||
//| Copyright 2025, EscapeEA |
| |||
//| https://www.escapeea.com |
| |||
//+------------------------------------------------------------------+
| |||
#property copyright "Copyright 2025, EscapeEA"
| |||
#property link "https://www.escapeea.com"
| |||
#property version "1.00"
| |||
#property strict
| |||
| |||
#include <Trade\Trade.mqh>
| |||
#include <Trade\PositionInfo.mqh>
| |||
#include <Trade\DealInfo.mqh>
| |||
| |||
// Forward declaration to avoid circular dependency
| |||
class CRiskManager;
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| CSecurityEnhancements class |
| |||
//+------------------------------------------------------------------+
| |||
class CSecurityEnhancements
| |||
{
| |||
private:
| |||
CRiskManager* m_riskManager; // Risk manager pointer
| |||
CTrade m_trade; // Trade object
| |||
CPositionInfo m_position; // Position info
| |||
CDealInfo m_deal; // Deal info
| |||
| |||
// Rate limiting
| |||
datetime m_lastTradeTime; // Last trade time
| |||
int m_tradeCount; // Trade counter
| |||
| |||
// Anomaly detection
| |||
double m_avgTradeTime; // Average trade time
| |||
int m_anomalyCount; // Anomaly counter
| |||
| |||
// Price validation
| |||
MqlTick m_lastTick; // Last tick data
| |||
int m_maxSlippage; // Maximum allowed slippage in points
| |||
| |||
// Error tracking
| |||
string m_lastError; // Last error message
| |||
| |||
// News filtering
| |||
bool m_newsFilterEnabled; // Whether news filtering is enabled
| |||
datetime m_newsStartTime; // News start time
| |||
datetime m_newsEndTime; // News end time
| |||
string m_affectedSymbols; // Comma-separated list of affected symbols
| |||
| |||
public:
| |||
// Constructor/Destructor
| |||
CSecurityEnhancements(void);
| |||
~CSecurityEnhancements(void);
| |||
| |||
// Initialization
| |||
bool Initialize(void);
| |||
void Deinitialize(void);
| |||
| |||
// Configuration
| |||
void SetNewsFilter(bool enabled, datetime startTime = 0, datetime endTime = 0, string affectedSymbols = "") {
| |||
m_newsFilterEnabled = enabled;
| |||
m_newsStartTime = startTime;
| |||
m_newsEndTime = endTime;
| |||
m_affectedSymbols = affectedSymbols;
| |||
}
| |||
| |||
// Trade validation
| |||
bool ValidateTradeRequest(MqlTradeRequest &request);
| |||
bool CheckPriceDeviation(const string symbol, const double price);
| |||
bool CheckRateLimit(void);
| |||
| |||
// Order execution with enhanced security
| |||
bool ExecuteTrade(MqlTradeRequest &request, MqlTradeResult &result);
| |||
bool VerifyOrderFill(const ulong ticket);
| |||
| |||
// Anomaly detection
| |||
bool DetectAnomalies(const MqlTradeRequest &request);
| |||
| |||
// Error handling
| |||
string GetLastError(void) const { return m_lastError; }
| |||
| |||
// Getters
| |||
double GetAvgTradeTime(void) const { return m_avgTradeTime; }
| |||
int GetAnomalyCount(void) const { return m_anomalyCount; }
| |||
| |||
// News checking
| |||
bool IsNewsEvent(const string symbol) {
| |||
// Check if news filtering is enabled
| |||
if(!m_newsFilterEnabled) {
| |||
return false;
| |||
}
| |||
| |||
// Get the current time
| |||
datetime currentTime = TimeCurrent();
| |||
| |||
// Check if we're in a news blackout period
| |||
if(currentTime >= m_newsStartTime && currentTime <= m_newsEndTime) {
| |||
// If no specific symbols are listed, all symbols are affected
| |||
if(StringLen(m_affectedSymbols) == 0) {
| |||
return true;
| |||
}
| |||
| |||
// Check if this symbol is in the affected symbols list
| |||
string symbols[];
| |||
int count = StringSplit(m_affectedSymbols, ',', symbols);
| |||
| |||
for(int i = 0; i < count; i++) {
| |||
string current = symbols[i];
| |||
StringTrimLeft(current);
| |||
StringTrimRight(current);
| |||
if(current == symbol) {
| |||
return true;
| |||
}
| |||
}
| |||
}
| |||
| |||
return false;
| |||
}
| |||
};
| |||
| |||
// Implementation is included in the main EA file
|