mql5/Experts/Advisors/DualEA/Include/GateSystemAutoLearning.mqh

212 lines
7.5 KiB
MQL5
Raw Permalink Normal View History

2026-02-24 12:47:37 -05:00
//+------------------------------------------------------------------+
//| GateSystemAutoLearning.mqh - Master Include for Auto-Learning |
//| Single include that activates full learning pipeline: |
//| - Shadow logging |
//| - Auto-tuning |
//| - ONNX model loading/reloading |
//| - Trigger-based retraining |
//+------------------------------------------------------------------+
#ifndef GATESYSTEMAUTOLEARNING_MQH
#define GATESYSTEMAUTOLEARNING_MQH
// Core components
#include "CGateBase.mqh"
#include "CShadowLogger.mqh"
#include "CMLPolishGateONNX.mqh"
#include "EnhancedEfficientGateSystem.mqh"
//+------------------------------------------------------------------+
//| Auto-Learning Configuration |
//+------------------------------------------------------------------+
struct SAutoLearningConfig
{
bool enabled; // Master switch
bool shadow_mode; // Shadow logging only?
bool auto_tune_gates; // Enable auto-tuning?
bool load_onnx_models; // Load ONNX dynamic thresholds?
bool auto_reload_models; // Auto-reload when new model available?
int retrain_interval_hours; // Hours between retraining
string model_directory; // Where ONNX models are stored
void Init()
{
enabled = true;
shadow_mode = false;
auto_tune_gates = true;
load_onnx_models = true;
auto_reload_models = true;
retrain_interval_hours = 24;
model_directory = "DualEA/models/";
}
};
//+------------------------------------------------------------------+
//| Auto-Learning Manager |
//| Monitors for model updates and triggers retraining |
//+------------------------------------------------------------------+
class CAutoLearningManager
{
private:
SAutoLearningConfig m_config;
CEfficientGateManagerEnhanced* m_gate_manager;
// Model monitoring
datetime m_last_model_check;
string m_model_files[3]; // G5, G6, G7 models
datetime m_model_load_times[3];
// Trigger file paths
string m_trigger_file;
string m_reload_signal_file;
public:
CAutoLearningManager()
{
m_gate_manager = NULL;
m_last_model_check = 0;
m_trigger_file = "DualEA/retrain.trigger";
m_reload_signal_file = "DualEA/models/model.reload";
ArrayInitialize(m_model_load_times, 0);
m_model_files[0] = "DualEA/models/gate5_optimizer.onnx";
m_model_files[1] = "DualEA/models/gate6_optimizer.onnx";
m_model_files[2] = "DualEA/models/gate7_optimizer.onnx";
}
void Initialize(CEfficientGateManagerEnhanced* gm, SAutoLearningConfig &config)
{
m_gate_manager = gm;
m_config = config;
Print("[AutoLearning] Manager initialized");
Print("[AutoLearning] Shadow mode: " + (config.shadow_mode ? "YES" : "NO"));
Print("[AutoLearning] ONNX models: " + (config.load_onnx_models ? "YES" : "NO"));
Print("[AutoLearning] Auto-tuning: " + (config.auto_tune_gates ? "YES" : "NO"));
// Load initial models
if(config.load_onnx_models)
{
ReloadModels();
}
// Clear any stale reload signal
if(FileIsExist(m_reload_signal_file, FILE_COMMON))
{
FileDelete(m_reload_signal_file, FILE_COMMON);
}
}
//+------------------------------------------------------------------+
//| Check and reload models if updated |
//+------------------------------------------------------------------+
void CheckModelUpdates()
{
if(!m_config.enabled || !m_config.auto_reload_models)
return;
// Check every 5 minutes
if(TimeCurrent() - m_last_model_check < 300)
return;
m_last_model_check = TimeCurrent();
// Check for reload signal from Python
if(FileIsExist(m_reload_signal_file, FILE_COMMON))
{
Print("[AutoLearning] Model reload signal detected");
ReloadModels();
FileDelete(m_reload_signal_file, FILE_COMMON);
}
// Also check file modification times
for(int i=0; i<3; i++)
{
if(!FileIsExist(m_model_files[i], FILE_COMMON))
continue;
datetime file_time = (datetime)FileGetInteger(m_model_files[i],
FILE_MODIFY_DATE,
FILE_COMMON);
if(file_time > m_model_load_times[i])
{
Print(StringFormat("[AutoLearning] Model %d updated, reloading...", i));
ReloadModels();
break;
}
}
}
//+------------------------------------------------------------------+
//| Reload all ONNX models |
//+------------------------------------------------------------------+
void ReloadModels()
{
Print("[AutoLearning] Reloading ONNX models...");
// Note: In actual implementation, you would access individual gates
// and reload their ONNX models. For now, log the intent.
for(int i=0; i<3; i++)
{
if(FileIsExist(m_model_files[i], FILE_COMMON))
{
m_model_load_times[i] = (datetime)FileGetInteger(m_model_files[i],
FILE_MODIFY_DATE,
FILE_COMMON);
Print(StringFormat("[AutoLearning] Loaded model %d: %s", i, m_model_files[i]));
}
}
Print("[AutoLearning] Model reload complete");
}
//+------------------------------------------------------------------+
//| Trigger retraining (called when sufficient data collected) |
//+------------------------------------------------------------------+
void TriggerRetraining()
{
if(!m_config.enabled)
return;
// Create trigger file for Python optimizer
int handle = FileOpen(m_trigger_file,
FILE_WRITE|FILE_TXT|FILE_COMMON);
if(handle != INVALID_HANDLE)
{
FileWriteString(handle, "Retraining triggered at " +
TimeToString(TimeCurrent()) + "\n");
FileClose(handle);
Print("[AutoLearning] Retraining triggered");
}
}
//+------------------------------------------------------------------+
//| Record trade outcome for learning |
//+------------------------------------------------------------------+
void RecordOutcome(double pnl)
{
if(m_gate_manager != NULL)
{
m_gate_manager.RecordTradeOutcome(pnl);
}
}
//+------------------------------------------------------------------+
//| Periodic update (call from OnTick or OnTimer) |
//+------------------------------------------------------------------+
void OnTickUpdate()
{
CheckModelUpdates();
}
//+------------------------------------------------------------------+
//| Getters |
//+------------------------------------------------------------------+
bool IsEnabled() const { return m_config.enabled; }
bool IsShadowMode() const { return m_config.shadow_mode; }
};
#endif // GATESYSTEMAUTOLEARNING_MQH