Análogo a iBarShift - página 5

 
Aleksey Vyazmikin:

¿Por qué el guión es tan lento?

La respuesta está en el perfilador.

 
Andrey Khatimlianskii:

La respuesta está en el perfilador.

Bien, el perfilador se refiere a este trozo de código

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

¿Qué es lo que no le gusta? La función no es mía, pero el autor de arriba afirmó que debería funcionar rápidamente...

 
Aleksey Vyazmikin:

Bien, el perfilador se refiere a este trozo de código

¿Qué es lo que no le gusta? La función no es mía, pero el autor de arriba afirmó que debería funcionar rápido...

No entiendo muy bien la gracia, ¿por qué has sobrecargado la función MQL4iBarShift? El compilador probablemente se confunde por ello.
La función iBarShift2 está diseñada para MQL5, y en MQL4 sólo se comprobaba la corrección de su ejecución comparándola con la función estándar.

 
Nikolai Semko:

No entiendo el humor, ¿por qué has sobrecargado la función MQL4 iBarShift? El compilador probablemente se confunde por ello.

Nadie ha cancelado

#ifdef __MQL5__
/**************************/
#else
/**************************/
#endif

Y no debería haber ninguna confusión.

 
Nikolai Semko:

No entiendo la gracia, ¿por qué has sobrecargado la función MQL4 iBarShift? El compilador puede confundirse por ello.
La función iBarShift2 está diseñada para MQL5, y en MQL4 sólo se comprobaba la corrección de su ejecución, comparándola con la función estándar.

Supongo que no estoy prestando atención, pero he vuelto a mirar tus posts, es decir, tus funciones para MT4? Es que el tema era sobre MT5, supongo que eso me confundió.

He añadido: Maldita sea, he encontrado otro código, está todo borroso, pido disculpas.

 
Aleksey Vyazmikin:

No debo haber estado prestando atención, pero he vuelto a mirar tus mensajes, es decir, tus funciones para MT4? Es que el tema era sobre MT5, supongo que eso me confundió.

Añadido: Mierda, eso es todo - encontré otro código - todo se puso borroso, lo siento.

Vaya. No. Probé tu código en MQL5 y me confundí. Ahora entiendo lo que quieres decir.
Aquí hay una imagen interesante.
Si su script se ejecuta en TF=1 Day nativo, todo está bien.
Pero si lo ejecuto en otro TF obtengo unos lags desproporcionados increíbles, que aún no puedo explicar, salvo algún fallo en el compilador.
¡¡¡Al mismo tiempo en el modo de depuración o en el modo de perfilado no hay estos frenos!!!
Ahora voy a experimentar y buscar el origen de los frenos.

 
Nikolai Semko:

Vaya. No. He probado tu código en MQL5 y me he confundido. Ahora entiendo lo que quiere decir.
Aquí hay una imagen interesante.
Si su script se ejecuta en TF=1 Day nativo, todo está bien.
Pero si lo ejecuto en otro TF obtengo unos lags desproporcionados increíbles, que aún no puedo explicar, salvo algún fallo en el compilador.
¡¡¡Al mismo tiempo en el modo de depuración o en el modo de perfilado no hay estos frenos!!!
Ahora voy a experimentar y buscar el origen de los frenos.

Inicie su búsqueda sustituyendo un valor de fecha normal

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
 
Aleksey Vyazmikin:

¿Por qué el guión es tan lento?


Sí, es sorprendente.

He localizado la ubicación de los frenos.

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs

input ENUM_TIMEFRAMES TF=PERIOD_D1;
input int Bar=3;
input int calcN=1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int index=0;index<calcN;index++)
     {
      Print("0");
      datetime T=iTime(_Symbol,PERIOD_CURRENT,index);
      Print("00  "+ TimeToString(T));
      int Day_Shift=iBarShift(_Symbol,TF,T,false);
      Print("1");
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      Print("2");
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);
      Print("3");

      if(index<3)Print("1 Start=",Start," Stop=",Stop," Day_Shift=",Day_Shift," index=",index);
      Print("4");

      if(index<3)Print("1 Start=",TimeToString(iTime(_Symbol,TF,Bar+Day_Shift),TIME_DATE|TIME_MINUTES),
         " Stop=",TimeToString(iTime(_Symbol,TF,Day_Shift),TIME_DATE|TIME_MINUTES),
         " Day_Shift=",TimeToString(iTime(_Symbol,PERIOD_CURRENT,index),TIME_DATE|TIME_MINUTES)," index=",index);
     }

   Print("5");

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+   
int iBarShift(const string Symb,const ENUM_TIMEFRAMES TimeFrame,datetime time,bool exact=false)
  {
   static int Res=-1;
   static string LastSymb=NULL;
   static ENUM_TIMEFRAMES LastTimeFrame=0;
   static datetime LastTime=0;

   if((time!=LastTime) || (Symb!=LastSymb) || (TimeFrame!=LastTimeFrame))
     {
      Print("10");
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      Print("11");
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,ENUM_TIMEFRAMES tf,int index)
  {
   if(index < 0) return(-1);
   datetime Arr[];
   if(CopyTime(symbol,tf,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }
//+------------------------------------------------------------------+

Si ejecuta este script en, por ejemplo, H4

puede ver que la primera vez que accede a

Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;

el sistema se congela.

Y este aturdimiento no está presente cuando se hacen perfiles o se depura.

Un problema claro para el servicio de atención al cliente

 
Aleksey Vyazmikin:

¿Por qué el guión es tan lento?

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:05.208 BS (Si Splice,H4) 1 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=15 Stop=3 Day_Shift=0 index=0

2018.03.30 09:21:20.209 BS (Si Splice,H4) 2 Start=2018.03.26 00:00 Stop=2018.03.29 00:00 Day_Shift=2018.03.29 20:00 index=0

2018.03.30 09:20:49.300 Scripts script BS (Si Splice,H4) loaded successfully

2018.03.30 09:21:20.209 Scripts script BS (Si Splice,H4) removed

Gracias Alexey por la observación.
Se trata de un error evidente en la función Bars().
Abierta la pregunta en el hilo de bugs, bugs, consultas

 
Nikolai Semko:

Gracias Alexey por la observación.
Se trata de un claro error en la función Bars().
Abierta una pregunta en el hilo de bugs, bugs, consultas

Gracias por el análisis, así que todavía no estoy completamente loco...