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

 
Aleksey Vyazmikin:

En toute logique, il ne devrait pas être égal à zéro - la raison n'est pas claire !

Votre d1 donne des chiffres minuscules, j'évite ce genre de problèmes en convertissant le prix en int, c'est-à-dire par exemple int bid=int((tick_array[0].bid+_Point/10)/_Point) ; c'est sûr, parfois on obtient 0.00000999999 sur 5 chiffres, si on fait les calculs en double
 
Aleksey Vyazmikin:

La logique ne devrait pas être nulle du tout - je ne comprends pas pourquoi elle fait cela !

Exécuté dans le débogueur sur Si-9.18. Le temps dans les taux est 2016 pour une raison quelconque. Bien que la valeur de i soit de 2189. En conséquence, il commence le calcul au début du graphique, là où il n'y a pas de liquidité. Le temps initial entre le démarrage et l'arrêt est de 1 heure. Mais pour cette heure, il n'y a qu'une seule valeur temporelle. Il la trouve avec la variable start et stop. Par conséquent, départ = arrêt. Bien sûr, si vous les soustrayez, vous obtenez zéro. Je n'ai pas encore trouvé le reste.

 
ovak77:
Vous avez d1 avec des chiffres minuscules, j'évite ce genre de problèmes en convertissant le prix en int, c'est à dire par exemple int bid=int((tick_array[0].bid+_Point/10)/_Point) ; pour sûr, parfois cela renvoie 0 si les calculs sont effectués en double

Ne discutons pas de d1 - si c'est nécessaire, alors c'est nécessaire, tout y est compté correctement. La question est de savoir pourquoi nous obtenons la même valeur pour start_time et stop_time, ainsi que pour start_index et stop_index.

 
Aleksey Vyazmikin:

Ne discutons pas de d1 - si c'est nécessaire, alors c'est nécessaire, tout y est compté correctement. La question est de savoir pourquoi nous obtenons la même valeur pour start_time et stop_time que pour start_index et stop_index ?

C'est à vous de voir, essayez de diviser 0,0000099999 par 2, par exemple.
 

Après un nouveau raccrochage, le terminal cesse de fonctionner..... Comment le ressusciter sans le réinstaller ?

Il s'est avéré qu'il était suspendu dans la mémoire - j'ai tué de force le processus - il a démarré.

 
Aleksey Vyazmikin:

Comment est-il possible que le temps devienne égal ? Tout fonctionne correctement depuis six mois...

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)];
Vous avez d'abordlimit=start_index-stop_index+1, c'est-à-direlimit==1, et ensuite où la division par 2 estlimit=(int)(stop_time-start_time)/PeriodSeconds(_Period). Un n'est pas ajouté. Le zéro est divisé par la période.
 
Sergey Savinkin:

Exécuté dans le débogueur sur Si-9.18. Le temps dans les taux est 2016 pour une raison quelconque. Bien que la valeur de i soit de 2189. Par conséquent, il commence le calcul au début du graphique, là où il n'y a pas de liquidité. Le temps initial entre le démarrage et l'arrêt est de 1 heure. Mais pour cette heure, il n'y a qu'une seule valeur temporelle. Elle le trouve avec la variable start et stop. Par conséquent, départ = arrêt. Bien sûr, si vous les soustrayez, vous obtenez zéro. Je n'ai pas encore trouvé le reste.

Mettez BarsUsed=100 dans les paramètres entrants.

 
Aleksey Vyazmikin:

Mettez BarsUsed=100 dans les paramètres entrants.

Oui, de cette façon, aucune erreur ne se produit. Mais si vous entrez dans un instrument illiquide ou un moment illiquide - la session du soir, par exemple, vous pouvez facilement obtenir une barre basse en une heure. Ainsi, la limite = 0 est garantie pour vous ! Et si la citation est 2 - alors la limite/2 donnera toujours 0 lorsqu'elle sera arrondie.

 
Sergey Savinkin:

Oui, ce n'est pas une erreur. Mais si vous entrez dans un instrument illiquide ou un moment illiquide - par exemple, pendant la session du soir, il peut y avoir une barre basse en une heure. Ainsi, la limite = 0 est garantie pour vous ! Et si la citation est 2 - alors la limite/2 sera toujours 0 lorsqu'elle sera arrondie.

Peut-être, je vais y réfléchir, merci. Mais le problème global est tout autre. .... Le problème est qu'il n'est pas stable.

 
ovak77:
C'est à vous de voir, essayez de diviser 0,0000099999 par 2, par exemple.

Imprimé d1 - pour mes besoins c'est

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

De toute façon, ce n'est pas le sujet, merci.

Raison: