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

 

Grenze im Code, wenn 1/2=0,5 ist, dann ergibt die Rundung jetzt offenbar 0 statt 1?

Um die Hypothese zu testen, habe ich den Code geändert

         double d1=(delta_price_high-center_line_point)/((double)limit/2);
         double d2=(center_line_point-delta_price_low)/((double)limit/2);
 
Aleksey Vyazmikin:

Totaler Quatsch - wieder ein Fehler bei der Division durch Null

Code von ME als Bild - vielleicht bin ich blind, aber ich verstehe nicht, was hier los ist

Der Fehler befindet sich immer noch in derselben Zeile.

Die Datei ist dieselbe, nur die Fehlerzeile hat sich durch das Hinzufügen von Code für den Druck verschoben.

Sie sollteneinen Styler verwenden - Sie würden sofort sehen, dass Ihre Problemzeichenkette NICHT innerhalb der Prüfzone liegt if(limit==0)

 
Vladimir Karputov:

Sie sollteneinen Styler verwenden - Sie würden sofort sehen, dass Ihr Problemstring NICHT in der Prüfzone liegt if(limit==0)

Es muss also nicht eingetragen werden, warum?

 

Dieser Code.

         int a=1;
         double test=1/(a/2);

Aufhängen des Terminals.

 
Aleksey Vyazmikin:

Grenze im Code, wenn 1/2=0,5 ist, dann ergibt die Rundung jetzt offenbar 0 statt 1?

Um die Hypothese zu testen, habe ich den Code geändert

Code:

//+------------------------------------------------------------------+
//|                                           writeSpicifiedType.mq5 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property version   "1.00"
//---
double high=-1.0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int limit=0;limit<4;limit++)
     {
      Print("limit (",limit,")/2 ",limit/2);
     }
  }
//+------------------------------------------------------------------+


Ergebnis:

Test_en (EURUSD,M30)    limit (0)/2 0
Test_en (EURUSD,M30)    limit (1)/2 0
Test_en (EURUSD,M30)    limit (2)/2 1
Test_en (EURUSD,M30)    limit (3)/2 1
 
Vladimir Karputov:

Code:


Ergebnis:

Das ist es ja, und vorhin hat offenbar 1/2 eine 1 gegeben, nicht eine Null.

 
Aleksey Vyazmikin:

Das ist die Sache, und vorher muss 1/2 eine 1 statt einer Null gewesen sein.

Nein, es wurde immer so aufgerundet.

 
Vladimir Karputov:

Nein. Es wird immer so abgerundet.

Es ist also doch etwas anderes...

 

Der Code für den Druck wurde geändert

         if(limit/2==0)
         {
         limit=2;
         Print("start_time - ",TimeToString(start_time,TIME_DATE|TIME_MINUTES)," stop_time - ",TimeToString(stop_time,TIME_DATE|TIME_MINUTES));
         Print("start_index=",start_index, " stop_index=",stop_index);
         }

und jetzt bekomme ich...

2018.07.04 15:47:07.959 IndDrafter (Si-9.18,H1) start_time - 2017.08.10 11:00 stop_time - 2017.08.10 11:00
2018.07.04 15:47:07.959 IndDrafter (Si-9.18,H1) start_index=2012 stop_index=2012

Wie kommt das?

 
Aleksey Vyazmikin:

Der Code für den Druck wurde geändert

und jetzt bekomme ich...

Wie war das?

Alles ist korrekt. Wenn das Limit nach der Formellimit=(int)(stop_time-start_time)/PeriodSeconds(_Period) berechnet wird;

dann ist das Ergebnis = 0.

Jetzt müssen wir sehen, wie die Start- und Stoppzeiten gebildet werden.