Un errore di divisione per zero è apparso in un indicatore - pagina 4

 

limite nel codice, se 1/2=0.5 allora apparentemente l'arrotondamento ora dà 0 invece di 1?

Per testare l'ipotesi ho cambiato il codice

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

Cestino totale - ha ottenuto di nuovo l'errore di divisione per zero

Codice da ME come immagine - forse sono cieco ma non capisco cosa sta succedendo

L'errore è ancora nella stessa linea.

Il file è lo stesso, poiché la linea di errore si è spostata a causa dell'aggiunta di codice per la stampa.

Dovresti usareuno styler - vedresti immediatamente che la tua stringa problematica NON è all'interno della zona di controllo if(limit==0)

 
Vladimir Karputov:

Dovresti usareuno styler - vedresti immediatamente che la tua stringa problematica NON è nella zona di controllo if(limit==0)

Quindi non ha bisogno di entrare, perché?

 

Questo codice.

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

Appendere il terminale.

 
Aleksey Vyazmikin:

limite nel codice, se 1/2=0.5 allora apparentemente l'arrotondamento ora dà 0 invece di 1?

Per testare l'ipotesi ho cambiato il codice

Codice:

//+------------------------------------------------------------------+
//|                                           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);
     }
  }
//+------------------------------------------------------------------+


Risultato:

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:

Codice:


Risultato:

Questo è il fatto, e prima apparentemente 1/2 ha dato un 1, non uno zero.

 
Aleksey Vyazmikin:

Questo è il punto, e prima, 1/2 doveva essere un 1 invece di uno zero.

No, ha sempre arrotondato così.

 
Vladimir Karputov:

No, è sempre arrotondato così.

Quindi è qualcos'altro dopo tutto...

 

Cambiato il codice per la stampa

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

e ora ottengo...

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

Come mai?

 
Aleksey Vyazmikin:

Cambiato il codice per la stampa

e ora ottengo...

Com'è?

Tutto è corretto. Se il limite è calcolato con la formulalimit=(int)(stop_time-start_time)/PeriodSeconds(_Period);

allora il risultato sarà = 0.

Ora dobbiamo vedere come si formano i tempi di arresto e di inizio.