Zero Divide (Encontrou a questão - mas por quê?)

 

Assim, encontrei a questão do que está causando a divisão zero - não tinha visto isto até agora. Pensei que tinha terminado com meu código até que isto apareceu! Tenho 3 variações do meu EA. 1 funciona sem falhas, as outras duas são semelhantes neste departamento (código abaixo). Não consigo entender por que isto estaria causando uma divisão zero?

Procure as linhas com as Setas indicando as linhas que estão causando problemas... Eu o isolei para ser este problema aqui? Ou isso ou estou recebendo uma anomalia com o AUDUSD backtest (eu faço o download de meus dados históricos no Forex Tester 2... parece funcionar com uma das minhas multas do 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:

Assim, encontrei a questão do que está causando a divisão zero - não tinha visto isto até agora. Pensei que tinha terminado com meu código até que isto apareceu! Tenho 3 variações do meu EA. 1 funciona sem falhas, as outras duas são semelhantes neste departamento (código abaixo). Não consigo entender por que isto estaria causando uma divisão zero?

Procure as linhas com as Setas indicando as linhas que estão causando problemas... Eu o isolei para ser este problema aqui? Ou isso ou estou recebendo uma anomalia com o AUDUSD backtest (eu faço o download de meus dados históricos no Forex Tester 2... parece funcionar com uma das minhas multas do EA).

Não tenho certeza se você encontrou o problema ... como você sabe que tem ?

Não acho que o código que você tem seta causará uma divisão por erro zero, para ter certeza de que substituirá isto ...

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

com isto . . .

double HalfAPoint = Point / 2.0;



if(ema21 - H1_low > HalfAPoint) 

e tente novamente.

Suspeito que seu erro permanecerá como está localizado em outro lugar ...

 

Eu só posso localizar um /divisão acima.

A divisão zero não vem da função acima.

Se você não quiser mostrar todos os códigos, então:

Rastreie todos os seus problemas de divisão dentro de ea, indicadores_indicadores personalizados e arquivos incluídos.

Certifique-se de que a expressão no lado_direito de / não pode ser igual a 0.

Adicionado:

Em outra nota, você pode realmente se beneficiar do ArraySort().

Se você quiser saber se o Daily_3 é mais alto/mais baixo, faça array e classifique.

 
RaptorUK:

Não tenho certeza se você encontrou o problema . . . como você sabe que tem ?

Acho que o código que você tem não vai causar uma divisão por erro zero, para ter certeza de que vai substituir isto . .

com isto . . .

e tente novamente.

Suspeito que seu erro permanecerá, pois está localizado em outro lugar . .


Tenho o "V1-V2-V3" de minha EA.

Essencialmente copiei sobre o V1 para um novo modelo em branco e mudei a parte que ilustrei acima para (abaixo do código) e isso me deu um erro de divisão zero durante um back-teste no AUDUSD. Os dados têm alguma coisa a ver com a divisão zero? Quando eu faço um back-test de toda a versão do meu EA no EURUSD de 2001-2013 (Testador Forex baixado e importado no ST), eu não recebo nenhum erro em nenhum dos meus 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.
                }
 
Estou apenas passando por outros pares e este problema de divisão zero não parece estar aparecendo a menos que esteja em AUDUSD com V2 e V3? Corrija-me se os dados não têm nada a ver com isso...
 
DomGilberto:
Estou apenas passando por outros pares e este problema de divisão zero não parece estar aparecendo a menos que esteja em AUDUSD com V2 e V3? Corrija-me se os dados não têm nada a ver com isso...
Se você tem código onde você usa o preço como divisor e o preço é 0,0 então sim você pode obter uma divisão por erro zero por causa do preço . .
 
DomGilberto:


Tenho o "V1-V2-V3" de minha EA.

Essencialmente copiei sobre o V1 para um novo modelo em branco e mudei a parte que ilustrei acima para (abaixo do código) e isso me deu um erro de divisão zero durante um back-teste no AUDUSD. Os dados têm alguma coisa a ver com a divisão zero? Quando eu faço um back-test de toda a versão do meu EA no EURUSD de 2001-2013 (Testador Forex baixado e importado no ST), eu não recebo nenhum erro em nenhum dos meus EA?

Antes de ir alterar o código, você precisa ser capaz de reproduzir o erro à vontade ... uma vez que você possa fazer isso, então você pode investigá-lo.
 
DomGilberto: Os dados têm alguma coisa a ver com a divisão zero?
Não há leitores de mentes aqui. Você não nos mostrou o código com a divisão, portanto ninguém aqui pode ajudá-lo.
 
WHRoeder:
Não há leitores de mente aqui. Você não nos mostrou o código com a divisão, então ninguém aqui pode ajudá-lo.

Tudo que eu fiz foi uma simples pergunta, os dados têm alguma coisa a ver com isso? Se não, então entendo mais sobre a divisão zero de pessoas que têm experiência com isso. Não pensei que houvesse leitores de mentes aqui...

Há muito código para colocar cada pequena divisão aqui. No que me dizia respeito, pensei ter isolado a questão do que expliquei acima, mas aparentemente não. É apenas um pouco estranho como mudo uma coisinha e depois não funciona porque fico sem divisão (a coisinha que mudei foi o que ilustrei no primeiro post).

@RaptorUK tão essencialmente poderia ser uma anomalia no preço dos dados durante meu back-test, neste caso, no AUDUSD. Só um pouco estranho que o V2 e o V3 corram cerca de 1/4 do caminho sem falhas e então, de repente, atinge uma divisão zero e impede o EA de trabalhar todos juntos.

 
DomGilberto:


@RaptorUK tão essencialmente poderia ser uma anomalia no preço dos dados durante meu back-test, neste caso, no AUDUSD. Um pouco estranho que o V2 e o V3 passem por cerca de 1/4 do caminho sem falhas e, de repente, atinge uma divisão zero e impede o EA de trabalhar todos juntos.

Se você quiser passar dias ordenando esta simples questão, por todos os meios, sinta-se livre . . . Eu não o faria.

Se você sabe quando isso acontece durante seu teste de costas, então é fácil encontrar . . . iniciar o teste de costas um dia antes da data em que ele acontece . . . descobrir exatamente, até o minuto, quando isso vai acontecer . . para todas as divisões em seu código . . sim, todas elas, acrescente uma impressão () antes da linha contendo a divisão que imprime o divisor e uma referência à linha de código em questão . .

Por exemplo:

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

a = c / d;

Quando seu código terminar com a divisão por erro zero, verifique o arquivo de log e nas últimas impressões será a impressão mostrando a linha de código que produziu o erro e qual variável foi definida como zero . .

. . aprenda a trabalhar de forma mais inteligente e a caçar seus problemas de forma lógica e eficiente.

 
DomGilberto: Tudo o que eu perguntei foi uma pergunta simples,
Que ninguém aqui pode responder. Você é preguiçoso. Você continua postando "isto vai funcionar" ou "o que está errado", mas não fornecendo nada de valor.
DomGilberto:
Ei, você está certo, desculpe por ser vago!

E você não aprende - Você tem sido repetidamente solicitado por TODO o código (relevante) e seus valores variáveis. Por que ainda temos que perguntar 21 mensagens mais tarde? Coloque as declarações impressas em seu código e obtenha algumas informações como o que e o que foram.

Então, se você ainda não consegue resolver seu problema, pergunte.

Razão: