Zero Divide (Trovato il problema - ma perché?)

 

Così ho trovato il problema di ciò che sta causando lo zero divide - non ho visto questo prima d'ora. Pensavo di aver finito con il mio codice fino a quando è saltato fuori questo! Ho 3 varianti del mio EA. 1 funziona perfettamente, gli altri due sono simili in questo reparto (codice qui sotto). Non riesco a capire perché questo dovrebbe causare zero divide?

Cerca le linee con le frecce che indicano le linee che causano il problema... L'ho isolato per essere questo problema qui? O questo o sto ottenendo un'anomalia con il backtest di AUDUSD (scarico i miei dati storici da Forex Tester 2... sembra funzionare bene con uno dei miei 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:

Così ho trovato il problema di ciò che sta causando lo zero divide - non ho visto questo prima d'ora. Pensavo di aver finito con il mio codice fino a quando non è saltato fuori questo! Ho 3 varianti del mio EA. 1 funziona perfettamente, gli altri due sono simili in questo reparto (codice qui sotto). Non riesco a capire perché questo dovrebbe causare zero divide?

Cerca le linee con le frecce che indicano le linee che causano il problema... L'ho isolato per essere questo problema qui? O questo o sto ottenendo un'anomalia con il backtest di AUDUSD (scarico i miei dati storici da Forex Tester 2... sembra funzionare bene con uno dei miei EA).

Non sono sicuro che tu abbia trovato il problema... come fai a sapere di averlo trovato?

Non credo che il codice che hai indicato causi un errore di divisione per zero, per essere sicuro sostituisci questo . . .

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

con questo . . .

double HalfAPoint = Point / 2.0;



if(ema21 - H1_low > HalfAPoint) 

e prova di nuovo.

Ho il sospetto che il vostro errore rimarrà come si trova da qualche altra parte . . .

 

Posso individuare solo un problema di /divisione sopra.

Lo zero divide non proviene dalla funzione di cui sopra.

Se non vuoi mostrare tutti i codici allora:

Rintracciate tutti i vostri problemi di divisione all'interno di ea, custom_indicators e file inclusi.

Assicurati che l'espressione sul lato destro di / non possa essere uguale a 0.

Aggiunto:

Su un'altra nota, potresti davvero beneficiare di ArraySort().

Se vuoi sapere se Daily_3 è il più alto/basso, crea un array e ordina.

 
RaptorUK:

Non sono sicuro che tu abbia trovato il problema... come fai a sapere di averlo trovato?

Non credo che il codice che hai indicato causerà un errore di divisione per zero, per essere sicuro sostituisci questo . . .

con questo . . .

e riprova.

Ho il sospetto che il tuo errore rimarrà in quanto si trova da qualche altra parte . . .


Ho "V1-V2-V3" del mio EA.

Ho essenzialmente copiato la V1 su un nuovo modello vuoto e ho cambiato la parte che ho illustrato sopra in (sotto il codice) e mi ha dato un errore di divisione dello zero durante un back-test su AUDUSD. I dati hanno qualcosa a che fare con lo zero divide? Quando eseguo un back-test di tutte le versioni del mio EA su EURUSD dal 2001-2013 (Forex Tester ha scaricato i dati e importato in ST), non ottengo alcun errore su nessuno dei miei 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.
                }
 
Ho appena eseguito attraverso altre coppie e questo problema di divisione dello zero non sembra essere mostrato a meno che non sia su AUDUSD con V2 e V3? Mi corregga se i dati non hanno nulla a che fare con questo?
 
DomGilberto:
Ho appena eseguito attraverso altre coppie e questo problema di divisione dello zero non sembra essere mostrato a meno che non sia su AUDUSD con V2 e V3? Mi corregga se i dati non hanno nulla a che fare con questo?
Se hai un codice dove usi il prezzo come divisore e il prezzo è 0.0 allora sì, puoi ottenere un errore di divisione per zero a causa del prezzo.
 
DomGilberto:


Ho "V1-V2-V3" del mio EA.

Ho essenzialmente copiato la V1 in un nuovo modello vuoto e ho cambiato la parte che ho illustrato sopra in (sotto il codice) e mi ha dato un errore di divisione dello zero durante un back-test su AUDUSD. I dati hanno qualcosa a che fare con lo zero divide? Quando eseguo un back-test di tutte le versioni del mio EA su EURUSD dal 2001-2013 (Forex Tester ha scaricato i dati e importato in ST), non ottengo alcun errore su nessuno dei miei EA?

Prima di andare a cambiare il codice è necessario essere in grado di riprodurre l'errore a piacimento... una volta che si può fare questo allora si può indagare.
 
DomGilberto: I dati hanno qualcosa a che fare con lo zero divide?
Non ci sono lettori del pensiero qui. Non ci hai mostrato il codice con la divisione, quindi nessuno qui può aiutarti.
 
WHRoeder:
Non ci sono lettori del pensiero qui. Non ci hai mostrato il codice con la divisione, quindi nessuno qui può aiutarti.

Ho solo fatto una semplice domanda: i dati c'entrano qualcosa? Se no, allora capisco di più sullo zero divide da persone che hanno esperienza con esso... Non pensavo che ci fossero lettori del pensiero qui...

C'è troppo codice per postare ogni piccola divisione qui dentro. Per quanto mi riguarda pensavo di aver isolato il problema a ciò che ho spiegato sopra, ma a quanto pare no. È solo un po' strano come cambio una piccola cosa e poi non funziona perché ottengo zero divisioni (la piccola cosa che ho cambiato è quella che ho illustrato nel primo post).

@RaptorUK così essenzialmente potrebbe essere un'anomalia nel prezzo dei dati durante il mio back-test, in tal caso, sull'AUDUSD. È solo un po' strano che la V2 e la V3 funzionino per circa 1/4 del tempo senza problemi e poi all'improvviso si verifica uno zero diviso e l'EA non funziona più.

 
DomGilberto:


@RaptorUK così essenzialmente potrebbe essere un'anomalia nel prezzo dei dati durante il mio back-test, nel qual caso, sul AUDUSD. È solo un po' strano che la V2 e la V3 funzionino per circa 1/4 del tempo senza problemi e poi all'improvviso si verifica uno zero e l'EA non funziona più.

Se vuoi passare giorni a risolvere questo semplice problema, allora sentiti libero di farlo. Io non lo farei.

Se sai quando succede durante il tuo back test, allora è facile da trovare... inizia il back test un giorno prima della data in cui succede... scopri esattamente, al minuto, quando succederà... per tutte le divisioni nel tuo codice. . . sì, tutte, aggiungete una Print() prima della linea che contiene la divisione che stampa il divisore e un riferimento alla linea di codice in questione . . .

Per esempio:

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

a = c / d;

Quando il vostro codice termina con l'errore di divisione per zero controllate il file di log e nelle ultime stampe ci sarà la stampa che mostra la linea di codice che ha prodotto l'errore e quale variabile è stata impostata a zero . . .

. . . imparate a lavorare in modo più intelligente e cacciate i vostri problemi in modo logico ed efficiente.

 
DomGilberto: Ho solo chiesto una semplice domanda,
Che nessuno qui può rispondere. Sei pigro. Continui a postare "funzionerà" o "cosa c'è che non va" ma non fornisci nulla di utile.
DomGilberto:
Ehi, hai ragione, scusa se sono stato vago!

E tu non impari - Ti è stato ripetutamente chiesto TUTTO il codice (rilevante) e i tuoi valori variabili. Perché dobbiamo ancora chiederlo 21 post dopo? Metti le dichiarazioni di stampa nel tuo codice e ottieni alcune informazioni come cosa e dove.

Poi se ancora non riesci a risolvere il tuo problema, chiedi.