Apareció un error de división por cero en un indicador - página 4

 

límite en el código, si 1/2=0,5 entonces aparentemente el redondeo da ahora 0 en lugar de 1?

Para comprobar la hipótesis he cambiado el 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:

Basura total - Tengo error de división por cero otra vez

Código de ME como imagen - tal vez estoy ciego pero no entiendo lo que está pasando

El error sigue en la misma línea.

El archivo es el mismo, ya que la línea de error se ha desplazado debido a la adición de código para la impresión.

Debería usarun estilizador - vería inmediatamente que su cadena problemática NO está dentro de la zona de control if(limit==0)

 
Vladimir Karputov:

Debería utilizarun estilizador - vería inmediatamente que su cadena problemática NO está en la zona de comprobación if(limit==0)

Así que no necesita entrar, ¿por qué?

 

Este código.

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

Colgando el terminal.

 
Aleksey Vyazmikin:

límite en el código, si 1/2=0,5 entonces aparentemente el redondeo da ahora 0 en lugar de 1?

Para comprobar la hipótesis he cambiado el 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:

Esa es la cuestión, y antes aparentemente 1/2 dio 1, no cero.

 
Aleksey Vyazmikin:

Esa es la cuestión, y antes, 1/2 debía ser un 1 en lugar de un cero.

No. Siempre se redondea así.

 
Vladimir Karputov:

No. Siempre se redondea así.

Así que es algo más después de todo...

 

Cambiado el código de la impresión

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

y ahora tengo...

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

¿Por qué?

 
Aleksey Vyazmikin:

Cambiado el código de la impresión

y ahora tengo...

¿Cómo es eso?

Todo es correcto. Si el límite se calcula con la fórmulalímite=(int)(tiempo_de_parada-hora_de_inicio)/PeriodoSegundos(_Periodo);

entonces el resultado será = 0.

Ahora tenemos que ver cómo se forman los tiempos de parada y arranque.