Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 568

 
PolarSeaman:

Es gibt 3 solcher Zyklen. Ich habe sie ausgetauscht, das Terminal ist eingefroren.

Ich habe vier gezählt:

   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;
     }

Nichts bleibt hängen. Es sollte keine Überschreitung der Felder geben. Nur der Wert auf der Nullleiste wird meiner Meinung nach nicht korrekt berechnet.

 
Ihor Herasko:

Ich habe vier gezählt:

Nichts bleibt hängen. Außerhalb der Arrays sollte es keine Überschreitungen geben. Ich glaube nur, dass der Wert des Nullbalkens nicht richtig berechnet wird.

Danke, ist schon gut. Ich brauche sie nicht am Nullbarren, sondern am ersten Barren, aber die Positionen werden chaotisch geöffnet.

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}

Und warum?

 
Ihor Herasko:

Im Prüfgerät ist auf der Visualisierung folgendes zu sehen

ooppe

der erste Knick, der Beginn des Tests, der Indikator, der einen Fehler hat, bildet eine gerade Linie, wenn ich ihn nach Beginn des Tests auf das Diagramm werfe

wir haben etwas kaputt gemacht)

 

Können Sie mir sagen, wie ich eine "Auswahl"eines grafischen Werkzeugs auf die Schaltfläche im Expert Advisor legen kann, so dass beim Klicken auf die Schaltfläche das Werkzeugsymbol unter dem Cursor erscheint und es möglich ist, es zu strecken?

Und er sollte bereits die angegebenen Eigenschaften haben

 
PolarSeaman:

Im Prüfgerät ist auf der Visualisierung folgendes zu sehen

der erste Knick, der Beginn des Tests, der Indikator, der einen Fehler hat, bildet eine gerade Linie, wenn ich ihn nach Beginn des Tests auf das Diagramm werfe

wir haben etwas kaputt gemacht)

Richtig, es handelt sich um einen Redrawing-Indikator, der bei jedem Tick die gesamte Historie für eine bestimmte Anzahl von Balken neu errechnet. Sehr schlechte Lösung. Dann müssen Sie es auf diese Weise tun:

   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;
     }

Das ist natürlich unangenehm, aber es funktioniert.

 
warum funktioniert diese Konstruktion nicht bei der Deklaration von Variablen?
int K=20;
int TIKET[K];
 
igrok333:
warum funktioniert dieses Konstrukt nicht in der Variablendeklaration?

Denn K ist eine Variable. Sein Wert zum Zeitpunkt der Zusammenstellung ist unbekannt. Damit das funktioniert, müssen wir K zu einer Konstanten machen:

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

Richtig, denn es handelt sich um einen Redrawing-Indikator, der die gesamte Historie für eine bestimmte Anzahl von Balken bei jedem Tick neu berechnet. Dies ist eine sehr schlechte Lösung. Dann müssen Sie es auf diese Weise tun:

Das ist natürlich unangenehm, aber es funktioniert.

Ich danke Ihnen. Ich habe so viel Zeit mit dir verbracht und es zieht immer noch 20(!) Takte, vielleicht sogar mehr.

Sollen wir eine Petition starten?

Erlassen Sie ein Gesetz, das die Verbreitung von Indikatorenverbietet, die mehr als drei Balken nachzeichnen!

Um vom Parlament berücksichtigt zu werden, müssen wir innerhalb eines Jahres insgesamt 100 000 Unterschriften sammeln.

 
PolarSeaman:

Ich danke Ihnen. Wir haben so viel Zeit verschwendet, und er zeichnet 20(!) Balken, vielleicht mehr, dass ich nicht weiter gesucht habe.

Wenn Sie einen kleineren Wert für cb einstellen, werden weniger Takte neu gezeichnet.

Sollen wir eine Petition einreichen?

Erlassen Sie ein Gesetz, das die Verbreitung von Indikatorenverbietet, die mehr als drei Balken nachzeichnen!

Innerhalb eines Jahres werden nur 100 000 Unterschriften benötigt, um von der Versammlung berücksichtigt zu werden.

)))

 

Können Sie mir sagen, wie ich ein bestimmtes Datum im EA ausschließen/hinzufügen kann?

Zum Beispiel, nicht am 2. März 2018 zu handeln. Ich habe verschiedene Optionen ausprobiert und bin mit den Daten durcheinander gekommen.

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