Análogo a iBarShift - página 4

 
Nikolai Semko:

En mi opinión, el uso de la funciónSeriesInfoInteger es redundante, porque no es gratuita.

Era:

Se convirtió:

Una ganancia de velocidad de aproximadamente 1,5 veces.

Un 2% de ganancia. Nota.

no funcionará correctamente con PERIOD_W1 y PERIOD_MN1, porque se cuenta desde el 1 de enero de 1970, y es jueves, no lunes. Y cada mes tiene un número diferente de segundos.

Esto debe añadirse a la documentación de PeriodSeconds.

 
Aleksey Vyazmikin:

No lo he comprobado - porque necesito saber con seguridad si el código funcionará o no para una situación específica, porque no es correcto culpar a otra persona si yo mismo he cometido un error.

Me refiero a situaciones como esta: supongamos que tenemos 14 horas en un día (o menos, si no hubiera cotizaciones cada hora), tengo un gráfico M1 y necesito saber el desplazamiento de una barra en M15 del día anterior. Es decir, ¿funcionará todo correctamente si tengo 45 minutos en una hora o 14 horas en un día, o cualquier otra caída de tiempo/conmutación?

Personalmente, creo que es apropiado utilizar esta característica:

int iBarShift(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;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }

Pero hay que tener en cuenta que no es un análogo completo de la función MQL4iBarShift al menos por el hecho de que no tiene el parámetroExact

Por lo demás, es idéntico.

Estoy pegando un simple script MQL4 que muestra la identidad completa de la función estándar con esta.

Si los valores de la función estándariBarShift y mi función no son iguales, entonces Print. No me imprimió nada.

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        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
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   datetime t=TimeCurrent()+1000;
   const ENUM_TIMEFRAMES tf[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   while(!IsStopped())
     {
      for(int i=0; i<9;i++)
        {
         int i1=iBarShift(NULL,tf[i],t);
         int i2=iBarShift2(NULL,tf[i],t);
         if(i1!=i2) Print(EnumToString(tf[i]),"   ",TimeToString(t),"   ",i1,"   ",i2);
        }
      t-=10;
      Comment(TimeToString(t));
     }

  }
//+------------------------------------------------------------------+
int iBarShift2(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;

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

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+
 
fxsaber:

Un 2% de ganancias. Nota.

¿Qué, de verdad?

Me daba pereza poner GetMicrosecondCount(), así que confié en el profiling.

 
Nikolai Semko:

¿De verdad?

Me daba pereza poner GetMicrosecondCount(), así que confié en el profiling.

La elaboración de perfiles tiene que ver con otra cosa. El 2% es la máxima ganancia que se puede obtener.

250 millones de llamadas en el Probador en mi máquina da un ahorro de 1 segundo.

¡Definitivamente su opción es la mejor! Pero no puedo ni imaginar por qué en MT5 hay que trabajar con barras.

 
fxsaber:

Pero no tengo ni idea de por qué en MT5 tengo que trabajar con barras.

Lo uso cuando controlo el ratón. Por ejemplo, aquí.

 
Nikolai Semko:

Lo utilizo para controlar el ratón. Aquí, por ejemplo.

Sí, eso es lo que no entiendo.

 
fxsaber:

Sí, eso es lo que no entiendo.

Y no entiendo el malentendido ))

Por ejemplo, tengo un canal, una de cuyas características es la hora de inicio (borde izquierdo). Y necesito construir este canal en diferentes TFs. Bueno, ¿qué otra alternativa tengo que encontrar el número de bar en una nueva TF?

Tengo muchas otras cosas.

Por ejemplo, cuando combino todos los TFs en uno con una escala logarítmica. Este es un tema muy interesante. Aquí tampoco se puede prescindir del iBarShift analógico

 
Nikolai Semko:

Personalmente, creo que es razonable utilizar dicha función:

Pero hay que tener en cuenta que no es un análogo completo de la función estándar MQL4iBarShift, al menos porque no tiene el parámetroExact

Por lo demás, es idéntico.

Estoy pegando un simple script MQL4 que muestra la identidad completa de la función estándar con esta.

Si los valores de la función estándariBarShift y mi función no son iguales, entonces Print. No he imprimido nada.

No, no lo hizo debido a Comment().

Si lo quitas, hay un desajuste por 1, pero no creo que sea un error, porque de hecho la nueva barra está definida en dos algoritmos con un desplazamiento de media barra. Mi versión de la detección de barras nuevas me parece más lógica que la estándar.

 
Nikolai Semko:

Y no entiendo el malentendido ))

No entiendo el sentido de usar barras. CopyRates, etc.

 

¿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

//+------------------------------------------------------------------+
//|                                                    iBarShift.mq4 |
//|                        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++)
     {
      int Day_Shift=iBarShift(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);
      int Start=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      int Stop=iBarShift(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);

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

      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);
     }



   for(int index=0;index<calcN;index++)
     {
      int Day_Shift=iBarShift2(_Symbol,TF,iTime(_Symbol,PERIOD_CURRENT,index),false);
      int Start=iBarShift2(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Bar+Day_Shift),false);
      int Stop=iBarShift2(_Symbol,PERIOD_CURRENT,iTime(_Symbol,TF,Day_Shift),false);

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

      if(index<3)Print("2 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);
     }
   return;

  }
//+------------------------------------------------------------------+ 
//| Получим iBarShift для заданного номера бара                      | 
//+------------------------------------------------------------------+  
int iBarShift2(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))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      if(Res<0) Res=0;

      LastTime = time;
      LastSymb = Symb;
      LastTimeFrame=TimeFrame;
     }
   return(Res);
  }
//+------------------------------------------------------------------+ 
//| Получим 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))
     {
      Res=::Bars(Symb,TimeFrame,time,UINT_MAX)-1;
      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);
  }
//+------------------------------------------------------------------+