Uma divisão por erro zero apareceu em um indicador - página 4

 

limite no código, se 1/2=0,5 então aparentemente o arredondamento agora dá 0 em vez de 1?

Para testar a hipótese eu alterei o código

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

Lixo total - conseguiu divisão por erro zero novamente

Código de ME como imagem - talvez eu seja cego, mas não entendo o que está acontecendo

O erro ainda se encontra na mesma linha.

O arquivo é o mesmo, pois a linha de erro foi deslocada devido à adição de código para a impressão.

Você deve usarum modelador - você verá imediatamente que sua cadeia de problemas NÃO está dentro da área de verificação se(limite==0)

 
Vladimir Karputov:

Você deve usarum modelador - você verá imediatamente que sua cadeia de problemas NÃO está na zona de verificação se(limit==0)

Então não precisa entrar, por quê?

 

Este código.

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

Pendurar o terminal.

 
Aleksey Vyazmikin:

limite no código, se 1/2=0,5 então aparentemente o arredondamento agora dá 0 em vez de 1?

Para testar a hipótese eu alterei o código

Código:

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


Resultado:

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:

Código:


Resultado:

A questão é essa, e antes aparentemente 1/2 deu um 1, não um zero.

 
Aleksey Vyazmikin:

A questão é essa, e antes, 1/2 deve ter sido um 1 em vez de um zero.

Não. É sempre assim arredondado.

 
Vladimir Karputov:

Não. É sempre assim que se completa.

Então, afinal de contas, é outra coisa...

 

Mudou o código para a impressão

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

e agora eu tenho...

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

Como assim?

 
Aleksey Vyazmikin:

Mudou o código para a impressão

e agora eu tenho...

Como assim?

Tudo está correto. Se o limite for calculado usando a fórmulalimit=(int)(stop_time-start_time)/PeriodSeconds(_Period);

então o resultado será = 0.

Agora precisamos ver como são formados os tempos de parada e partida.

Razão: