Une erreur de division par zéro est apparue dans un indicateur - page 8

 
Aleksey Vyazmikin:

Supposons que nous ayons

Nous savons que l'heure de début doit être2018.04.28 23:00

Il s'avère donc que l'heure est fausse ici ?

Alexey, regardez mon exemple. J'y ai montré ligne par ligne comment le temps horaire que vous passez est converti en temps le plus proche de la barre actuelle.

 
Je n'ai pas trouvé de déclaration du type de limite de la variable. Ma vue est faible.
 
Алексей Тарабанов:
Impossible de trouver une déclaration du type de variable limite. Ma vue est faible.

Poste 50, procédure OnCalculate

 
Sergey Savinkin:

Post 50, procédure OnCalculate

Merci, mais lequel est le 50 ? Pouvez-vous m'aider avec un lien ?

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

Merci, mais lequel est le 50 ? Pouvez-vous m'aider à trouver un lien ?

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

Le lien renvoie simplement à la page. Il est écrit #50 dans le titre du post. Votre n°74 :)

В одном индикаторе появилась ошибка деления на ноль
В одном индикаторе появилась ошибка деления на ноль
  • 2018.07.04
  • www.mql5.com
Общее обсуждение: В одном индикаторе появилась ошибка деления на ноль
 
Merci.
 
Sergey Savinkin:
Vous avez d'abord écritlimit=start_index-stop_index+1, c'est-à-dire quelimit==1, et ensuite où la division par 2 -limit=(int)(stop_time-start_time)/PeriodSeconds(_Period). Un n'est pas ajouté. Le zéro est divisé par la période.

Exact,limit=start_index-stop_index+1est pour i>0, c'est-à-dire pour le calcul de l'historique, et limit=(int)(stop_time-start_time)/PeriodSeconds(_Period) est pour le calcul sur la barre actuelle.

Et c'est, en fait, la raison pour laquelle notre temps est si tordu - si nous avons un laps de temps d'une heure, les dates doivent être rondes, tant au début qu'à la fin - c'est là le vrai problème, que l'heure de la barre de la date de début est en quelque sorte fausse !!!

Il y a peut-être un problème ici.

start_index=ArrayBsearch(Time,start_time);

Comme l'heure de départ est correcte à ce stade

datetime start_time=rates[i].time;
 
Alexei, il n'y a pas de "à la fin". C'est juste de la quantification. À 18 heures exactement, la barre s'est ouverte, a affiché un minimum et un maximum et s'est refermée en toute sécurité, dans la même seconde.
 
Алексей Тарабанов:
Alexey, il n'y a pas de "à la fin". C'est juste une quantification. À 18 heures exactement, le bar s'est ouvert, a affiché le minimum et le maximum et s'est fermé en toute sécurité, dans la même seconde.

Par exemple, la barre s'est ouverte à 18h00, donc l'heure initiale(start_time) sera 18h00 et l'heure finale(stop_time) est censée être 19h00 pour l'échelle horaire. Ainsi, l'indice entre eux sera différent sur l'échelle de temps M1. Et dans le code, l'indice de début et l'indice de fin sont les mêmes, ce qui n'est pas vrai.

 
Aleksey Vyazmikin:

Exact,limit=start_index-stop_index+1est pour i>0, c'est-à-dire pour le calcul de l'historique, et limit=(int)(stop_time-start_time)/PeriodSeconds(_Period) est pour le calcul sur la barre actuelle.

Et la chose est, en fait, la raison pour laquelle notre temps est si tordu - si nous avons un laps de temps d'une heure, les dates doivent être rondes, à la fois au début et à la fin - c'est le vrai problème, que l'heure de la barre sur la date de début est en quelque sorte fausse !!!

Il y a peut-être un problème ici.

Puisque start_time est correct à ce stade

Et pourquoi sont-ils ronds, si vous faites d'abord CopyRates à partir de l'heure (il s'agit de chiffres ronds), puis vous passez à la procédureCreateFigure le temps de l'heure courante (time, qui se transforme en Time) et les Rates de l'heure, puis vous cherchez un index dans le tableau de l'heure courante ?start_index=ArrayBsearch(Time,start_time);