Bibliotecas: iBarShift - página 3

 
angevoyageur:

Gracias, tengo que arreglar mi código también cuando exact es true, ya que entendí mal este parámetro. Documentación en Inglés para iBarShift está mal.

Creo que este es mi error también, iBarShift debe devolver la barra que contiene el tiempo especificado (no con el tiempo exacto de apertura).

¿Podría utilizar su función en mi biblioteca (con sus derechos de autor, por supuesto)? Si es más rápido y correcto, ¿por qué debería reinventar la rueda)?

 
komposter:

Creo que este es mi error también, iBarShift debe devolver la barra que contiene el tiempo especificado (no con el tiempo exacto de apertura).

¿Podría utilizar su función en mi biblioteca (con sus derechos de autor, por supuesto)? Si es más rápido y correcto, ¿por qué debería reinventar la rueda)?

Por supuesto.
 
Se ha publicado el código corregido, teniendo bien en cuenta el parámetro "exacto".
 
angevoyageur:

Gracias, tengo que arreglar mi código también cuando exact es true, ya que entendí mal este parámetro. La documentación en inglés de iBarShift es incorrecta.

El error mql5 está en la función Bars(), lo he reportado al Service Desk.

Parece que el error de Bars() se ha corregido en la versión 880.
 
La compilación 880 ha corregido el error en Bars(), y todo funciona bien ahora.
 
angevoyageur:
La compilación 880 ha corregido el error en Bars(), y todo funciona bien ahora.
 

en m2 con m1 los valores en trudy, por alguna razon tienen valores no -1, y en barra cero hay un retorno a la barra 1.

 

La función está torcida en al menos dos sitios:

1) if(time>LastBar)

return(0);

Si exact=true, la lógica debería devolver -1 en caso de que el tiempo no pertenezca explícitamente a la última barra, es decir, si time>LastBar+PeriodSeconds(timeframe).

2) if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)

...

return(-1);

De nuevo, si exact=false, se devolverá la barra más cercana, en este caso Bars(symbol,timeframe)-1.

 

Creo que hay un pequeño error en tu código:

//--- si tiempo > LastBar siempre devolvemos 0
   if(time>LastBar)
      return(0);

Si el último tick 'abre' una nueva barra entonces if(time>LastBar) se convierte en falso - porque ahora time == LastBar

Y más tarde aterrizamos aquí

 if(checkcandle[0]==time)
         return(shift-1);

¡Y ahora shift == 0 que devuelve -1 en vez de 0!

Así que creo que esto

//--- si tiempo > LastBar siempre devolvemos 0
   if(time>LastBar)
      return(0);

debería cambiarse a

//--- si tiempo > LastBar siempre devolvemos 0
   if(time>=LastBar)
      return(0);

Calli

 
Carl Schreiber:

Creo que hay un pequeño error en tu código:

Si el último tick 'abre' una nueva barra entonces if(time>LastBar) se convierte en falso - porque ahora time == LastBar

¿No estoy seguro de lo que quieres decir? Creo que 'último tick' es irrelevante. Cuando usas la función time=LastBar o no.

Y mas tarde aterrizamos aqui:

¡Y ahora shift == 0 que devuelve -1 en vez de 0!

si time==Lastbar entonces shift=1 y no 0. Así que no hay ningún bug (shift viene de Bars() que es la cuenta de barras, por eso devolvemos 'shift-1').

Así que creo que esto

debería cambiarse por

Calli

Tu corrección también funcionaría, pero el caso 'time==LastBar' se procesa como un caso "normal".

La declaración

 if(time>LastBar)

se añadió como corrección de errores si el tiempo es mayor que el tiempo de la barra 0 actual.