diff --git a/PaPP v2/PaPP_Median.mq5 b/PaPP v2/PaPP_Median.mq5 index 585cc30..eb34121 100644 --- a/PaPP v2/PaPP_Median.mq5 +++ b/PaPP v2/PaPP_Median.mq5 @@ -93,6 +93,18 @@ double MedianAtD1(int d1shift) return Median(vals,cnt); } +//+------------------------------------------------------------------+ +// Mediana dei primi n valori di src +double MedianN(const double &src[],int n) + { + if(n<=0) return 0; + double a[]; ArrayResize(a,n); + for(int i=0;i1) limit=rates_total-1; + //--- i dati D1 devono essere pronti, altrimenti ritenta al prossimo tick + int d1bars = Bars(_Symbol,ANCHOR_TF); + if(d1bars<2) return 0; + if(BarsCalculated(hMA[0])<=0) return 0; - for(int idx=limit;idx>=0;idx--) + //--- carica le 7 MA D1 in blocco e calcola la mediana per ogni barra D1 + double med_d1[]; ArrayResize(med_d1,d1bars); ArraySetAsSeries(med_d1,true); + double cols[][7]; ArrayResize(cols,d1bars); + for(int m=0;m<7;m++) + { + double tmp[]; ArraySetAsSeries(tmp,true); + int got = CopyBuffer(hMA[m],0,0,d1bars,tmp); + if(got<=0) return 0; // non pronto: ritenta + for(int s=0;s0) { vv[c]=cols[s][m]; c++; } + med_d1[s] = MedianN(vv,c); + } + + //--- range di barre grafico da (ri)calcolare: + // tutto al primo load o quando nasce una nuova barra D1, altrimenti solo oggi + static int s_lastD1 = -1; + int recalcFrom; + if(prev_calculated==0 || d1bars!=s_lastD1) + recalcFrom = rates_total-1; + else + { + datetime todayOpen = iTime(_Symbol,ANCHOR_TF,0); + recalcFrom = 0; + while(recalcFrom < rates_total-1 && time[recalcFrom] >= todayOpen) recalcFrom++; + } + s_lastD1 = d1bars; + + for(int idx=recalcFrom; idx>=0; idx--) { - //--- barra D1 che contiene il tempo di questa barra grafico int d1cur = iBarShift(_Symbol,ANCHOR_TF,time[idx],false); - if(d1cur<0) { Buff_Median[idx]=0; continue; } + if(d1cur<0 || d1cur>=d1bars) { Buff_Median[idx]=0; continue; } if(!Smooth) { //--- gradino: ultima barra D1 chiusa (non-repaint) - Buff_Median[idx]=MedianAtD1(d1cur+1); + int sj=d1cur+1; + Buff_Median[idx] = (sj0) ? iTime(_Symbol,ANCHOR_TF,d1cur-1) : t0 + PeriodSeconds(ANCHOR_TF);