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

 

limite dans le code, si 1/2=0.5 alors apparemment l'arrondi donne maintenant 0 au lieu de 1 ?

Pour tester l'hypothèse, j'ai modifié le code

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

Total trash - j'ai encore eu une erreur de division par zéro

Code de ME sous forme d'image - peut-être suis-je aveugle mais je ne comprends pas ce qui se passe

L'erreur se trouve toujours sur la même ligne.

Le fichier est le même, la ligne d'erreur s'est déplacée en raison de l'ajout du code pour l'impression.

Vous devriez utiliserun styleur - vous verriez immédiatement que votre chaîne problématique n'est PAS dans la zone de contrôle if(limit==0)

 
Vladimir Karputov:

Vous devriez utiliserun styler - vous verriez immédiatement que votre chaîne problématique n'est PAS dans la zone de contrôle if(limit==0)

Il n'a donc pas besoin d'entrer, pourquoi ?

 

Ce code.

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

Je raccroche le terminal.

 
Aleksey Vyazmikin:

limite dans le code, si 1/2=0.5 alors apparemment l'arrondi donne maintenant 0 au lieu de 1 ?

Pour tester l'hypothèse, j'ai modifié le code

Code :

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


Résultat :

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:

Code :


Résultat :

C'est ça le truc, et tout à l'heure apparemment 1/2 a donné 1, pas zéro.

 
Aleksey Vyazmikin:

C'est ça le truc, et avant, 1/2 devait être un 1 au lieu d'un 0.

Non. Ça s'est toujours terminé comme ça.

 
Vladimir Karputov:

Non. C'est toujours arrondi comme ça.

C'est donc autre chose après tout...

 

J'ai modifié le code pour l'impression

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

et maintenant je reçois...

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

Comment cela se fait-il ?

 
Aleksey Vyazmikin:

J'ai modifié le code pour l'impression

et maintenant je reçois...

Comment ça ?

Tout est correct. Si la limite est calculée à l'aide de la formulelimit=(int)(stop_time-start_time)/PeriodSeconds(_Period) ;

alors le résultat sera = 0.

Nous devons maintenant voir comment les temps d'arrêt et de départ sont formés.