¿Cómo se obtienen los parámetros Open, Low, High, Close en MQL5? - página 6

 
Artyom Trishkin:

Había algunos problemas con SERIES_LASTBAR_DATE. Se discutió aquí hace tiempo. Quizá se haya arreglado.

La función iXXX() funciona muy bien, la he estado usando durante unos 3 meses (desde que empecé a usar MQL5) - no he notado ningún error o... - Es muy práctico y todo funciona.

SZZY: funciona como está escrito en la Ayuda :

Parámetros

símbolo

[in] Nombre del símbolo del instrumento. NULL significa símbolo actual.

marco temporal

[en] Período. Puede ser uno de los valores de la enumeración ENUM_TIMEFRAMES. 0 significa el período del gráfico actual.

 
Igor Makanu:

¿Siempre te limitas a escribir y no intentas leer? ¡Te he dado un enlace a un artículo completo sobre el Nuevo Bar! Los artículos son revisados - revisados por personas de una competencia diferente a la de los que escriben constantemente en el foro ;)

ZS: Si dejas de escribir y te pones a leer, como el artículo de mi enlace, puedes encontrar otra forma ( SERIES_LASTBAR_DATE ) de no usar los iXXX() - te dije que no los usaras ))) - que contaría los fallos y errores que los desarrolladores publicaron en ))))) de mala calidad

Gracias por el enlace. No estaba criticando tu solución, sólo señalando la llamada a iTime, que en sí misma insinúa el uso de las funciones de iXXX, lo que supera el punto de jugar con CopyRates. Es decir, buscar una nueva barra que use iTime para usar CopyRates y así no usar las funciones de iXXX (iTime)). Círculo vicioso)))
 
// Для Тестера.
bool IsNewBar()
{
  static int PrevBars = 0;
  const int CurrBars = Bars;  

  const bool Res = (CurrBars != PrevBars);
  
  PrevBars = CurrBars;
  
  return(Res);
}
 
Roman:
Gracias.
 
fxsaber:
Gracias.
 
Convertimosmuchos EAs de MT4 a MT5 sin cambiar el código fuente. He publicado el sabot como Open[i].
 
fxsaber:
He convertido muchos EAs de MT4 a MT5 sin modificar el código fuente. He publicado el sabot como Open[i].

¿Ha hecho alguna vez mediciones de rendimiento entre las funciones CopyXXX e iXXX? Esta pregunta es muy interesante.

Hasta ahora veo un uso conveniente obvio de las funciones de iXXX - menos rehacer el código de MQL4 al portarlo a MQL5.

En otros casos (sin conocimiento del rendimiento), la elección se basa únicamente en las preferencias del usuario.

 
fxsaber:
Sabz en forma de Open[i] publicado.

No presté atención a este código, lo comprobé - ¡funciona!

ZS: Tengo que ver cómo he conseguido [] mañana cuando tenga la cabeza despejada - lo he intentado varias veces - ¡no ha funcionado!

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME  NAME;                                                                                           \
                                                                                                              \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume,TickVolume,long)
DEFINE_TIMESERIE(Time,Time,datetime)
DEFINE_TIMESERIE(Open,Open,double)
DEFINE_TIMESERIE(High,High,double)
DEFINE_TIMESERIE(Low,Low,double)
DEFINE_TIMESERIE(Close,Close,double)
void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      ResetLastError();
      Print("Bar№ ",i," : ",Time[i]," , O = ",Open[i]," , H = ",High[i]," , L = ",Low[i]," , C = ",Close[i]);
      int err=GetLastError();
      if(err>0) Print("Error № ",err);
     }
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

¿Ha hecho alguna vez mediciones de rendimiento entre las funciones CopyXXX e iXXX? Me interesa mucho esta pregunta.

No lo he hecho. Rara vez me ocupo de los bares. Nada debería ser más rápido que las funciones CopyXXX. Sólo si lo guardas en el caché.

 
Artyom Trishkin:

¿Ha hecho alguna vez mediciones de rendimiento entre las funciones CopyXXX e iXXX? Muy interesado en esta cuestión...


fxsaber:

No lo he hecho. Rara vez me ocupo de los bares. Nada debería ser más rápido que las funciones CopyXXX. Sólo si lo guardas en el caché.

Medido:

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
void OnStart()
  {
   double buff[];
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   test(10,"iClose",iClose(NULL,0,rand())); 
  }
//+------------------------------------------------------------------+

2019.07.30 00:44:29.156 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69407

2019.07.30 00:45:29.408 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=60250

Razón de la queja: