2026-10-28 00:30:38 -04:00 | | | #include "RuntimeStorage.mqh"
|
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"
|
2026-10-28 00:30:38 -04:00 | | | // ONNX support is provided by CMLPolishGateEnhanced and ModelPredictor.
|
2026-02-24 12:47:37 -05:00 | | | #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
|
2026-10-28 00:30:38 -04:00 | | | if(FileIsExist(m_reload_signal_file, DUALEA_FILE_COMMON))
|
2026-02-24 12:47:37 -05:00 | | | {
|
2026-10-28 00:30:38 -04:00 | | | FileDelete(m_reload_signal_file, DUALEA_FILE_COMMON);
|
2026-02-24 12:47:37 -05:00 | | | }
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| 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
|
2026-10-28 00:30:38 -04:00 | | | if(FileIsExist(m_reload_signal_file, DUALEA_FILE_COMMON))
|
2026-02-24 12:47:37 -05:00 | | | {
|
| | | Print("[AutoLearning] Model reload signal detected");
|
| | | ReloadModels();
|
2026-10-28 00:30:38 -04:00 | | | FileDelete(m_reload_signal_file, DUALEA_FILE_COMMON);
|
2026-02-24 12:47:37 -05:00 | | | }
|
| | |
|
| | | // Also check file modification times
|
| | | for(int i=0; i<3; i++)
|
| | | {
|
2026-10-28 00:30:38 -04:00 | | | if(!FileIsExist(m_model_files[i], DUALEA_FILE_COMMON))
|
2026-02-24 12:47:37 -05:00 | | | continue;
|
| | |
|
| | | datetime file_time = (datetime)FileGetInteger(m_model_files[i],
|
| | | FILE_MODIFY_DATE,
|
2026-10-28 00:30:38 -04:00 | | | DUALEA_FILE_COMMON);
|
2026-02-24 12:47:37 -05:00 | | |
|
| | | 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++)
|
| | | {
|
2026-10-28 00:30:38 -04:00 | | | if(FileIsExist(m_model_files[i], DUALEA_FILE_COMMON))
|
2026-02-24 12:47:37 -05:00 | | | {
|
| | | m_model_load_times[i] = (datetime)FileGetInteger(m_model_files[i],
|
| | | FILE_MODIFY_DATE,
|
2026-10-28 00:30:38 -04:00 | | | DUALEA_FILE_COMMON);
|
2026-02-24 12:47:37 -05:00 | | | 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,
|
2026-10-28 00:30:38 -04:00 | | | FILE_WRITE|FILE_TXT|DUALEA_FILE_COMMON);
|
2026-02-24 12:47:37 -05:00 | | |
|
| | | 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
|