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

 
Aleksey Vyazmikin:

Non dovrebbe logicamente essere uguale a zero - non è chiaro perché questo sia il caso!

Il tuo d1 dà dei numeri minuscoli, io evito questi problemi convertendo il prezzo in int, cioè per esempio int bid=int((tick_array[0].bid+_Point/10)/_Point); di sicuro, a volte si ottiene 0.00000999999 su 5 cifre, se si fanno i calcoli in double
 
Aleksey Vyazmikin:

Non dovrebbe proprio essere zero per logica - non capisco perché fa così!

Eseguito in debugger su Si-9.18. Il tempo in tassi è 2016 per qualche motivo. Anche se il valore di i è 2189. Di conseguenza, inizia il calcolo all'inizio del grafico, dove non c'è liquidità. Il tempo iniziale tra l'avvio e l'arresto è di 1 ora. Ma per quell'ora, c'è solo un valore temporale. Lo trova sia con la variabile start che con la variabile stop. Di conseguenza, start = stop. Naturalmente, se li sottrai, ottieni zero. Non ho ancora capito il resto.

 
ovak77:
Hai d1 con numeri minuscoli, evito tali problemi convertendo il prezzo in int, cioè per esempio int bid=int((tick_array[0].bid+_Point/10)/_Point); di sicuro, a volte restituisce 0 se i calcoli sono fatti in doppio

Non discutiamo di d1 - se è necessario, allora è necessario, tutto è contato correttamente lì. La domanda è: perché otteniamo lo stesso valore per start_time e stop_time, così come per start_index e stop_index?

 
Aleksey Vyazmikin:

Non discutiamo di d1 - se è necessario, allora è necessario, tutto è contato correttamente lì. La domanda è perché otteniamo lo stesso valore per start_time e stop_time come per start_index e stop_index?

Sta a voi, provate a dividere 0.0000099999 per 2, per esempio
 

Dopo un altro riaggancio, il terminale smette di funzionare.... Come posso resuscitarlo senza reinstallare?

Si è rivelato essere sospeso in memoria - ha ucciso forzatamente il processo - è partito.

 
Aleksey Vyazmikin:

Come è possibile che il tempo diventi uguale? Tutto ha funzionato correttamente per mezzo anno...

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)];
Avete primalimit=start_index-stop_index+1, cioèlimit==1, e poi dove la divisione per 2 èlimit=(int)(stop_time-start_time)/PeriodSeconds(_Period). Uno non viene aggiunto. Lo zero è diviso per il periodo.
 
Sergey Savinkin:

Eseguito in debugger su Si-9.18. Il tempo in tassi è 2016 per qualche motivo. Anche se il valore di i è 2189. Di conseguenza, inizia il calcolo all'inizio del grafico dove non c'è liquidità. Il tempo iniziale tra l'avvio e l'arresto è di 1 ora. Ma per quell'ora, c'è solo un valore temporale. Lo trova sia con la variabile start che con la variabile stop. Di conseguenza, start = stop. Naturalmente, se li sottrai, ottieni zero. Non ho ancora capito il resto.

Mettete BarsUsed=100 nei parametri in entrata.

 
Aleksey Vyazmikin:

Mettete BarsUsed=100 nei parametri in entrata.

Sì, in questo modo non si verificano errori. Ma se entri in qualche strumento illiquido o tempo illiquido - sessione serale, per esempio, allora puoi facilmente ottenere 1 barra bassa in un'ora. Così, il limite = 0 è garantito per voi! E se la citazione è 2 - allora il limite/2 darà ancora 0 quando viene arrotondato.

 
Sergey Savinkin:

Sì, non è un errore. Ma se entri in qualche strumento illiquido o tempo illiquido - per esempio, durante la sessione serale, ci potrebbe essere 1 barra bassa in un'ora. Così, il limite = 0 è garantito per voi! E se la citazione è 2 - allora il limite/2 sarà ancora 0 quando viene arrotondato.

Forse, ci penserò, grazie. Ma il problema globale è un'altra cosa.... Il problema è che non è stabile.

 
ovak77:
Sta a voi, provate a dividere 0.0000099999 per 2, per esempio

Stampato d1 - per i miei scopi è

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

Comunque, non è questo il punto, grazie.