2025-09-20 02:27:35 -04:00
|
|
|
//+------------------------------------------------------------------+
|
2026-02-04 14:28:59 -05:00
|
|
|
//| TelemetryStandard.mqh - Efficient Telemetry for DualEA |
|
2025-09-20 02:27:35 -04:00
|
|
|
//+------------------------------------------------------------------+
|
2026-02-04 14:28:59 -05:00
|
|
|
#ifndef __DUALEA_TELEMETRYSTANDARD_MQH__
|
|
|
|
|
#define __DUALEA_TELEMETRYSTANDARD_MQH__
|
|
|
|
|
|
2025-09-20 02:27:35 -04:00
|
|
|
#property copyright "DualEA"
|
|
|
|
|
#property version "1.00"
|
|
|
|
|
|
2026-02-04 14:28:59 -05:00
|
|
|
// Use the full CTelemetry implementation
|
2025-09-20 02:27:35 -04:00
|
|
|
#include "Telemetry.mqh"
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| Standardized telemetry event types and schemas |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
// Event type prefixes for consistent categorization
|
|
|
|
|
#define TEL_GATE_PREFIX "gate:"
|
|
|
|
|
#define TEL_EXEC_PREFIX "exec:"
|
|
|
|
|
#define TEL_CB_PREFIX "cb:"
|
|
|
|
|
#define TEL_PM_PREFIX "pm:"
|
|
|
|
|
#define TEL_CORR_PREFIX "corr:"
|
|
|
|
|
#define TEL_VOL_PREFIX "vol:"
|
|
|
|
|
#define TEL_SESSION_PREFIX "session:"
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
//| Gate telemetry events |
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
class CTelemetryStandard
|
|
|
|
|
{
|
|
|
|
|
private:
|
|
|
|
|
CTelemetry* m_telemetry;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
CTelemetryStandard(CTelemetry* tel) : m_telemetry(tel) {}
|
|
|
|
|
|
|
|
|
|
// Gate events with standardized schema
|
|
|
|
|
void LogGateEvent(const string symbol, const int timeframe, const string gate_name,
|
|
|
|
|
const bool allowed, const string phase, const int latency_ms,
|
|
|
|
|
const string reason = "ok")
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%s%s_%s", TEL_GATE_PREFIX, gate_name, (allowed ? "allow" : "block"));
|
|
|
|
|
string details = StringFormat("phase=%s p6_latency_ms=%d reason=%s", phase, latency_ms, reason);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "gate", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Execution events
|
|
|
|
|
void LogExecEvent(const string symbol, const int timeframe, const string strategy_name,
|
|
|
|
|
const string exec_type, const bool success, const int latency_ms,
|
|
|
|
|
const double volume = 0.0, const double price = 0.0)
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%s%s_%s", TEL_EXEC_PREFIX, exec_type, (success ? "success" : "failed"));
|
|
|
|
|
string details = StringFormat("strategy=%s latency_ms=%d volume=%.2f price=%.5f",
|
|
|
|
|
strategy_name, latency_ms, volume, price);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "execution", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Circuit breaker events
|
|
|
|
|
void LogCircuitBreakerEvent(const string symbol, const int timeframe, const string cb_type,
|
|
|
|
|
const string action, const double threshold, const double current_value)
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%s%s_%s", TEL_CB_PREFIX, cb_type, action);
|
|
|
|
|
string details = StringFormat("threshold=%.2f current=%.2f", threshold, current_value);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "circuit_breaker", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Position Manager events
|
|
|
|
|
void LogPositionManagerEvent(const string symbol, const int timeframe, const string pm_action,
|
|
|
|
|
const ulong position_id, const double price, const string reason = "")
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%s%s", TEL_PM_PREFIX, pm_action);
|
|
|
|
|
string details = StringFormat("position_id=%I64u price=%.5f reason=%s", position_id, price, reason);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "position_manager", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Correlation events
|
|
|
|
|
void LogCorrelationEvent(const string symbol, const int timeframe, const string corr_action,
|
|
|
|
|
const double correlation, const double threshold, const string correlated_symbol = "")
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%s%s", TEL_CORR_PREFIX, corr_action);
|
|
|
|
|
string details = StringFormat("correlation=%.3f threshold=%.3f corr_symbol=%s",
|
|
|
|
|
correlation, threshold, correlated_symbol);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "correlation", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Volatility sizing events
|
|
|
|
|
void LogVolatilitySizingEvent(const string symbol, const int timeframe, const double base_size,
|
|
|
|
|
const double vol_multiplier, const double final_size, const double atr_pct)
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%svol_sizing", TEL_VOL_PREFIX);
|
|
|
|
|
string details = StringFormat("base_size=%.2f vol_mult=%.3f final_size=%.2f atr_pct=%.2f",
|
|
|
|
|
base_size, vol_multiplier, final_size, atr_pct);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "volatility", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Generic gate parameter event (for adaptive thresholds / context)
|
|
|
|
|
void LogGateParams(const string symbol, const int timeframe, const string gate_name, const string details)
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
string event_key = StringFormat("%s%s_params", TEL_GATE_PREFIX, gate_name);
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "gate_params", event_key, details);
|
|
|
|
|
}
|
2026-02-04 14:28:59 -05:00
|
|
|
|
|
|
|
|
void LogGateSanitize(const string symbol,
|
|
|
|
|
const int timeframe,
|
|
|
|
|
const string gate_name,
|
|
|
|
|
const double severity,
|
|
|
|
|
const double sl_gap,
|
|
|
|
|
const double tp_gap,
|
|
|
|
|
const double volume)
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = "gate:sanitize";
|
|
|
|
|
string fields = StringFormat("\"gate\":%s,\"severity\":%.6f,\"sl_gap\":%.6f,\"tp_gap\":%.6f,\"volume\":%.2f",
|
|
|
|
|
m_telemetry.JsonQuote(gate_name),
|
|
|
|
|
severity,
|
|
|
|
|
sl_gap,
|
|
|
|
|
tp_gap,
|
|
|
|
|
volume);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEventJson(symbol, timeframe, "gate_sanitize", event_key, fields);
|
|
|
|
|
}
|
2025-09-20 02:27:35 -04:00
|
|
|
|
|
|
|
|
// Session events
|
|
|
|
|
void LogSessionEvent(const string symbol, const int timeframe, const string session_action,
|
|
|
|
|
const int trades_count, const int max_trades, const double pnl = 0.0)
|
|
|
|
|
{
|
|
|
|
|
if(!m_telemetry) return;
|
|
|
|
|
|
|
|
|
|
string event_key = StringFormat("%s%s", TEL_SESSION_PREFIX, session_action);
|
|
|
|
|
string details = StringFormat("trades=%d max_trades=%d pnl=%.2f", trades_count, max_trades, pnl);
|
|
|
|
|
|
|
|
|
|
m_telemetry.LogEvent(symbol, timeframe, "session", event_key, details);
|
|
|
|
|
}
|
|
|
|
|
};
|
2026-02-04 14:28:59 -05:00
|
|
|
|
|
|
|
|
#endif // __DUALEA_TELEMETRYSTANDARD_MQH__
|