211 lines
7.6 KiB
MQL5
211 lines
7.6 KiB
MQL5
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| MarketAnalyzer.mqh |
|
||
|
|
//| Copyright 2025, EscapeEA Team |
|
||
|
|
//| https://www.escapeea.com |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
#property copyright "Copyright 2025, EscapeEA Team"
|
||
|
|
#property link "https://www.escapeea.com"
|
||
|
|
#property version "1.00"
|
||
|
|
#property strict
|
||
|
|
|
||
|
|
#include <Escape/NewsFeedHandler.mqh>
|
||
|
|
#include <Escape/VolatilityManager.mqh>
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| News Impact Score Enumeration |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
enum ENUM_NEWS_IMPACT
|
||
|
|
{
|
||
|
|
IMPACT_NONE = 0, // No Impact
|
||
|
|
IMPACT_LOW = 1, // Low Impact
|
||
|
|
IMPACT_MEDIUM = 2, // Medium Impact
|
||
|
|
IMPACT_HIGH = 3, // High Impact
|
||
|
|
IMPACT_EXTREME = 4 // Extreme Impact
|
||
|
|
};
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| News Impact Analysis Class |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
class CMarketAnalyzer
|
||
|
|
{
|
||
|
|
private:
|
||
|
|
CNewsFeedHandler *m_newsHandler; // News feed handler
|
||
|
|
CVolatilityManager *m_volManager; // Volatility manager
|
||
|
|
|
||
|
|
// Configuration
|
||
|
|
int m_lookbackPeriod; // Period for historical analysis
|
||
|
|
double m_impactThreshold; // Threshold for significant impact
|
||
|
|
bool m_enableNewsFilter; // Enable/disable news filtering
|
||
|
|
|
||
|
|
// State
|
||
|
|
datetime m_lastUpdate; // Last update time
|
||
|
|
|
||
|
|
public:
|
||
|
|
//--- Constructor/Destructor
|
||
|
|
CMarketAnalyzer(void);
|
||
|
|
~CMarketAnalyzer(void);
|
||
|
|
|
||
|
|
//--- Initialization
|
||
|
|
bool Initialize(void);
|
||
|
|
void Shutdown(void);
|
||
|
|
|
||
|
|
//--- News Impact Analysis
|
||
|
|
ENUM_NEWS_IMPACT GetNewsImpact(const string symbol, const datetime time);
|
||
|
|
bool IsNewsImpactHigh(const string symbol, const datetime time);
|
||
|
|
|
||
|
|
//--- Configuration
|
||
|
|
void SetLookbackPeriod(const int period) { m_lookbackPeriod = period; }
|
||
|
|
void SetImpactThreshold(const double threshold) { m_impactThreshold = threshold; }
|
||
|
|
void EnableNewsFilter(const bool enable) { m_enableNewsFilter = enable; }
|
||
|
|
|
||
|
|
private:
|
||
|
|
//--- Helper Methods
|
||
|
|
double CalculateImpactScore(const MqlCalendarEvent &event);
|
||
|
|
bool IsWithinTradingHours(const datetime time);
|
||
|
|
|
||
|
|
//--- Volatility Analysis
|
||
|
|
double GetVolatilityAdjustment(const string symbol, const datetime time);
|
||
|
|
};
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Constructor |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
CMarketAnalyzer::CMarketAnalyzer(void) :
|
||
|
|
m_lookbackPeriod(14),
|
||
|
|
m_impactThreshold(0.7),
|
||
|
|
m_enableNewsFilter(true),
|
||
|
|
m_lastUpdate(0)
|
||
|
|
{
|
||
|
|
m_newsHandler = new CNewsFeedHandler();
|
||
|
|
m_volManager = new CVolatilityManager();
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Destructor |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
CMarketAnalyzer::~CMarketAnalyzer(void)
|
||
|
|
{
|
||
|
|
Shutdown();
|
||
|
|
delete m_newsHandler;
|
||
|
|
delete m_volManager;
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Initialize the analyzer |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
bool CMarketAnalyzer::Initialize(void)
|
||
|
|
{
|
||
|
|
if(!m_newsHandler.Initialize())
|
||
|
|
{
|
||
|
|
Print("Failed to initialize news feed handler");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
if(!m_volManager.Initialize())
|
||
|
|
{
|
||
|
|
Print("Failed to initialize volatility manager");
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Shutdown the analyzer |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
void CMarketAnalyzer::Shutdown(void)
|
||
|
|
{
|
||
|
|
m_newsHandler.Shutdown();
|
||
|
|
m_volManager.Shutdown();
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Get news impact for a specific symbol and time |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
ENUM_NEWS_IMPACT CMarketAnalyzer::GetNewsImpact(const string symbol, const datetime time)
|
||
|
|
{
|
||
|
|
if(!m_enableNewsFilter)
|
||
|
|
return IMPACT_NONE;
|
||
|
|
|
||
|
|
// Check if we have news data for this time
|
||
|
|
MqlCalendarEvent event;
|
||
|
|
if(!m_newsHandler.GetNextEvent(time, event))
|
||
|
|
return IMPACT_NONE;
|
||
|
|
|
||
|
|
// Calculate impact score
|
||
|
|
double score = CalculateImpactScore(event);
|
||
|
|
|
||
|
|
// Adjust for current market volatility
|
||
|
|
double volAdjustment = GetVolatilityAdjustment(symbol, time);
|
||
|
|
score *= volAdjustment;
|
||
|
|
|
||
|
|
// Map score to impact level
|
||
|
|
if(score >= 0.8) return IMPACT_EXTREME;
|
||
|
|
if(score >= 0.6) return IMPACT_HIGH;
|
||
|
|
if(score >= 0.4) return IMPACT_MEDIUM;
|
||
|
|
if(score >= 0.2) return IMPACT_LOW;
|
||
|
|
|
||
|
|
return IMPACT_NONE;
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Check if news impact is high |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
bool CMarketAnalyzer::IsNewsImpactHigh(const string symbol, const datetime time)
|
||
|
|
{
|
||
|
|
return GetNewsImpact(symbol, time) >= IMPACT_HIGH;
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Calculate impact score for a news event |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
double CMarketAnalyzer::CalculateImpactScore(const MqlCalendarEvent &event)
|
||
|
|
{
|
||
|
|
// Base score from event importance
|
||
|
|
double score = event.importance / 100.0;
|
||
|
|
|
||
|
|
// Adjust for event type (e.g., NFP, FOMC, etc.)
|
||
|
|
switch(event.event_type)
|
||
|
|
{
|
||
|
|
case CALENDAR_EVENT_NFP: score *= 1.2; break;
|
||
|
|
case CALENDAR_EVENT_FOMC: score *= 1.5; break;
|
||
|
|
case CALENDAR_EVENT_CPI: score *= 1.3; break;
|
||
|
|
case CALENDAR_EVENT_RATE: score *= 1.4; break;
|
||
|
|
// Add more event types as needed
|
||
|
|
default: score *= 0.8; break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return MathMin(1.0, MathMax(0.0, score));
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Check if time is within trading hours |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
bool CMarketAnalyzer::IsWithinTradingHours(const datetime time)
|
||
|
|
{
|
||
|
|
MqlDateTime dt;
|
||
|
|
TimeToStruct(time, dt);
|
||
|
|
|
||
|
|
// Example: Trade only between 8 AM and 4 PM
|
||
|
|
return (dt.hour >= 8 && dt.hour < 16);
|
||
|
|
}
|
||
|
|
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| Get volatility adjustment factor |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
double CMarketAnalyzer::GetVolatilityAdjustment(const string symbol, const datetime time)
|
||
|
|
{
|
||
|
|
double currentVol = m_volManager.GetCurrentVolatility(symbol, PERIOD_CURRENT, 14);
|
||
|
|
double avgVol = m_volManager.GetAverageVolatility(symbol, PERIOD_CURRENT, 14, 100);
|
||
|
|
|
||
|
|
// If current volatility is more than 2x average, reduce impact
|
||
|
|
if(currentVol > 2 * avgVol)
|
||
|
|
return 0.5;
|
||
|
|
|
||
|
|
// If current volatility is less than half of average, increase impact
|
||
|
|
if(currentVol < 0.5 * avgVol)
|
||
|
|
return 1.5;
|
||
|
|
|
||
|
|
return 1.0;
|
||
|
|
}
|
||
|
|
//+------------------------------------------------------------------+
|