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

 
Aleksey Vyazmikin:

Supponiamo di avere

Sappiamo chestart_time dovrebbe essere2018.04.28 23:00

Quindi si scopre che il tempo è sbagliato qui?

Alexey, dai un'occhiata al mio esempio. Vi ho mostrato linea per linea come il tempo orario che passate viene convertito al tempo più vicino dalla barra corrente.

 
Non ho trovato una dichiarazione del tipo di limite della variabile. La mia vista è debole.
 
Алексей Тарабанов:
Impossibile trovare una dichiarazione del limite del tipo di variabile. La mia vista è debole.

Posto 50, procedura OnCalculate

 
Sergey Savinkin:

Posto 50, procedura OnCalculate

Grazie, ma qual è il 50? Puoi aiutarmi con un link?

 
Алексей Тарабанов:

Grazie, ma qual è il 50? Puoi aiutarmi con un link?

https://www.mql5.com/ru/forum/262864/page5

Il link è solo alla pagina. C'è scritto #50 nel titolo del post. Il tuo #74 ))

В одном индикаторе появилась ошибка деления на ноль
В одном индикаторе появилась ошибка деления на ноль
  • 2018.07.04
  • www.mql5.com
Общее обсуждение: В одном индикаторе появилась ошибка деления на ноль
 
Grazie
 
Sergey Savinkin:
Hai scritto 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.

Giusto,limit=start_index-stop_index+1è per i>0, cioè per il calcolo della storia, e limit=(int)(stop_time-start_time)/PeriodSeconds(_Period) è per il calcolo sulla barra corrente.

E la cosa è, in effetti, il motivo per cui il nostro tempo è così storto - se abbiamo un lasso di tempo di un'ora, le date devono essere rotonde, sia all'inizio che alla fine - questo è il vero problema, che l'ora della barra sulla data di inizio è in qualche modo sbagliata!!!

Forse qui c'è un problema.

start_index=ArrayBsearch(Time,start_time);

Poiché start_time è corretto a questo punto

datetime start_time=rates[i].time;
 
Alexei, non c'è nessun 'alla fine'. È solo una quantizzazione. Alle 18:00 esatte la barra si è aperta, ha mostrato un minimo e un massimo e si è chiusa con sicurezza, nello stesso secondo.
 
Алексей Тарабанов:
Alexey, non c'è nessun "alla fine". È solo una quantizzazione. Esattamente alle 18:00 la barra si è aperta, ha mostrato il minimo e il massimo e ha chiuso tranquillamente, nello stesso secondo.

Per esempio, la barra si è aperta alle 18:00, quindi il tempo iniziale(start_time) sarà 18:00 e il tempo finale(stop_time) dovrebbe essere 19:00 per il timeframe orario. Così, l'indice tra loro sarà diverso sul timeframe M1. E nel codice, l'indice iniziale e quello finale sono uguali, il che non è vero.

 
Aleksey Vyazmikin:

Giusto,limit=start_index-stop_index+1è per i>0, cioè per il calcolo della storia, e limit=(int)(stop_time-start_time)/PeriodSeconds(_Period) è per il calcolo sulla barra corrente.

E la cosa è, in effetti, il motivo per cui il nostro tempo è così storto - se abbiamo un lasso di tempo di un'ora, le date devono essere rotonde, sia all'inizio che alla fine - questo è il vero problema, che l'ora della barra sulla data di inizio è in qualche modo sbagliata!!!

Forse qui c'è un problema.

Poiché start_time è corretto a questo punto

E perché sono rotondi, se prima si fa CopyRates dal timeframe orario (risultano numeri rotondi), poi si passa alla proceduraCreateFigure time dal timeframe corrente (tempo, che diventa Time) e Rates dal timeframe orario, e poi si cerca un indice nell'array del tempo corrente?start_index=ArrayBsearch(Time,start_time);