PaPP v2 indicatore: pannello con Velocita'/Accelerazione/Volatilita' = mediana delle 7 scale (dalle nostre MA, no ATR MT5)
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
+54
-3
@@ -15,6 +15,8 @@ input bool Smooth = true; // interpola tra i valori D1 -> linea morbida
|
||||
input bool ShowMA = true; // mostra anche le 7 MA (oltre alla mediana)
|
||||
|
||||
#define ANCHOR_TF PERIOD_D1 // calcolo ancorato a D1: linea identica su ogni TF
|
||||
#define KSLOPE 5 // barre D1 per velocita'/accelerazione
|
||||
#define NVOL 14 // barre D1 per la volatilita'
|
||||
|
||||
double Buff_Median[];
|
||||
double B0[],B1[],B2[],B3[],B4[],B5[],B6[];
|
||||
@@ -154,6 +156,49 @@ double MedianAtD1(int d1shift)
|
||||
return Median(vals,cnt);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
// valore valido = positivo e finito (esclude EMPTY_VALUE di warmup)
|
||||
bool IsVal(double v) { return (v>0.0 && v<1.0e12); }
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
// mediana dei primi c valori di src
|
||||
double MedArr(double &src[],int c)
|
||||
{
|
||||
if(c<=0) return 0;
|
||||
double a[]; ArrayResize(a,c);
|
||||
for(int j=0;j<c;j++) a[j]=src[j];
|
||||
ArraySort(a);
|
||||
if((c&1)==1) return a[c/2];
|
||||
return 0.5*(a[c/2-1]+a[c/2]);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
// Velocita'/accelerazione/volatilita' = mediana delle 7 scale (dalle nostre MA, no ATR)
|
||||
void ScaleMetrics(double &velo,double &acc,double &vol)
|
||||
{
|
||||
velo=0; acc=0; vol=0;
|
||||
int need = MathMax(1+2*KSLOPE,1+NVOL)+1;
|
||||
double va[7],aa[7],wa[7]; int cv=0,ca=0,cw=0;
|
||||
for(int m=0;m<7;m++)
|
||||
{
|
||||
double b[]; ArraySetAsSeries(b,true);
|
||||
if(CopyBuffer(hMA[m],0,0,need,b)!=need) continue;
|
||||
double x1=b[1], xK=b[1+KSLOPE], x2K=b[1+2*KSLOPE];
|
||||
if(IsVal(x1)&&IsVal(xK)) va[cv++]=(x1-xK)/xK*100.0;
|
||||
if(IsVal(x1)&&IsVal(xK)&&IsVal(x2K)) aa[ca++]=(x1-2.0*xK+x2K)/x2K*100.0;
|
||||
double r[]; int rc=0; ArrayResize(r,NVOL);
|
||||
for(int t=1;t<=NVOL;t++)
|
||||
{ double a=b[t], bb=b[t+1]; if(IsVal(a)&&IsVal(bb)) r[rc++]=(a-bb)/bb*100.0; }
|
||||
if(rc>=2)
|
||||
{
|
||||
double mean=0; for(int j=0;j<rc;j++) mean+=r[j]; mean/=rc;
|
||||
double s=0; for(int j=0;j<rc;j++){ double dd=r[j]-mean; s+=dd*dd; }
|
||||
wa[cw++]=MathSqrt(s/(rc-1));
|
||||
}
|
||||
}
|
||||
velo=MedArr(va,cv); acc=MedArr(aa,ca); vol=MedArr(wa,cw);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
// interpolazione lineare con fallback se uno dei valori manca
|
||||
double Interp(double vStart,double vEnd,double frac)
|
||||
@@ -298,11 +343,17 @@ void DrawInfo()
|
||||
Lbl("M","Median: "+DoubleToString(median,_Digits),x,y,FontSize,clrGold,false); y+=lh;
|
||||
Lbl("D","Dist: "+distS,x,y,FontSize,distC,true); y+=lh+2;
|
||||
|
||||
//--- Dispersione MA e bande (info)
|
||||
//--- Cluster (dispersione media delle MA dalla mediana)
|
||||
double ds=0; int dc=0;
|
||||
for(int m=0;m<7;m++) { double v=GetMA(m,1); if(v>0) { ds+=MathAbs(v-median)/median*100; dc++; } }
|
||||
double vol = (dc>0)?ds/dc:0;
|
||||
Lbl("V","Cluster +/-"+DoubleToString(vol,3)+"%",x,y,FontSize,clrGray,false); y+=lh+2;
|
||||
double clu = (dc>0)?ds/dc:0;
|
||||
Lbl("V","Cluster +/-"+DoubleToString(clu,3)+"%",x,y,FontSize,clrGray,false); y+=lh;
|
||||
|
||||
//--- Velocita'/Accelerazione/Volatilita' = mediana delle 7 scale (dalle nostre MA)
|
||||
double velo,acc,volat; ScaleMetrics(velo,acc,volat);
|
||||
Lbl("VEL",StringFormat("Velocita' %dg: %+.3f%%",KSLOPE,velo),x,y,FontSize,(velo>0)?clrLimeGreen:clrTomato,false); y+=lh;
|
||||
Lbl("ACC",StringFormat("Accel %dg: %+.4f%%",KSLOPE,acc),x,y,FontSize,(acc>0)?clrLimeGreen:clrTomato,false); y+=lh;
|
||||
Lbl("VOL",StringFormat("Volatilita' %dg: %.4f%%",NVOL,volat),x,y,FontSize,clrAqua,false); y+=lh+2;
|
||||
|
||||
//--- Valori delle 7 MA (giorni : valore) con colore = linea
|
||||
for(int m=0;m<7;m++)
|
||||
|
||||
Reference in New Issue
Block a user