Análogo a iBarShift - página 11

 
Nikolai Semko:

Sí, bueno, en realidad es un comportamiento extraño para una función estándar. Al fin y al cabo, se trata exactamente de ajustar los valores a su "punto de referencia".

La función estándar iBarShift de MQL4, cuando la hora solicitada cae en un hueco, devuelve el número de compás de la izquierda (es decir, el sábado en este caso), e iBarShift3 devuelve el número de compás de la derecha del hueco (es decir, el lunes), lo que tiene más sentido.

Si estamos en el agujero, es lógico que se devuelva la barra de la izquierda, el último valor conocido, pero no el futuro.

 
Vitaly Muzichenko:

Si estamos en un agujero, es lógico que se devuelva la barra izquierda, el último valor conocido, pero no el futuro.

Cierto, lo que digo no tiene sentido. He confundido el pasado con el futuro). Probablemente porque 1 (pasado) > 0 (futuro). Programado.
 
Alain Verleyen:


En la mayoría de los casos esta función devuelve un resultado erróneo

PD: ¿Es necesario publicar la versión en inglés o la traducción al ruso es correcta?

Sí, la traducción es correcta.

Ejecute este script y verá que las funciones producen exactamente el mismo resultado.

¿Puede dar un ejemplo de un marco temporal y el momento en que los valores de estas funciones son diferentes?

Por cierto, su función suele ser errónea. Devuelve el valor -1

2018.04.04 22:51:05.666 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:46.867 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:46:00
2018.04.04 22:50:41.255 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:50:23.496 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:45:00
2018.04.04 22:50:05.596 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
2018.04.04 22:48:38.638 TestBarShift2 AUDUSD,M5: BarShiftX  PERIOD_M1   0   -1    2018.04.05 05:47:00
Archivos adjuntos:
 
Alain Verleyen:

El requisito es tener SOLO una versión de mql4


Su función no funciona correctamente con el parámetro exact=true.

Esto se puede ver en este guión.

Y aquí está un análogo de trabajo completo de la función iBarShift con el parámetro exacto:

int iBarShift1(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

Sin este parámetro se puede simplificar a esta forma:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
Archivos adjuntos:
 
Nikolai Semko:

Sí, la traducción es correcta.

Ejecute este script y verá que las funciones producen exactamente el mismo resultado.

¿Puede dar un ejemplo de un marco temporal y el momento en que los valores de estas funciones son diferentes?

Por cierto, su función suele ser errónea. Devuelve el valor -1

Por favor, sea serio. Mi código es para mql5.

Devuelve -1 porque la función Bars() no es fiable en MT4.

...   
   int shift=Bars(symbol,timeframe,time,LastBAR);

   datetime checkcandle[1];

   if(CopyTime(symbol,timeframe,time,1,checkcandle)==1)
     {
      if(checkcandle[0]==time)
         return(shift-1);
      else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe))
         return(-1);
      else
         return(shift);
     }
...

Script ejecutado en AUDUSD, gráfico M5.

Esto no ocurre con MT5.

 
Alain Verleyen:

Por favor, sea serio. Mi código es para mql5.

Devuelve -1 porque la función Bars() no es fiable en MT4.

Script ejecutado en AUDUSD, gráfico M5.

Esto no ocurre con MT5.

Has dicho que debería funcionar como en MQL4.

Pero este script también se puede ejecutar en MQL5

2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M3  BarShift1 = -1  BarShift2 = 0    2018.08.10 18:39:49   exact = true
2018.04.05 09:52:40.760 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.04.15 00:25:08   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M6  BarShift1 = -1  BarShift2 = 0    2018.04.21 04:26:03   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M15  BarShift1 = -1  BarShift2 = 0    2018.05.29 17:10:52   exact = true
2018.04.05 09:52:40.761 TestBarShift2 (EURUSD,M12)      PERIOD_M12  BarShift1 = -1  BarShift2 = 0    2018.09.16 13:10:33   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.09.25 21:24:50   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M10  BarShift1 = -1  BarShift2 = 0    2018.05.30 20:04:10   exact = true
2018.04.05 09:52:40.762 TestBarShift2 (EURUSD,M12)      PERIOD_M5  BarShift1 = -1  BarShift2 = 0    2018.04.29 16:12:16   exact = true

Si exact=True y tiempo futuro hay que devolver -1.

También mi script ha encontrado un extraño error:

Este error se confirma con esta comprobación:

Print (iBarShift2(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // -1
Print (iBarShift1(_Symbol,PERIOD_MN1,D'2015.12.31 21:03:54',true)); // 28
Así que tenía razón sobre laexistencia de situaciones anormales en su algoritmo después de todo.
Archivos adjuntos:
 

De todo el análisis que he hecho, podemos concluir que este análogo completo del iBarShift:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   int Res=Bars(Symb,TimeFrame,time+1,UINT_MAX);
   if(exact) if((TimeFrame!=PERIOD_MN1 || time>TimeCurrent()) && Res==Bars(Symb,TimeFrame,time-PeriodSeconds(TimeFrame)+1,UINT_MAX)) return(-1);
   return(Res);
  }

es, con mucho, la más correcta y, al mismo tiempo, la más rápida y con el algoritmo más sencillo y corto.

Si no necesita el parámetro exacto, puede utilizar la versión simplificada:

int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   return(Bars(Symb,TimeFrame,time+1,UINT_MAX));
  }

o simplemente utilizar esta versión equivalente sin llamar a la función:

Bars(Symb,TimeFrame,time+1,UINT_MAX);
¿O me equivoco?
 
El silencio es una señal de acuerdo.
 
Nikolai Semko:
El silencio es una señal de acuerdo.

A través de CTRL+SHIFT+F en ME hice una búsqueda de "BarShift". Resulta que no uso una función similar. Al parecer, yo no lo necesitaba.

Una vez escribió una variante para convertir los EAs de MT4 a MT5 en una línea. Parece ser la única razón para escribirlo.

No trabajo con bares y no entiendo por qué los demás no hacen lo mismo.

No se metió en su código. Pero siempre se alegra cuando se obtiene una solución rápida.

 
fxsaber:

A través de CTRL+SHIFT+F en ME hice una búsqueda de "BarShift". Resulta que no uso una función similar. Al parecer, yo no lo necesitaba.

Una vez escribió una variante para convertir los EAs de MT4 a MT5 en una línea. Parece ser la única razón para escribirlo.

No trabajo con bares y no entiendo por qué los demás no hacen lo mismo.

No se ha metido en su código. Pero siempre se alegra cuando se obtiene una solución rápida.

Entiendo lo que quieres decir, pero trabajar con barras sigue siendo urgente para mí. Quizás algún día se convierta en un rudimento para mí también.

Razón de la queja: