Merge pull request #4 from pietro1991-dot/devin/1781637573-fix-invisible-line
Co-authored-by: Pietro Giacobazzi <giacobazzipietro@gmail.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
+53
-8
@@ -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;i<n;i++) a[i]=src[i];
|
||||
ArraySort(a);
|
||||
if((n&1)==1) return a[n/2];
|
||||
return 0.5*(a[n/2-1]+a[n/2]);
|
||||
}
|
||||
|
||||
//+------------------------------------------------------------------+
|
||||
int OnCalculate(const int rates_total,
|
||||
const int prev_calculated,
|
||||
@@ -109,25 +121,58 @@ int OnCalculate(const int rates_total,
|
||||
ArraySetAsSeries(close,true);
|
||||
ArraySetAsSeries(time,true);
|
||||
|
||||
int limit = rates_total - prev_calculated;
|
||||
if(limit>1) 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;s<d1bars;s++) cols[s][m] = (s<got) ? tmp[s] : 0.0;
|
||||
}
|
||||
for(int s=0;s<d1bars;s++)
|
||||
{
|
||||
double vv[7]; int c=0;
|
||||
for(int m=0;m<7;m++) if(cols[s][m]>0) { 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] = (sj<d1bars) ? med_d1[sj] : 0.0;
|
||||
continue;
|
||||
}
|
||||
|
||||
//--- linea morbida: interpola tra mediana di inizio e fine giornata
|
||||
double vEnd = MedianAtD1(d1cur); // giornata corrente
|
||||
double vStart = MedianAtD1(d1cur+1); // giornata precedente
|
||||
double vEnd = med_d1[d1cur]; // giornata corrente
|
||||
double vStart = (d1cur+1<d1bars) ? med_d1[d1cur+1] : 0.0; // giornata precedente
|
||||
datetime t0 = iTime(_Symbol,ANCHOR_TF,d1cur);
|
||||
datetime t1 = (d1cur>0) ? iTime(_Symbol,ANCHOR_TF,d1cur-1)
|
||||
: t0 + PeriodSeconds(ANCHOR_TF);
|
||||
|
||||
Reference in New Issue
Block a user