Análogo a iBarShift - página 14

 
fxsaber:

Entonces no entiendo por qué Bars piensa que las 18:00:01 pertenecen a la barra M1 18:01 y no a las 18:00.

Y la lógica aquí es la misma que el hecho de que mi hija esté ahora en su segundo cumpleaños, aunque sólo haya cumplido un año hace una semana. O hoy es 09.04.2018, aunque el 01 Ene 00 fue hace 2017 años, 3 meses y 8 días .

Por cierto, TimeCurrent debe ser sustituido por SYMBOL_TIME.

Gracias. La verdad es que no conocía ese identificador.

 

Por cierto, cuando probé la corrección del algoritmo iBars comparándolo con el benchmark Bars en MQL4, probando diferentes variantes al azar, encontré un error en Bars:

Print(Bars(_Symbol,PERIOD_MN1,D'2005.08.31 00:00:00',D'2005.08.31 23:00:00')); // 1  должен быть 0, т.к. временной диапазон находиться внутри одного бара.
Print(Bars(_Symbol,PERIOD_MN1,D'2006.08.31 00:00:00',D'2006.08.31 23:00:00')); // 0

En MQL5 no existe este error.

Por supuesto no es significativo, ya que sólo aparece en TF = MN1, en las fechas 30 y 31, stop_time = 23 y sólo antes de 2005 :)))

Aquí está el script para MQL4 que lo capta, y iBars resultó ser más referencia que Bares nativos.

Archivos adjuntos:
TestiBars.mq4  10 kb
 
fxsaber:


Por cierto, TimeCurrent debería ser sustituido por SYMBOL_TIME.

No, no es así.
No añadirá corrección, porque TimeCurrent() es universal para todos los símbolos, ya que devuelve la última hora de llegada de la cotización para todos los símbolos, no la actual.

Al mismo tiempo, SymbolInfoInteger(symbol_name,SYMBOL_TIME) es muy lento en comparación con TimeCurrent(), y este tiempo es necesario en cada llamada de iBars

 

Para los interesados.

Versión editada de iBars (similar a las Barras incorporadas, sólo que sin fallos y más rápida).

Se han corregido algunos errores.

Si has notado que tu código MQL5 se cuelga durante 10-20 segundos de repente y tiene la función Bars, que puede devolver 0, entonces te recomiendo encarecidamente que lo sustituyas por esta versión.
Funcionará más rápido y sin cuelgues.

int iBars(string symbol_name,ENUM_TIMEFRAMES  timeframe,datetime start_time,datetime stop_time)
  {
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;
   static datetime LastTime0=0;
   static int PerSec=0;
   static int PreBars=0;
   static datetime LastBAR=0;
   static datetime LastTimeCur=0;
   datetime TimeCur;
   if(stop_time<start_time) {TimeCur=stop_time; stop_time=start_time; start_time=TimeCur; }
   TimeCur=TimeCurrent();
   if(LastTimeFrame!=timeframe) if(timeframe==PERIOD_MN1) PerSec=2419200; else PerSec=::PeriodSeconds(timeframe);
   if(timeframe<PERIOD_W1) TimeCur-=TimeCur%PerSec;
   if(start_time>TimeCur) {LastSymb=NULL; return(0);}
   if(LastTimeFrame!=timeframe || LastSymb!=symbol_name || ((TimeCur-LastBAR)>0 && TimeCur!=LastTimeCur))
      LastBAR=(datetime)SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE);

   LastTimeCur=TimeCur;
   if(PerSec==0) return(0);
   if(start_time>LastBAR)
     {LastTimeFrame=timeframe; LastSymb=symbol_name; return(0);}

   datetime tS,tF=0;
   bool check=true;
   if(timeframe<PERIOD_W1) tS=start_time-(start_time-1)%PerSec-1;
   else if(timeframe==PERIOD_W1) tS=start_time-(start_time-259201)%PerSec-1;
   else
     {
      PerSec=2678400;
      MqlDateTime dt;
      TimeToStruct(start_time-1,dt);
      tS=dt.year*12+dt.mon;
     }
   if(stop_time<=LastBAR)
     {
      if(timeframe<PERIOD_W1) tF=stop_time-(stop_time)%PerSec;
      else if(timeframe==PERIOD_W1) tF=stop_time-(stop_time-259200)%PerSec;
      else
        {
         MqlDateTime dt0;
         TimeToStruct(stop_time,dt0);
         tF=dt0.year*12+dt0.mon;
        }
      if(tS==tF) {PreBars=0; check=false;}
     }
   if((LastTimeFrame!=timeframe || LastSymb!=symbol_name || tS!=LastTime || tF!=LastTime0) && check)
      PreBars=Bars(symbol_name,timeframe,start_time,stop_time);
   LastTime=tS; LastTime0=(datetime)tF;
   LastTimeFrame=timeframe;
   LastSymb=symbol_name;
   return(PreBars);
  }
 
Nikolai Semko:

Versión editada de iBars(similar a las Barras incorporadas, sólo que sin fallos y más rápida).

Se han corregido algunos errores.

La función Bars() está sobrecargada:

1. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe)
2. int Bars(const string symbol_name,ENUM_TIMEFRAMES timeframe,datetime start_time,datetime stop_time)

Sólo tiene un formulario de llamada.

 
Artyom Trishkin:

La función Bars() está sobrecargada:

Sólo tiene una forma de llamar.

si necesitas un formulario corto, está bien usar el incorporado. Apenas hay fallos.

 
Nikolai Semko:

No, no es necesario.
No añadirá corrección, porque TimeCurrent() es universal para todos los símbolos, ya que devuelve la última hora de llegada de la cita para todos los símbolos, no la actual.

SymbolInfoInteger(symbol_name,SYMBOL_TIME) es muy lento comparado con TimeCurrent(), y este tiempo es necesario cada vez que se llama a iBars

Los cotopos pueden ir para todos los personajes menos para el de interés.

Ok, miré la nueva fuente. Vi que las ediciones, que se discutieron, no se han hecho. Estoy fuera.

 
¿Por qué no lo hacen los propios desarrolladores?
 
Sería mucho más cómodo para los usuarios llamar a una función y obtener una matriz sincronizada (alineada con el tiempo) de filas de varios instrumentos
 
Por cierto, sobre la función Bars(). Esta puede ser la causa de la victoria.
Razón de la queja: