Bei einem Indikator trat ein Fehler bei der Division durch Null auf - Seite 6

 
Aleksey Vyazmikin:

Sie sollte logischerweise überhaupt nicht gleich Null sein - es ist nicht klar, warum dies der Fall ist!

Ihr d1 gibt winzige Zahlen aus, ich vermeide solche Probleme, indem ich den Preis in int umwandle, d.h. zum Beispiel int bid=int((tick_array[0].bid+_Point/10)/_Point); sicher, manchmal gibt es 0.00000999999 auf 5 Ziffern aus, wenn Berechnungen in double durchgeführt werden
 
Aleksey Vyazmikin:

Es sollte nach der Logik überhaupt nicht Null sein - ich verstehe nicht, warum es das tut!

Ausgeführt im Debugger auf Si-9.18. Die Zeit in Raten ist aus irgendeinem Grund 2016. Obwohl der Wert von i 2189 beträgt. Dementsprechend beginnt die Berechnung am Anfang des Diagramms, wo es keine Liquidität gibt. Die anfängliche Zeit zwischen Start und Stopp beträgt 1 Stunde. Aber für diese Stunde gibt es nur einen Zeitwert. Er findet sie sowohl mit der Start- als auch mit der Stopp-Variable. Daraus ergibt sich: Start = Stop. Wenn man sie abzieht, erhält man natürlich Null. Den Rest habe ich noch nicht herausgefunden.

 
ovak77:
Sie haben d1 mit winzigen Zahlen, ich vermeide solche Probleme, indem ich den Preis in int umwandle, d.h. zum Beispiel int bid=int((tick_array[0].bid+_Point/10)/_Point); sicher, manchmal gibt es 0 zurück, wenn Berechnungen in double durchgeführt werden

Lassen Sie uns nicht über d1 diskutieren - wenn es notwendig ist, dann ist es notwendig, alles wird dort richtig gezählt. Die Frage ist, warum wir für start_time und stop_time sowie für start_index und stop_index denselben Wert erhalten?

 
Aleksey Vyazmikin:

Lassen Sie uns nicht über d1 diskutieren - wenn es notwendig ist, dann ist es notwendig, alles wird dort richtig gezählt. Die Frage ist, warum wir für start_time und stop_time denselben Wert erhalten wie für start_index und stop_index?

Sie können versuchen, 0,0000099999 durch 2 zu teilen, zum Beispiel
 

Nach einem weiteren Auflegen funktioniert das Terminal nicht mehr.... Wie kann ich es wiederherstellen, ohne es neu zu installieren?

Es stellte sich heraus, dass der Prozess im Speicher hängen blieb - der Prozess wurde zwangsweise beendet und startete.

 
Aleksey Vyazmikin:

Wie ist es möglich, dass die Zeit gleich wird? Seit einem halben Jahr funktioniert alles einwandfrei...

void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[])
  {                                                              //i = 2189 
   datetime start_time=rates[i].time;                            //start_time=rates[i].time = D'2016.10.06 12:00:00'
   datetime stop_time=(start_time+PeriodSeconds(TimeFrames));    //stop_time = D'2016.10.06 13:00:00'
//---                                                            //Time[38572] = D'2016.10.05 19:23:00'
   int start_index,stop_index,limit;                             //Time[38571] = D'2016.10.06 12:35:00'
   datetime vertical_line_time;                                  //Time[38570] = D'2016.10.06 19:05:00'
//---
   start_index=ArrayBsearch(Time,start_time);                    //start_index = 38571
   if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index);
   start_time=Time[start_index];                                 //start_time = D'2016.10.06 12:35:00'
   if(i>0)
     {
      stop_index=ArrayBsearch(Time,stop_time);                   //stop_index = 38571
      if(Time[stop_index]>stop_time) stop_index++;
      stop_time=Time[stop_index];                                //stop_time  = D'2016.10.06 12:35:00'
      limit=start_index-stop_index+1;
      vertical_line_time=Time[start_index-(limit>>1)];
Sie haben zunächstlimit=start_index-stop_index+1, d.h.limit==1, und dann, wenn die Division durch 2 erfolgt,limit=(int)(stop_time-start_time)/PeriodSeconds(_Period). Eine wird nicht hinzugefügt. Null wird durch die Periode geteilt.
 
Sergey Savinkin:

Ausgeführt im Debugger auf Si-9.18. Die Zeit in Raten ist aus irgendeinem Grund 2016. Obwohl der Wert von i 2189 beträgt. Dementsprechend beginnt die Berechnung am Anfang des Diagramms, wo keine Liquidität vorhanden ist. Die anfängliche Zeit zwischen Start und Stopp beträgt 1 Stunde. Aber für diese Stunde gibt es nur einen Zeitwert. Er findet sie sowohl mit der Start- als auch mit der Stopp-Variable. Daraus ergibt sich: Start = Stop. Wenn man sie abzieht, erhält man natürlich Null. Den Rest habe ich noch nicht herausgefunden.

Geben Sie BarsUsed=100 in die eingehenden Parameter ein.

 
Aleksey Vyazmikin:

Geben Sie BarsUsed=100 in die eingehenden Parameter ein.

Ja, auf diese Weise treten keine Fehler auf. Aber wenn Sie in einige illiquide Instrument oder illiquide Zeit - Abend-Sitzung, zum Beispiel, dann können Sie leicht bekommen 1 niedrig bar innerhalb einer Stunde. Somit ist der Grenzwert = 0 für Sie garantiert! Und wenn die Quote 2 ist - dann ergibt die Grenze/2 immer noch 0, wenn sie gerundet wird.

 
Sergey Savinkin:

Ja, das ist kein Fehler. Wenn Sie jedoch in ein illiquides Instrument oder eine illiquide Zeit einsteigen - z. B. während der Abendsitzung -, können Sie leicht einen Tiefststand in einer Stunde erreichen. Somit ist der Grenzwert = 0 für Sie garantiert! Und wenn das Zitat 2 ist - dann wird die Grenze/2 immer noch 0 sein, wenn gerundet wird.

Vielleicht werde ich darüber nachdenken, danke. Aber das globale Problem ist ein anderes.... Das Problem ist, dass sie nicht stabil ist.

 
ovak77:
Sie können versuchen, 0,0000099999 durch 2 zu teilen, zum Beispiel

Gedrucktes d1 - für meine Zwecke ist es

2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=35.71428571428572
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=32.78688524590164
2018.07.04 19:38:06.404 IndDrafter_Test (Si-9.18,M1)    d1=43.47826086956522

Aber darum geht es ja auch nicht, danke.

Grund der Beschwerde: