Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 568

 
PolarSeaman:

Ci sono 3 cicli di questo tipo. Sostituiti, il terminale si è bloccato.

Ne ho contati quattro:

   int i;

   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

   double avg;

   ki=2.0/(p+1);

   int total;
   int limit = GetRecalcIndex(total,rates_total,prev_calculated);

   for(i=limit; i>=0; i--) 
      fx1[i]=Close[i];

   for(int m=0; m<=s; m++)
     {
      z1=fx1[0];
      for(i=0; i<=limit; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

      z2=fx1[limit];
      for(i=limit; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
     }

   fs=0;
   for(i=limit; i>=0; i--)
     {
      if(fx1[i]>fx1[i+1]) fs=1;
      if(fx1[i]<fx1[i+1]) {if(fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
      if(fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

      avg=iATR(NULL,0,ATR,i+10);
      upper[i] = hp[i] + distance*avg;
      lower[i] = hp[i] - distance*avg;

      if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
         dnar[i]=High[i]+arrots*Point; else dnar[i]=EMPTY_VALUE;

      if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
         upar[i]=Low[i]-arrots*Point; else upar[i]=EMPTY_VALUE;
     }

Niente si blocca. Non ci dovrebbe essere alcun superamento degli array. Tranne che il valore sulla barra dello zero non è calcolato correttamente secondo me.

 
Ihor Herasko:

Ne ho contati quattro:

Niente si blocca. Non ci dovrebbero essere sforamenti al di fuori degli array. Solo che credo che il valore sulla barra dello zero non sia calcolato correttamente.

Grazie, va bene così. Non mi serve sulla barra zero. Voglio ottenerlo dalla prima barra ma le posizioni si aprono caoticamente

sell_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,1),Digits);
sell_1_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,2),Digits);

if(sell_1_1_B==0.0&&sell_1_B!=0.0)
{открываю sell}
if(sell_1_1_B!=0.0&&sell_1_B==0.0)
{открываю buy}

Perché?

 
Ihor Herasko:

Nel tester, sulla visualizzazione c'è questo

ooppe

la prima piega, l'inizio del test, l'indicatore che ha un errore, costruisce una linea retta quando lo lancio sul grafico dopo l'inizio del test

abbiamo rotto qualcosa)

 

Puoi dirmi come mettere una "selezione"di uno strumento grafico sul pulsante nell'Expert Advisor, in modo che cliccando sul pulsante l'icona dello strumento appaia sotto il cursore e sia possibile allungarlo?

E dovrebbe già avere le proprietà specificate

 
PolarSeaman:

Nel tester, sulla visualizzazione c'è questo

la prima piega, l'inizio del test, l'indicatore che ha un errore, costruisce una linea retta quando lo lancio sul grafico dopo l'inizio del test

abbiamo rotto qualcosa)

Esatto, è un indicatore di ridisegno che ricalcola l'intera storia per un numero specificato di barre su ogni tick. Soluzione molto cattiva. Allora dovete farlo in questo modo:

   int i;

   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

   double avg;

   ki=2.0/(p+1);

   int total;
   int limit = GetRecalcIndex(total,rates_total,prev_calculated);

   for(i=total; i>=0; i--) 
      fx1[i]=Close[i];

   for(int m=0; m<=s; m++)
     {
      z1=fx1[0];
      for(i=0; i<=total; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

      z2=fx1[total];
      for(i=total; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
     }

   fs=0;
   for(i=total; i>=0; i--)
     {
      if(fx1[i]>fx1[i+1]) fs=1;
      if(fx1[i]<fx1[i+1]) {if(fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
      if(fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

      avg=iATR(NULL,0,ATR,i+10);
      upper[i] = hp[i] + distance*avg;
      lower[i] = hp[i] - distance*avg;

      if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
         dnar[i]=High[i]+arrots*Point; else dnar[i]=EMPTY_VALUE;

      if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
         upar[i]=Low[i]-arrots*Point; else upar[i]=EMPTY_VALUE;
     }

Sgradevole, certo, ma funziona.

 
perché questa costruzione non funziona nelle dichiarazioni di variabili?
int K=20;
int TIKET[K];
 
igrok333:
perché questo costrutto non funziona nella dichiarazione delle variabili?

Perché K è una variabile. Il suo valore al momento della compilazione è sconosciuto. Per farlo funzionare, dobbiamo rendere K una costante:

#define  K 20
int TIKET[K];
 
Ihor Herasko:

Giusto, perché è un indicatore di ridisegno che ricalcola tutta la storia per un numero specificato di barre su ogni tick. Questa è una pessima soluzione. Allora dovete farlo in questo modo:

Sgradevole, certo, ma funziona.

Grazie. Ho passato così tanto tempo con te e attira ancora 20(!) battute, forse anche di più.

Vogliamo creare una petizione?

Fate una legge chevieti la distribuzione di indicatori che ridisegnano più di tre barre!

Per essere considerati dal Parlamento, dobbiamo raccogliere un totale di 100 mila firme in un anno.

 
PolarSeaman:

Grazie. Abbiamo perso così tanto tempo e lui ha disegnato 20(!) barre, forse di più, che non ho guardato oltre.

Impostando un valore più piccolo di cb, ci saranno meno barre che verranno ridisegnate.

Vogliamo creare una petizione?

Fate una legge chevieti la distribuzione di indicatori che ridisegnano più di tre barre!

Ci vorranno solo 100 000 firme in un anno per essere considerati dall'Assemblea.

)))

 

Puoi dirmi come escludere/aggiungere una data specifica all'EA?

Per esempio, non scambiare il 2 marzo 2018. Ho provato diverse opzioni, mi sono confuso con le date.

TimeDayOfYear (TimeCurrent()) != StrToTime("2018.03.02")