| //+------------------------------------------------------------------+
|
| //| 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
|