Zero Divide (Trouver le problème - mais pourquoi ?)

 

J'ai donc trouvé la cause de la division par zéro - je n'avais jamais vu cela jusqu'à maintenant. Je pensais en avoir fini avec mon code jusqu'à ce que cela apparaisse ! J'ai 3 variantes de mon EA. La première fonctionne parfaitement, les deux autres sont similaires dans ce domaine (code ci-dessous). Je n'arrive pas à comprendre pourquoi cela provoquerait une division par zéro ?

Cherchez les lignes avec les flèches indiquant les lignes qui posent problème... J'ai isolé ce problème ici ? Soit cela, soit j'obtiens une anomalie avec le backtest AUDUSD (je télécharge mes données historiques à partir de Forex Tester 2... cela semble bien fonctionner avec l'un de mes EA).

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//| Function that checks for an MA Cross                                                                                                   |
//+----------------------------------------------------------------------------------------------------------------------------------------+   

void CheckForMaTrade()
   {
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1),  Hour4_3   =  iMA(NULL,240,3,0,1,0,1),  Daily_3   =  iMA(NULL,1440,3,0,1,0,1); 
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1),  Hour4_5   =  iMA(NULL,240,5,0,1,0,1),  Daily_5   =  iMA(NULL,1440,5,0,1,0,1);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1),  Hour4_8   =  iMA(NULL,240,8,0,1,0,1),  Daily_8   =  iMA(NULL,1440,8,0,1,0,1);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1), Hour4_10  =  iMA(NULL,240,10,0,1,0,1), Daily_10  =  iMA(NULL,1440,10,0,1,0,1);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1), Hour4_12  =  iMA(NULL,240,12,0,1,0,1), Daily_12  =  iMA(NULL,1440,12,0,1,0,1);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1), Hour4_15  =  iMA(NULL,240,15,0,1,0,1), Daily_15  =  iMA(NULL,1440,15,0,1,0,1);
   double CurrentBigFish1     =  iMA(NULL,60,30,0,1,0,1), Hour4_30  =  iMA(NULL,240,30,0,1,0,1), Daily_30  =  iMA(NULL,1440,30,0,1,0,1);
   double CurrentBigFish2     =  iMA(NULL,60,35,0,1,0,1), Hour4_35  =  iMA(NULL,240,35,0,1,0,1), Daily_35  =  iMA(NULL,1440,35,0,1,0,1);
   double CurrentBigFish3     =  iMA(NULL,60,40,0,1,0,1), Hour4_40  =  iMA(NULL,240,40,0,1,0,1), Daily_40  =  iMA(NULL,1440,40,0,1,0,1);
   double CurrentBigFish4     =  iMA(NULL,60,45,0,1,0,1), Hour4_45  =  iMA(NULL,240,45,0,1,0,1), Daily_45  =  iMA(NULL,1440,45,0,1,0,1);
   double CurrentBigFish5     =  iMA(NULL,60,50,0,1,0,1), Hour4_50  =  iMA(NULL,240,50,0,1,0,1), Daily_50  =  iMA(NULL,1440,50,0,1,0,1);
   double CurrentBigFish6     =  iMA(NULL,60,60,0,1,0,1), Hour4_60  =  iMA(NULL,240,60,0,1,0,1), Daily_60  =  iMA(NULL,1440,60,0,1,0,1);
   double ema21               =  iMA(NULL,60,21,0,1,0,1);

 //-------------------(-H1 Fish-)------------------\\  - //------------(-H4 Fish-)-----------\\ - //------------(-D1 Fish-)-----------\\
   
  // Check for Moving Averages Fanned up ON THE DAILY TIME FRAME, creating an UP bias.   
    if(D1_Bias=="None") 
      if(Daily_3>Daily_5)
         if(Daily_5>Daily_8)
            if(Daily_8>Daily_10)
               if(Daily_10>Daily_12)
                  if(Daily_12>Daily_15)
                     if(Daily_15>Daily_30)
                        if(Daily_30>Daily_35)
                           if(Daily_35>Daily_40)
                              if(Daily_40>Daily_45)
                                 if(Daily_45>Daily_50)
                                    if(Daily_50>Daily_60)
                                       {
                                       D1_Bar=Time[1];
                                       D1_Bias="Daily is Up";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
  
  // Check for Moving Averages Fanned up ON THE 4 HOUR TIME FRAME, creating an UP bias.  
    if(D1_Bias=="Daily is Up" && H4_Bias=="None") 
      if(Hour4_3>Hour4_5)
         if(Hour4_5>Hour4_8)
            if(Hour4_8>Hour4_10)
               if(Hour4_10>Hour4_12)
                  if(Hour4_12>Hour4_15)
                     if(Hour4_15>Hour4_30)
                        if(Hour4_30>Hour4_35)
                           if(Hour4_35>Hour4_40)
                              if(Hour4_40>Hour4_45)
                                 if(Hour4_45>Hour4_50)
                                    if(Hour4_50>Hour4_60)
                                       {
                                       H4_Bar=Time[1];
                                       H4_Bias="4 Hour is Up";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   // Check for Moving Averages Fanned up on H1, creating an UP bias.
   if(D1_Bias=="Daily is Up" && H4_Bias=="4 Hour is Up" && H1_Bias=="None")
      if(CurrentSmallFish1>CurrentSmallFish2)
         if(CurrentSmallFish2>CurrentSmallFish3)
            if(CurrentSmallFish3>CurrentSmallFish4)
               if(CurrentSmallFish4>CurrentSmallFish5)
                  if(CurrentSmallFish5>CurrentSmallFish6)
                     if(CurrentSmallFish6>CurrentBigFish1)
                        if(CurrentBigFish1>CurrentBigFish2)
                           if(CurrentBigFish2>CurrentBigFish3)
                              if(CurrentBigFish3>CurrentBigFish4)
                                 if(CurrentBigFish4>CurrentBigFish5)
                                    if(CurrentBigFish5>CurrentBigFish6)
                                       {
                                       triggerBarTime=Time[1];
                                       H1_Bias="H1 is Up";
                                       Comment("Bias is: "+H1_Bias+" since: "+TimeToStr(triggerBarTime,TIME_DATE|TIME_MINUTES));
                                       H4_Bias="4 Hour is Up";
                                       Comment("Bias is: "+H4_Bias+" since: "+TimeToStr(H4_Bar,TIME_DATE|TIME_MINUTES));
                                       D1_Bias="Daily is Up";
                                       Comment("Bias is: "+D1_Bias+" since: "+TimeToStr(D1_Bar,TIME_DATE|TIME_MINUTES));
                                       }
   
   
   
   ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////   

   H1_low  = iLow(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   if(H1_Bias=="H1 is Up" && H4_Bias=="4 Hour is Up" && D1_Bias=="Daily is Up" && H1_close > CurrentBigFish6)
      {
       
        if(ema21 - H1_low > Point / 2)  // << These parts here?
            {
            PullBack_Bar = Time[1];  // << These parts here?
            }
            if(PullBack_Bar > triggerBarTime)  // << These parts here?
                {
                H1_Buy_Touch = "H1 Buy Touch";
                OrderEntry(0); // Pending order Buy Stop function is called.
                }


  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  
// The other way I write it on the other EA thats works perfectly is:

  ///////////////////////////////////////////////////////////////////////////////////////

   H1_high  = iHigh(NULL, PERIOD_H1, 1);
   H1_close = iClose(NULL, PERIOD_H1, 1);
   H4_close = iClose(NULL, PERIOD_H4, 1);
   D1_close = iClose(NULL, PERIOD_D1, 1);
   
   if(H1_Bias=="Down" && H4_Bias=="4 Hour is Down" && D1_Bias=="Daily is Down" && H1_high >= ema21 && H1_close < CurrentBigFish6)
      {
      H1_Sell_Touch = "H1 Sell Touch";
         {
         OrderEntry(1); // Pending order Sell Stop function is called.
         }
      }
 
DomGilberto:

J'ai donc trouvé la cause de la division par zéro - je n'avais jamais vu cela jusqu'à présent. Je pensais en avoir fini avec mon code jusqu'à ce que cela apparaisse ! J'ai 3 variantes de mon EA. L'une fonctionne parfaitement, les deux autres sont similaires dans ce département (code ci-dessous). Je n'arrive pas à comprendre pourquoi cela provoquerait une division par zéro ?

Cherchez les lignes avec les flèches indiquant les lignes qui posent problème... J'ai isolé ce problème ici ? Soit cela, soit j'obtiens une anomalie avec le backtest AUDUSD (je télécharge mes données historiques à partir de Forex Tester 2... cela semble bien fonctionner avec l'un de mes EA).

Je ne suis pas sûr que vous ayez trouvé le problème... comment savez-vous que vous l'avez trouvé ?

Je ne pense pas que le code que vous avez fléché provoquera une erreur de division par zéro, pour en être certain remplacez ceci....

if(ema21 - H1_low > Point / 2)  // << These parts here?

par ceci...

double HalfAPoint = Point / 2.0;



if(ema21 - H1_low > HalfAPoint) 

et réessayez.

Je pense que votre erreur restera car elle est située ailleurs....

 

Je ne peux localiser qu'un seul problème de subdivision ci-dessus.

La division par zéro ne vient pas de la fonction ci-dessus.

Si vous ne voulez pas montrer tous les codes alors :

Retrouvez tous vos problèmes de division dans ea, custom_indicators et les fichiers inclus.

Assurez-vous que l'expression du côté droit de / ne peut pas être égale à 0.

Ajouté :

Sur une autre note, vous pourriez vraiment bénéficier de ArraySort().

Si vous voulez savoir si Daily_3 est le plus haut/le plus bas, faites un tableau et triez.

 
RaptorUK:

Je ne suis pas sûr que vous ayez trouvé le problème... Comment savez-vous que vous l'avez trouvé ?

Je ne pense pas que le code que vous avez indiqué causera une erreur de division par zéro, pour en être certain, remplacez ceci...

par ceci...

et réessayez.

Je pense que votre erreur restera car elle est située ailleurs...


J'ai les "V1-V2-V3" de mon EA.

J'ai essentiellement copié la V1 sur un nouveau modèle vierge et modifié la partie que j'ai illustrée ci-dessus en (code ci-dessous) et cela m'a donné une erreur de division par zéro pendant un back-test sur AUDUSD. Les données ont-elles quelque chose à voir avec la division par zéro ? Lorsque j'exécute un back-test de toutes les versions de mon EA sur EURUSD de 2001 à 2013 (Forex Tester a téléchargé les données et les a importées dans ST), je n'obtiens aucune erreur sur aucune de mes EA ?

            PullBack_Bar = Time[1];  // << These parts here?
            }
            if(PullBack_Bar > triggerBarTime)  // << These parts here?
                {
                H1_Buy_Touch = "H1 Buy Touch";
                OrderEntry(0); // Pending order Buy Stop function is called.
                }
 
J'ai parcouru d'autres paires et ce problème de division par zéro ne semble pas apparaître, à moins que ce soit sur AUDUSD avec V2 et V3 ? Corrigez-moi si les données n'ont rien à voir avec cela ?
 
DomGilberto:
J'ai parcouru d'autres paires et ce problème de division par zéro ne semble pas apparaître, à moins que ce soit sur AUDUSD avec V2 et V3 ? Corrigez-moi si les données n'ont rien à voir avec cela ?
Si vous avez un code où vous utilisez le prix comme diviseur et que le prix est de 0,0, alors oui, vous pouvez obtenir une erreur de division par zéro à cause du prix...
 
DomGilberto:


J'ai les "V1-V2-V3" de mon EA.

J'ai essentiellement copié la V1 sur un nouveau modèle vierge et modifié la partie que j'ai illustrée ci-dessus en (code ci-dessous) et cela m'a donné une erreur de division par zéro pendant un back-test sur AUDUSD. Les données ont-elles quelque chose à voir avec la division par zéro ? Lorsque j'exécute un back-test de toutes les versions de mon EA sur EURUSD de 2001 à 2013 (données téléchargées par Forex Tester et importées dans ST), je n'obtiens aucune erreur sur aucune de mes EA ?

Avant de modifier le code, vous devez être en mesure de reproduire l'erreur à volonté... Une fois que vous pouvez le faire, vous pouvez l'étudier.
 
DomGilberto: Les données ont-elles un rapport avec la division par zéro ?
Il n'y a pas de lecteurs de pensées ici. Vous ne nous avez pas montré le code avec la division, donc personne ici ne peut vous aider.
 
WHRoeder:
Il n'y a pas de lecteurs de pensées ici. Vous ne nous avez pas montré le code avec la division, donc personne ici ne peut vous aider.

Je n'ai posé qu'une simple question, les données ont-elles quelque chose à voir avec ça ? Si ce n'est pas le cas, alors je comprends mieux la division par zéro grâce aux personnes qui en ont l'expérience... Je ne pensais pas qu'il y avait des lecteurs de pensées ici...

Il y a trop de code pour poster chaque petite division ici. En ce qui me concerne, je pensais avoir isolé le problème à ce que j'ai expliqué ci-dessus, mais apparemment non. C'est juste un peu bizarre de voir que je change une toute petite chose et qu'ensuite ça ne fonctionne pas parce que j'obtiens une division nulle (la petite chose que j'ai changée est ce que j'ai illustré dans le premier post).

@RaptorUK donc essentiellement cela pourrait être une anomalie dans le prix des données pendant mon back-test, dans ce cas, sur l'AUDUSD. C'est juste un peu bizarre que V2 et V3 fonctionnent à peu près 1/4 du chemin sans problème et que tout d'un coup il y ait une division par zéro et que l'EA ne fonctionne plus du tout.

 
DomGilberto:


@RaptorUK donc essentiellement cela pourrait être une anomalie dans le prix des données pendant mon back-test, dans ce cas, sur l'AUDUSD. C'est juste un peu bizarre que V2 et V3 fonctionnent à peu près 1/4 du chemin sans problème et que tout d'un coup il y ait une division par zéro et que l'EA ne fonctionne plus du tout.

Si vous voulez passer des jours à résoudre ce simple problème, alors n'hésitez pas.... Je ne le ferais pas.

Si vous savez quand cela se produit pendant votre back test, alors c'est facile à trouver... commencez le back test un jour avant la date à laquelle cela se produit... trouvez exactement, à la minute près, quand cela va se produire... pour toutes les divisions de votre code... oui, toutes... . oui, toutes, ajoutez un Print() avant la ligne contenant la division qui imprime le diviseur et une référence à la ligne de code en question ... .

Par exemple :

if(d == 0.0) Print("a = c / d - divisor d is " + d );

a = c / d;

Lorsque votre code se termine avec l'erreur de division par zéro, vérifiez le fichier journal et dans les dernières impressions se trouvera l'impression montrant la ligne de code qui a produit l'erreur et quelle variable a été mise à zéro...

... apprenez à travailler plus intelligemment et à traquer vos problèmes de manière logique et efficace.

 
DomGilberto: Tout ce que j'ai demandé était une simple question,
Que personne ici ne peut répondre. Vous êtes paresseux. Vous n'arrêtez pas de poster "est-ce que ça va marcher" ou "qu'est-ce qui ne va pas" mais vous ne fournissez rien de valable.
DomGilberto:
Hey, tu as raison, désolé d'avoir été vague !

Et vous n'apprenez pas - On vous a demandé à plusieurs reprises TOUT le code (pertinent) et vos valeurs de variables. Pourquoi devons-nous encore demander 21 messages plus tard ? Mettez les instructions print dans votre code et obtenez des informations comme quoi et étaient.

Ensuite, si vous ne pouvez toujours pas résoudre votre problème, demandez.

Raison: