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

 
Sergey Savinkin:

¿Y por qué van a ser redondos si primero se hacen CopyRates de timeframe por hora (se obtienen los números redondos), luego se pasa al procedimientoCreateFigure la hora del timeframe actual (time, que se convierte en Time), y luego se busca el índice por el timeframe actual?start_index=ArrayBsearch(Time,start_time);

Así es, estamos buscando un tiempo redondo en un tiempo no redondo en la matriz... Es decir, buscando una barra en un marco temporal de minutos en el que la hora corresponda a la apertura de la hora.

 
¡О!
 
Алексей Тарабанов:
¡О!

¡Las emociones son buenas!

Pero tal vez haya algunas reflexiones de fondo...

 

Esto es lo que pasa con el tiempo, por ejemplo: he añadido dos variables para ahorrar tiempo

void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[])
  {
   datetime start_time=rates[i].time;
   datetime stop_time=(start_time+PeriodSeconds(TimeFrames));
   datetime start_timeA=start_time;
   
//---
   int start_index,stop_index,limit;
   datetime vertical_line_time;
//---
   start_index=ArrayBsearch(Time,start_time);
   datetime start_timeB=Time[start_index];   
   if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index);
   start_time=Time[start_index];
   Print("start_timeA=", start_timeA, " start_timeB=",start_timeB," start_time=",start_time);

Obtenemos una impresión como esta

2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 12:00:00 start_timeB=2018.07.04 12:00:00 start_time=2018.07.04 12:00:00
2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 13:00:00 start_timeB=2018.07.04 13:00:00 start_time=2018.07.04 13:00:00
2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 14:00:00 start_timeB=2018.07.04 13:59:00 start_time=2018.07.04 14:05:00
2018.07.05 00:39:30.465 IndDrafter_Test (Si-9.18,M1)    start_timeA=2018.07.04 15:00:00 start_timeB=2018.07.04 15:00:00 start_time=2018.07.04 15:00:00

Es decir, como si en una situación normal/estacionaria todo fuera correcto.

Puede ver que a las 14:00 hay una corrección de la hora de apertura de la barra en el minuto TF a las 14:05 - hora real de la aparición de la primera barra en el TF M1.
 
Aleksey Vyazmikin:

¡Las emociones son buenas!

Pero tal vez haya algunas reflexiones de fondo...

La hora es la misma, así que límite=0. Quería hacerlo yo mismo.

 
Алексей Тарабанов:

La hora es la misma, así que límite=0. Quería hacerlo yo mismo.

¿Y qué pasa si la hora es la misma? Al fin y al cabo, ¡hay 60 compases en esta hora en la TF M1!

Y en caso de coincidencia de la TF actual y la calculada hay una protección y no habrá divisiones por cero en esta situación

if(_Period>=TimeFrames) return(0);
 
Dormir
 
Алексей Тарабанов:
Dormir

¿Te estás escondiendo?

 
Dormir
 
Алексей Тарабанов:
Dormir

???