PaPP v2 export: aggiunge file baseline (tutte le barre D1 + traiettoria) per extra-rendimento vs giorno qualunque

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Pietro Giacobazzi
2026-06-17 06:36:24 +00:00
parent 5cee3f06fd
commit 41a2324b0d
+45 -8
View File
@@ -16,6 +16,7 @@ input bool InpAllHistory = true; // true = tutto lo storico D1
input datetime InpStart = D'2010.01.01'; // inizio intervallo (se AllHistory=false)
input datetime InpEnd = D'2100.01.01'; // fine intervallo (se AllHistory=false)
input string InpFileName = ""; // nome file ("" = automatico)
input bool InpBaseline = true; // crea anche il file baseline (tutte le barre D1)
//--- costanti (stesse 7 MA dell'indicatore)
#define ANCHOR_TF PERIOD_D1
@@ -138,8 +139,24 @@ void OnStart()
head += ",bars_to_revert,disc_max_pct";
FileWriteString(fh,head+"\r\n");
//--- file baseline (una riga per OGNI barra D1 valida): serve per il confronto
// "extra-rendimento" = incrocio vs giorno qualunque nello stesso regime
int fhB = INVALID_HANDLE;
if(InpBaseline)
{
string bname = "PaPP_bars_"+sym+"_D1.csv";
fhB = FileOpen(bname,FILE_WRITE|FILE_TXT|FILE_ANSI);
if(fhB==INVALID_HANDLE) Print("FileOpen baseline KO: ",bname," err=",GetLastError());
else
{
string bh = "time,symbol,price,med,dist_med_pct,cluster_pct,cluster_exp,trend,atr_pct,dow,month,bars_to_revert,disc_max_pct";
for(int b=1;b<=MAXH;b++) bh += ",cret_"+IntegerToString(b);
FileWriteString(fhB,bh+"\r\n");
}
}
//--- scansione incroci
long rows=0;
long rows=0, brows=0;
for(int i=iStart;i<=iEnd;i++)
{
if(i<KSLOPE+1) continue;
@@ -165,6 +182,15 @@ void OnStart()
double atr_pct = atr[i]/price*100.0;
MqlDateTime dt; TimeToStruct(tm[i],dt);
//--- traiettoria forward (rendimento cumulato a +1..+MAXH), calcolata una volta per barra
string bpath="";
for(int b=1;b<=MAXH;b++)
{
int iB=i+b;
if(iB>n-1) bpath += ",";
else bpath += ","+DoubleToString((cl[iB]-cl[i])/cl[i]*100.0,5);
}
//--- esito globale: ritorno alla Mediana entro MAXH
int side = (price>med)?1:-1;
int b2rev=-1; double discMax=0;
@@ -178,6 +204,21 @@ void OnStart()
if(MathAbs(d)>MathAbs(discMax)) discMax=d;
}
//--- riga baseline (barra qualunque, indipendente dagli incroci)
if(fhB!=INVALID_HANDLE)
{
string br = TimeToString(tm[i],TIME_DATE)+","+sym+","
+DoubleToString(price,digits)+","+DoubleToString(med,digits)+","
+DoubleToString(dist_med,5)+","+DoubleToString(cluster,5)+","
+DoubleToString(cluster_exp,5)+","+IntegerToString(trend)+","
+DoubleToString(atr_pct,5)+","+IntegerToString(dt.day_of_week)+","
+IntegerToString(dt.mon)+","
+(b2rev>0?IntegerToString(b2rev):"")+","+DoubleToString(discMax,5)
+bpath;
FileWriteString(fhB,br+"\r\n");
brows++;
}
//--- controllo ogni coppia (a,b)
for(int a=0;a<NSER;a++)
for(int b=a+1;b<NSER;b++)
@@ -217,13 +258,7 @@ void OnStart()
row += ","+DoubleToString(ret,5)+","+DoubleToString(mfe,5)+","
+DoubleToString(mae,5)+","+IntegerToString(dlab)+","+IntegerToString(rev);
}
//--- traiettoria: rendimento cumulato a +1..+MAXH barre
for(int b=1;b<=MAXH;b++)
{
int iB=i+b;
if(iB>n-1) { row += ","; continue; }
row += ","+DoubleToString((cl[iB]-cl[i])/cl[i]*100.0,5);
}
row += bpath; // traiettoria forward (uguale per ogni coppia di questa barra)
row += ","+(b2rev>0?IntegerToString(b2rev):"")+","+DoubleToString(discMax,5);
FileWriteString(fh,row+"\r\n");
rows++;
@@ -232,10 +267,12 @@ void OnStart()
}
FileClose(fh);
if(fhB!=INVALID_HANDLE) FileClose(fhB);
for(int m=0;m<7;m++) IndicatorRelease(hMA[m]);
IndicatorRelease(hATR);
Comment("");
PrintFormat("PaPP export COMPLETATO: %d incroci -> %s (cartella MQL5\\Files)",(int)rows,fname);
if(InpBaseline) PrintFormat("Baseline: %d barre -> PaPP_bars_%s_D1.csv",(int)brows,sym);
Print("Periodo: ",TimeToString(tm[iStart])," -> ",TimeToString(tm[iEnd]));
}
//+------------------------------------------------------------------+