Análogo a iBarShift - página 7

 

Aquí está la versión más rápida y que funciona correctamente en todos los TFs:

int iBarShift3(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static int PerSec=::PeriodSeconds(LastTimeFrame);

   if(LastTimeFrame!=TimeFrame) PerSec=::PeriodSeconds(TimeFrame);
   if(TimeFrame<PERIOD_D1) time-=time%PerSec;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX);
      if(TimeFrame<PERIOD_D1) Res--;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }

   return(Res);
  }

La velocidad disminuye para TF D1, W1 y MN1

Y aquí hay un indicador de prueba, que muestra claramente la respuesta de las diferentes versiones, así como su velocidad ( el segundo número. Cuanto menor sea el número, más rápida será la función)


Tanto la versión 3 como la 4 funcionan correctamente. Pero el tercero es más rápido.

Las variantes con CopyTime son las más lentas.

Esto se puede comprobar en MQL4 (ver indicador adjunto).

No especifico la autoría de las diferentes variantes, porque ya me he confundido.
Pero la tercera forma más útil es el 80% de@fxsaber. Sólo lo he retocado un poco.

Archivos adjuntos:
 
Nikolai Semko:

Ambas opciones, la 3 y la 4, funcionan correctamente. Pero el 3 es el más rápido. Las variantes de CopyTime son las más lentas.

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

Discussion on "LifeHack para trader: mezclando ForEach en defines (#define)"

fxsaber, 2018.02.14 11:58

Las mediciones de la velocidad de la función ZZY deben medirse en un entorno en el que el rendimiento sea importante: el probador.

 
fxsaber:

Las medidas no importan realmente aquí. Puedes ver que la lógica es la más rápida.

 
Nikolai Semko:

Aquí está la versión más rápida y que funciona correctamente en todos los TFs:

La velocidad disminuye para TF D1, W1 y MN1

Y aquí hay un indicador de prueba, que muestra claramente la respuesta de las diferentes versiones, así como su velocidad ( el segundo número. Cuanto menor sea el número, más rápida será la función)


Tanto la versión 3 como la 4 funcionan correctamente. Pero el tercero es más rápido.

Las variantes con CopyTime son las más lentas.

Se puede comprobar en MQL4 (ver indicador adjunto).

No indico la autoría de las diferentes variantes porque ya estoy confundido.
Pero la tercera variante que más funciona es el 80% de@fxsaber. Sólo lo he retocado un poco.

He añadido TF a su indicador - los dos primeros algoritmos no son útiles en absoluto.

En las cifras, la TF actual es H1, y el cálculo se basa en las tasas diarias.



 
Renat Akhtyamov:
Sí (resaltado)

-1 es un uno menos (para aclarar), devuelto por la función de error, que dice que no hay tal barra

Así que mi función

también hay que perfeccionar

aunque...

Documentación:

"Nota.

Si los datos de las series temporales con los parámetros especificados al llamar a la función Bars() aún no se han generado en el terminal, o los datos de las series temporales no están sincronizados con el servidor de comercio en el momento de la llamada a la función, entonces la función devolverá un valor cero. "

====

Si res==0, entonces cogeremos -1 de la función tal cual.

===

Así que todo funciona, ¡aprovéchalo en tu favor!

En el indicador de arriba se puede ver claramente lo falso que es este método.

 
Nikolai Semko:

Aquí está la versión más rápida y que funciona correctamente en todos los TFs:

La velocidad disminuye para TF D1, W1 y MN1

Y aquí hay un indicador de prueba, que muestra claramente la respuesta de las diferentes versiones, así como su velocidad ( el segundo número. Cuanto menor sea el número, más rápida será la función)


Tanto la versión 3 como la 4 funcionan correctamente. Pero el tercero es más rápido.

Las variantes con CopyTime son las más lentas.

Se puede comprobar en MQL4 (ver indicador adjunto).

No especifico la autoría de las diferentes variantes, porque ya me he confundido.
Pero la tercera variante que más funciona es el 80% de@fxsaber. Sólo lo he retocado un poco.

La varianteiBarShift3 no funciona correctamente.

 

Esta es mi versión. Parece que funciona tanto con los marcos junior como con los senior. La velocidad es un poco más rápida que la del iBarshift3.


int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime time){

datetime t1 = TimeCurrent()+10000000;

int ps = PeriodSeconds(timeframe);

doble div = tiempo/(doble)ps;

doble mant = div - MathFloor(div);

int ret = Bars(símbolo, timeframe, (datetime)(time-(ps*mant)), t1)-1;

return(ret);

}

 
Vitaly Muzichenko:

La opcióniBarShift3 no funciona correctamente.

¿Puedo tener un ejemplo de que no funciona correctamente?

¿Así que sólo queda la cuarta opción?

 
Vitaly Muzichenko:

La opcióniBarShift3 no funciona bien.

El vocabulario lo es todo.

 
Nikolai Semko:

El vocabulario lo es todo.

Hice una comprobación rápida: hay una función que lleva más de un día funcionando, la sustituí poriBarShift3 en su lugar y conseguí que el EA funcionara incorrectamente. Así es como llegué a mi conclusión.

Este es el que yo utilizo

int iBarShift(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 we always return 0
  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);
 }