Análogo a iBarShift - página 9

 
Alain Verleyen:

¿Qué problema ha encontrado?

Aquí hay un ejemplo de su función que funciona falsamente bajo el nombre "BarShift1"


 
Aleksey Vyazmikin :

Aquí hay un ejemplo de su función que funciona falsamente - funciona bajo el nombre "BarShift1"


En realidad sólo muestra lo contrario, mi versión es la única que es correcta. (Y el iBarShift1 original de este código es correcto).

Mi versión fue diseñada como una función independiente, al igual que mql4 iBarShift.

No está optimizado para consultas múltiples, por lo que la comparación de tiempos es irrelevante. @nicholishen publicó una buena biblioteca optimizada para la llamada masiva.


En realidad muestra justo lo contrario, mi versión es la única que es correcta. (También el iBarShift1 original de este código es correcto).

Mi versión fue concebida para ser utilizada como una función independiente, exactamente como mql4 iBarShift.

No está optimizado para múltiples peticiones, por lo que la comparación de tiempos es irrelevante. @nicholishen publicó una buena biblioteca optimizada para la llamada masiva.

iBarShift
iBarShift
  • votos: 46
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4 (например, 1,2,3). В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки. В качестве альтернативы многие программисты предложили свои варианты реализации этой функции на MQL5. Обнаружилось, что все 4 версии содержат ошибки (не воспроизводят в точности работу...
 
Alain Verleyen:

De hecho sólo muestra lo contrario, mi versión es la única correcta. (Y el iBarShift1 original de este código es correcto).

Mi versión fue diseñada como una función independiente, al igual que mql4 iBarShift.

No está optimizado para consultas múltiples, por lo que la comparación de tiempos es irrelevante. @nicholishen publicó una buena biblioteca optimizada para la llamada masiva.


En realidad muestra justo lo contrario, mi versión es la única que es correcta. (También el iBarShift1 original de este código es correcto).

Mi versión fue concebida para ser utilizada como una función independiente, exactamente como mql4 iBarShift.

No está optimizado para múltiples peticiones, por lo que la comparación de tiempos es irrelevante. @nicholishen publicó una buena biblioteca optimizada para la llamada masiva.

No hablo del tiempo de procesamiento, sino del número de barras.

En la imagen se puede ver que a las 8:37 el código piensa que la barra más cercana es la del día anterior 23:00 , pero en realidad la barra más cercana es la de las 10:00. Está más cerca tanto matemática como lógicamente.

 
Aleksey Vyazmikin:

No hablo del tiempo de procesamiento, sino del número de barra.

La imagen muestra que a las 8:37 el código considera que la barra más cercana es la del día anterior a las 23:00, pero en realidad la barra más cercana es la de las 10:00. Está más cerca tanto de las matemáticas como de la lógica.

simplifiquemos.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Análogo a iBarShift

Alain Verleyen, 2018.04.05 00:18

En realidad sólo muestra lo contrario, mi versión es la única correcta. (Y el iBarShift1 original de este código es correcto).

Mi versión fue concebida como una función independiente, al igual que mql4 iBarShift.

Prueba con mql4, compara, lo mismo.
 
Alain Verleyen:
Simplifiquémoslo.
Prueba con mql4, compara, lo mismo.

Entiendo su argumento. No lo comprobaré. Aparentemente, es mi tarea la que difiere de la lógica aceptada.

 
Alain Verleyen:

¿Qué problema ha descubierto?

Escribí esto hace mucho tiempo. Ya no lo recuerdo, pero algo me confundió.
De todos modos, ahora sólo he encontrado una situación anormal.
Cuando los datos de los símbolos aún no están cargados pueden devolver -1 y deberían devolver 0.

Esto se puede comprobar utilizando el script para MQL4 que adjunto.

Este script toma un tiempo aleatorio y un marco de tiempo aleatorio. Si el valor de iBarShiftX no coincide con la función regular de iBarShift, entonces el mensaje a través de Print.

Si ejecuta este script en un símbolo recién abierto, verá errores. Volver a ejecutar el script en el mismo símbolo no dará errores.

Pero es una nimiedad. En mi versión es el mismo problema.

Sólo tengo una queja sobre su versión: es muy complicada y lenta.

Aquí está su variante:

int iBarShift2(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false)
  {
   datetime LastBAR;
   if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR))
     {
      datetime opentimelastbar[1];
      if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1)
         LastBAR=opentimelastbar[0];
      else
         return(-1);
     }
   if(time>LastBAR)
      return(0);
   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);
     }
   return(-1);
  }

Y aquí está mi función, que hace lo mismo, pero con un algoritmo sencillo y mucho más rápido:

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

Puede utilizar uno aún más corto sin la función:

Bars(Symb,TimeFrame,time+1,UINT_MAX);

Intenta demostrar lo contrario. Encuentre una combinación única de parámetros cuando su función y la mía muestren valores diferentes.

Sólo que no he implementado el último parámetro exacto en él, porque no entiendo por qué es necesario en absoluto. Personalmente nunca lo he necesitado.

Pero si alguien realmente lo necesita, se puede implementar.

Dejé la variante iBarShift3, porque maneja incorrectamente los agujeros de la historia. Se puede arreglar, pero no veo el punto, ya que la opción anterior es suficiente.

Archivos adjuntos:
 
Nikolai Semko:


Dejé la opción iBarShift3 porque no maneja correctamente los agujeros de la historia. Se puede arreglar, pero no veo el motivo, porque la opción anterior es suficiente.

¿Los agujeros se deben a la falta de comercio en la barra, o a otros? Y, ¿cómo se manifiesta la inexactitud?

 
Aleksey Vyazmikin:

¿Los agujeros se deben a la falta de comercio en la barra, o a otra cosa? ¿Y cuál es la inexactitud?

Tomemos un domingo cualquiera en el que no haya comercio:

Print("iBarShift  = "+IntegerToString(iBarShift (_Symbol,PERIOD_H1,D'01.04.2018 10:00:00')));  
Print("iBarShift3 = "+IntegerToString(iBarShift3(_Symbol,PERIOD_H1,D'01.04.2018 10:00:00'))); // показывает на единицу меньше
 
Nikolai Semko:

Digamos que tomamos el domingo como cualquier momento en el que no hay comercio:

¿Así que se muestra el lunes? Eso es lo que quiero... :)

 
¿Por qué no pruebas mi función? Hay una solución que neutraliza el inicio y el final de los compases en el tiempo. Parece calcular todo correctamente. Y es más rápido en tiempo que su versión 3 más rápida. ¿O la rama es más importante?) ¿O también hay un error ahí?) Lo he estado usando durante mucho tiempo....