Zero Divide (Encontrado el tema - pero ¿por qué?)

 

Así que he encontrado el problema de lo que está causando la división cero - No he visto esto antes hasta ahora. ¡Pensé que había terminado con mi código hasta que esto apareció! Tengo 3 variaciones de mi EA. 1 funciona sin problemas, los otros dos son similares en este departamento (código de abajo). No puedo entender por qué esto sería la causa de la división de cero?

Busque las líneas con las flechas que indican las líneas que están causando el problema... He aislado este problema aquí. O eso o estoy recibiendo una anomalía con AUDUSD backtest (descargo mis datos históricos de Forex Tester 2... parece que funciona con uno de mis EA's bien).

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//| 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:

Así que he encontrado la cuestión de lo que está causando cero dividir - No he visto esto antes hasta ahora. ¡Pensé que había terminado con mi código hasta que esto apareció! Tengo 3 variaciones de mi EA. 1 funciona sin problemas, los otros dos son similares en este departamento (código de abajo). No puedo entender por qué esto sería la causa de la división de cero?

Busque las líneas con las flechas que indican las líneas que están causando el problema... He aislado este problema aquí. O eso o estoy recibiendo una anomalía con AUDUSD backtest (descargo mis datos históricos de Forex Tester 2... parece que funciona con uno de mis EA's bien).

No estoy seguro de que hayas encontrado el problema... ¿cómo sabes que lo has hecho?

No creo que el código que ha arrowed causará un error de división por cero, para estar seguro de reemplazar este .

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

por esto. . .

double HalfAPoint = Point / 2.0;



if(ema21 - H1_low > HalfAPoint) 

y prueba de nuevo.

Sospecho que su error se mantendrá ya que se encuentra en otro lugar. . .

 

Sólo puedo localizar un problema de /división arriba.

La división de cero no viene de la función anterior.

Si no quieres mostrar todos los códigos entonces:

Localice todos sus problemas de división dentro de ea, custom_indicators y archivos incluidos.

Asegúrese de que la expresión del lado derecho de / no puede ser igual a 0.

Añadido:

En otra nota, usted podría realmente beneficiarse de ArraySort().

Si quieres saber si Daily_3 es el más alto/más bajo, haz un array y ordénalo.

 
RaptorUK:

No estoy seguro de que hayas encontrado el problema... ¿cómo sabes que lo has hecho?

No creo que el código que has marcado cause un error de división por cero, para estar seguro sustituye esto...

por esto. . .

y prueba de nuevo.

Sospecho que su error se mantendrá ya que se encuentra en otro lugar...


Tengo "V1-V2-V3" de mi EA.

Esencialmente copié sobre V1 a una nueva plantilla en blanco y cambié la parte que ilustré arriba sobre (código de abajo) y me dio un error de división cero durante una prueba de espalda en AUDUSD. ¿Los datos tienen algo que ver con la división a cero? Cuando ejecuto una prueba retrospectiva de todas las versiones de mi EA en EURUSD desde 2001-2013 (datos descargados por Forex Tester e importados en ST), no obtengo ningún error en ninguno de mis 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.
                }
 
Estoy corriendo a través de otros pares y este problema de división cero no parece estar apareciendo a menos que su en AUDUSD con V2 y V3? Corríjanme si los datos no tienen nada que ver con esto.
 
DomGilberto:
Sólo estoy corriendo a través de otros pares y este problema de división cero no parece estar apareciendo a menos que su en AUDUSD con V2 y V3? Corríjanme si los datos no tienen nada que ver con esto.
Si usted tiene el código donde se utiliza el precio como el divisor y el precio es 0,0, entonces sí se puede obtener un error de división por cero a causa del precio....
 
DomGilberto:


Tengo "V1-V2-V3" de mi EA.

Esencialmente copié sobre V1 a una nueva plantilla en blanco y cambié la parte que ilustré arriba sobre (código de abajo) y me dio un error de división cero durante una prueba de espalda en AUDUSD. ¿Los datos tienen algo que ver con la división a cero? Cuando ejecuto una prueba retrospectiva de todas las versiones de mi EA en EURUSD desde 2001-2013 (datos descargados por Forex Tester e importados en ST), no obtengo ningún error en ninguno de mis EA.

Antes de ir a cambiar el código que necesita para ser capaz de reproducir el error a voluntad ... una vez que usted puede hacer que entonces usted puede investigar.
 
DomGilberto: ¿Los datos tienen algo que ver con la división en cero?
Aquí no hay lectores de mente. No nos has mostrado el código con la división, así que nadie aquí puede ayudarte.
 
WHRoeder:
No hay lectores de la mente aquí. Usted no nos ha mostrado el código con la división, por lo que nadie aquí puede ayudarle.

Todo lo que pregunté fue una simple pregunta, ¿los datos tienen algo que ver? Si no es así, entiendo más sobre la división cero de las personas que tienen experiencia con ella ... No pensé que había lectores de la mente aquí ...

Hay demasiado código como para postear aquí cada pequeña división. Por mi parte creía que había aislado el tema a lo que expliqué arriba, pero por lo visto no. Es que es un poco raro que cambie una cosita y luego no funcione porque me sale la división cero (la cosita que cambié es la que ilustré en el primer post).

@RaptorUK así que esencialmente podría ser una anomalía en el precio de los datos durante mi prueba de espalda, en cuyo caso, en el AUDUSD. Sólo un poco extraño que V2 y V3 se ejecutan alrededor de 1/4 del camino sin problemas y luego, de repente, golpea una división de cero y se detiene la EA de trabajar todos juntos.

 
DomGilberto:


@RaptorUK así que esencialmente podría ser una anomalía en el precio de los datos durante mi prueba de espalda, en cuyo caso, en el AUDUSD. Sólo un poco extraño que V2 y V3 ejecutar alrededor de 1/4 del camino a través de forma impecable y luego de repente golpea una división de cero y se detiene la EA de trabajar todos juntos.

Si usted quiere pasar días la clasificación de este simple problema, entonces por todos los medios se sienten libres ... . Yo no lo haría.

Si usted sabe cuando sucede durante su prueba de espalda, entonces es fácil de encontrar ... iniciar la prueba de espalda un día antes de la fecha en que sucede ... averiguar exactamente, al minuto, cuando va a suceder ... para todas las divisiones en su código . . sí, todas ellas, añada un Print() antes de la línea que contiene la división que imprime el divisor y una referencia a la línea de código en cuestión .

Por ejemplo:

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

a = c / d;

Cuando tu código termine con el error de dividir por cero revisa el archivo de registro y en las últimas impresiones estará la impresión que muestra la línea de código que produjo el error y qué variable se puso a cero. . .

. . aprende a trabajar de forma más inteligente y a cazar tus problemas de forma lógica y eficiente.

 
DomGilberto: Todo lo que pedí fue una simple pregunta,
Que aquí nadie puede responder. Eres un vago. No dejas de postear "¿funcionará esto?" o "¿qué falla?" pero sin aportar nada de valor.
DomGilberto:
Tienes razón, ¡perdón por ser tan vago!

Y no aprendes - Se te ha pedido repetidamente TODO el código (relevante) y tus valores de las variables. ¿Por qué todavía tenemos que preguntar 21 posts después? Pon las sentencias print en tu código y obtén algo de información como qué y fueron.

Luego si sigues sin poder solucionar tu problema, pregunta.

Razón de la queja: