Files

113 lines
3.2 KiB
Plaintext

#ifndef AGENT_BASE_MQH
#define AGENT_BASE_MQH
#include "../Core/MarketData.mqh"
#include "../Core/Statistics.mqh"
double SHARED_regimeZ = 0.0;
double SHARED_regimeH = 0.5;
double SHARED_trendStrength = 0.0;
double SHARED_adxZ = 0.0;
double SHARED_adxRaw = 0.0;
double SHARED_regimeConsensus = 0.0;
double SHARED_regimeAgreement = 0.0;
double SHARED_patternCode = 0.0;
string SHARED_patternName = "";
class IAgent {
public:
string name;
double weight;
bool enabled;
string symbol;
ENUM_TIMEFRAMES timeframe;
double lastZScore;
double lastRawSignal;
KalmanNormalizer signalStats;
// --- Learning infrastructure ---
RunningStats predictionError; // predictedZ - actualReturnZ (bias)
RunningCorrelation predCorr; // correlation predictedZ vs actualReturnZ
int learnMinSamples; // minimo campioni prima di applicare learning
IAgent(string n, double w=1.0)
: name(n), weight(w), enabled(true), symbol(""), timeframe(PERIOD_CURRENT),
lastZScore(0), lastRawSignal(0), signalStats(0.001, 1.0, 30),
predictionError(0.1, 5, 500), predCorr(0.1, 5), learnMinSamples(5) {}
virtual ~IAgent() {}
virtual void Init(string sym, ENUM_TIMEFRAMES tf) {
symbol = sym;
timeframe = tf;
}
virtual void Release() {}
virtual double Analyze(const MarketData &data) = 0;
virtual void Interact(IAgent *&allAgents[], int count) {}
// --- Apprendimento da trade outcome ---
// predictedZ = z-score dell'agente al momento dell'entrata
// actualReturnZ = ritorno normalizzato del trade chiuso
virtual void Learn(double predictedZ, double actualReturnZ) {
predictionError.Update(predictedZ - actualReturnZ);
predCorr.Update(predictedZ, actualReturnZ);
}
// Applica bias correction + confidence scaling a un raw z-score
double CalibrateZ(double rawZ) {
if(predictionError.Count() < learnMinSamples) return rawZ;
double corrected = rawZ;
// Bias correction: solo se statisticamente significativo (> 2 SE)
double bias = predictionError.Mean();
double biasSE = predictionError.Std() / MathSqrt((double)predictionError.Count());
if(MathAbs(bias) > 2.0 * biasSE) {
corrected -= bias * 0.3;
}
// Confidence scaling: se correlazione bassa o negativa, riduci magnitudine
if(predCorr.Ready()) {
double rho = predCorr.Correlation();
if(rho < 0.2) {
corrected *= MathMax(0.05, MathMax(0.0, rho) / 0.2);
}
}
return corrected;
}
virtual void Save(int fh) const {
FileWriteInteger(fh, 3);
signalStats.Save(fh);
predictionError.Save(fh);
predCorr.Save(fh);
}
virtual void Load(int fh) {
int ver = FileReadInteger(fh);
if(ver == 3) {
signalStats.Load(fh);
predictionError.Load(fh);
predCorr.Load(fh);
}
else if(ver == 2) {
signalStats.Load(fh);
}
}
virtual void Reset() {
signalStats.Reset();
predictionError.Reset();
lastZScore = 0;
lastRawSignal = 0;
}
virtual string SignalInfo() const {
return name + " z=" + StringFormat("%+.3f", lastZScore);
}
};
#endif