diff --git a/MQL5/Experts/MultiAgentTest/Core/Orchestrator.mqh b/MQL5/Experts/MultiAgentTest/Core/Orchestrator.mqh index 877bcae..d94f6f3 100644 --- a/MQL5/Experts/MultiAgentTest/Core/Orchestrator.mqh +++ b/MQL5/Experts/MultiAgentTest/Core/Orchestrator.mqh @@ -171,6 +171,7 @@ private: double m_riskPerTrade; double m_riskTotal; string m_symbol; + string m_runTimestamp; // --- History cache --- BarSnapshot history[MAX_HISTORY]; @@ -299,8 +300,12 @@ public: m_nnHidden = nnHidden; m_riskPerTrade = riskPerTrade; m_riskTotal = riskTotal; - m_symbol = _Symbol; - m_neuralNet = NULL; + m_symbol = _Symbol; + datetime rn = TimeLocal(); + m_runTimestamp = StringFormat("%04d%02d%02d_%02d%02d%02d", + TimeYear(rn), TimeMonth(rn), TimeDay(rn), + TimeHour(rn), TimeMinute(rn), TimeSeconds(rn)); + m_neuralNet = NULL; m_trainBuffer = NULL; if(m_useNeural || m_trainMode) { @@ -673,7 +678,7 @@ UpdateCorrelation(i, openTrades[idx].entryZScores[i], actualReturnZ); if(m_trainBuffer.Count() % 50 == 0 && m_trainBuffer.Count() >= 20) { if(m_useNeural) { TrainNN(); - string nnFn = (m_modelFilename != "") ? m_modelFilename : "TR_Agent_NN_v1.dat"; + string nnFn = (m_modelFilename != "") ? m_modelFilename : "TR_Agent_NN_v1_" + m_runTimestamp + ".dat"; m_neuralNet.Save(nnFn); Print(" NN auto-saved to ", nnFn, " after ", m_trainBuffer.Count(), " samples"); } @@ -1157,17 +1162,17 @@ UpdateHealth(actualReturn); Print(" ", m_neuralNet.LossHistorySummary()); // CSV dump per debug - m_trainBuffer.SaveCsv("NN_TrainingSamples_" + Symbol() + "_" + EnumToString(Period()) + ".csv"); - m_neuralNet.SaveLossCsv("NN_LossHistory_" + Symbol() + "_" + EnumToString(Period()) + ".csv"); + m_trainBuffer.SaveCsv("NN_TrainingSamples_" + Symbol() + "_" + EnumToString(Period()) + "_" + m_runTimestamp + ".csv"); + m_neuralNet.SaveLossCsv("NN_LossHistory_" + Symbol() + "_" + EnumToString(Period()) + "_" + m_runTimestamp + ".csv"); return loss; } bool SaveNNModel() { if(m_neuralNet == NULL || !m_neuralNet.IsInitialized()) return false; - string fn = (m_modelFilename != "") ? m_modelFilename - : "TR_Agent_NN_" + Symbol() + "_" + EnumToString(Period()) + ".dat"; - bool ok = m_neuralNet.Save(fn); + string fn = (m_modelFilename != "") ? m_modelFilename + : "TR_Agent_NN_" + Symbol() + "_" + EnumToString(Period()) + "_" + m_runTimestamp + ".dat"; + bool ok = m_neuralNet.Save(fn); if(ok) Print("NN model saved: ", fn); else Print("NN model save FAILED: ", fn); return ok; @@ -1201,7 +1206,7 @@ UpdateHealth(actualReturn); // Salva summary CSV con learning stats di ogni agente void SaveAgentLearningCsv() const { - string fn = "AgentLearning_" + Symbol() + "_" + EnumToString(Period()) + ".csv"; + string fn = "AgentLearning_" + Symbol() + "_" + EnumToString(Period()) + "_" + m_runTimestamp + ".csv"; int fh = FileOpen(fn, FILE_TXT|FILE_WRITE|FILE_COMMON); if(fh == INVALID_HANDLE) return; FileWriteString(fh, "agent,bias,bias_n,rho_learn,rho_learn_n,weight\n"); @@ -1221,7 +1226,7 @@ UpdateHealth(actualReturn); // --- Serializzazione --- string ModelFilename(string symbol, ENUM_TIMEFRAMES tf) const { - return "MultiAgentTest_" + symbol + "_" + EnumToString(tf) + ".model"; + return "MultiAgentTest_" + symbol + "_" + EnumToString(tf) + "_" + m_runTimestamp + ".model"; } void SaveState(string symbol, ENUM_TIMEFRAMES tf) const { @@ -1368,7 +1373,7 @@ UpdateHealth(actualReturn); // Salva CSV con TUTTI i parametri derivati per analisi periodica void SaveAnalysisCSV(string symbol, ENUM_TIMEFRAMES tf) const { - string fn = "TR_Agent_Analysis_" + symbol + "_" + EnumToString(tf) + ".csv"; + string fn = "TR_Agent_Analysis_" + symbol + "_" + EnumToString(tf) + "_" + m_runTimestamp + ".csv"; int fh = FileOpen(fn, FILE_TXT|FILE_WRITE|FILE_COMMON); if(fh == INVALID_HANDLE) { Print("SaveAnalysis: errore apertura ", fn); return; } @@ -1494,7 +1499,7 @@ UpdateHealth(actualReturn); // ===================== SAVE BAR HISTORY CSV ===================== void SaveBarHistoryCSV(string symbol, ENUM_TIMEFRAMES tf) const { - string fn = "BarHistory_" + symbol + "_" + EnumToString(tf) + ".csv"; + string fn = "BarHistory_" + symbol + "_" + EnumToString(tf) + "_" + m_runTimestamp + ".csv"; int fh = FileOpen(fn, FILE_TXT|FILE_WRITE|FILE_COMMON); if(fh == INVALID_HANDLE) { Print("BarHistoryCSV: errore apertura ", fn); return; } @@ -1528,7 +1533,7 @@ UpdateHealth(actualReturn); // ===================== SAVE TRADE HISTORY CSV ===================== void SaveTradeHistoryCSV(string symbol, ENUM_TIMEFRAMES tf) const { - string fn = "TradeHistory_" + symbol + "_" + EnumToString(tf) + ".csv"; + string fn = "TradeHistory_" + symbol + "_" + EnumToString(tf) + "_" + m_runTimestamp + ".csv"; int fh = FileOpen(fn, FILE_TXT|FILE_WRITE|FILE_COMMON); if(fh == INVALID_HANDLE) { Print("TradeHistoryCSV: errore apertura ", fn); return; } @@ -1596,7 +1601,7 @@ UpdateHealth(actualReturn); // ===================== SAVE AGENT INTERACTION CSV ===================== void SaveAgentInteractionCSV(string symbol, ENUM_TIMEFRAMES tf) const { - string fn = "AgentInteraction_" + symbol + "_" + EnumToString(tf) + ".csv"; + string fn = "AgentInteraction_" + symbol + "_" + EnumToString(tf) + "_" + m_runTimestamp + ".csv"; int fh = FileOpen(fn, FILE_TXT|FILE_WRITE|FILE_COMMON); if(fh == INVALID_HANDLE) { Print("AgentInteractionCSV: errore apertura ", fn); return; } @@ -1629,7 +1634,7 @@ UpdateHealth(actualReturn); // ===================== SAVE DECISION LOG CSV ===================== void SaveDecisionLogCSV(string symbol, ENUM_TIMEFRAMES tf) const { - string fn = "DecisionLog_" + symbol + "_" + EnumToString(tf) + ".csv"; + string fn = "DecisionLog_" + symbol + "_" + EnumToString(tf) + "_" + m_runTimestamp + ".csv"; int fh = FileOpen(fn, FILE_TXT|FILE_WRITE|FILE_COMMON); if(fh == INVALID_HANDLE) { Print("DecisionLogCSV: errore apertura ", fn); return; }