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

 
Igor Makanu:


medido:

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

hmm, creo que algún moderador necesita un flamante hola ))))

Ejecutando el script:

2019.07.30 03:58:46.425 CopyClose: loops=-2147483648 ms=0
2019.07.30 03:58:46.425 iClose: loops=-2147483648 ms=0

¿Qué pasa? (no hay tiempo para averiguarlo)

 
Artyom Trishkin:

Ejecutando el script:

¿Qué pasa? (no hay tiempo para averiguarlo)

no hay comprobación del número de barras en el gráfico, tal vez la salida por una barra inexistente - tengo período ilimitado y H1 en eu, rand() parece dar 65 mil como máximo


He hecho saltar el compilador de rand(), aquí hay una prueba correcta de los 4 métodos:

// Позволяет, как в 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)
#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[1];
   MqlRates rates[1];
   srand(GetTickCount());
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   srand(GetTickCount());
   test(10,"iClose",iClose(NULL,0,rand())); 
   srand(GetTickCount());
   test(10,"Close[i]",Close[rand()]); 
   srand(GetTickCount());
   test(10,"CopyRates",CopyRates(_Symbol,_Period,rand(),1,rates)); 
  }
//+------------------------------------------------------------------+

2019.07.30 00:59:10.911 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69765

2019.07.30 01:01:23.655 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=132735

2019.07.30 01:03:51.541 tst_iXXX_Copy (EURUSD,H1) Close[i]: loops=1410065408 ms=147890

2019.07.30 01:05:19.872 tst_iXXX_Copy (EURUSD,H1) CopyRates: loops=1410065408 ms=88328

 
Igor Makanu:

no hay ninguna comprobación del número de barras en el gráfico, puede bloquearse en una barra inexistente - tengo un período ilimitado y H1 en eu, rand() parece dar 65 mil como máximo


He hecho saltar el compilador de rand(), aquí hay una prueba correcta de los 4 métodos:

2019.07.30 00:59:10.911 tst_iXXX_Copy (EURUSD,H1) CopyClose: loops=1410065408 ms=69765

2019.07.30 01:01:23.655 tst_iXXX_Copy (EURUSD,H1) iClose: loops=1410065408 ms=132735

2019.07.30 01:03:51.541 tst_iXXX_Copy (EURUSD,H1) Close[i]: loops=1410065408 ms=147890

2019.07.30 01:05:19.872 tst_iXXX_Copy (EURUSD,H1) CopyRates: loops=1410065408 ms=88328

2019.07.30 04:12:50.825 CopyClose: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 iClose: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 Close[i]: loops=-2147483648 ms=0
2019.07.30 04:12:50.825 CopyRates: loops=-2147483648 ms=0
De alguna manera no es bueno cuando necesitas un archivo :)
 
Artyom Trishkin:
De alguna manera no es bueno cuando necesitas un archivo :)

Hmm, supongo que no es posible sin un medio litro...

¡por qué es diferente loops=-2147483648 en mi código fuente!

;)

PS: a ulong- ints reemplazar en la definición - si usted va a probar hasta la mañana ))))

 
Igor Makanu:

Hmm, supongo que no es posible sin un medio litro...

¡por qué es diferente loops=-2147483648 en mi código fuente!

;)

PD: para ulongar los ints en la definición - si vas a probar hasta la mañana ))))

Reemplazado:

2019.07.30 04:26:12.849 CopyClose: loops=1410065408 ms=71234
2019.07.30 04:26:12.849 iClose: loops=1410065408 ms=0
2019.07.30 04:26:12.849 Close[i]: loops=1410065408 ms=0
2019.07.30 04:26:12.849 CopyRates: loops=1410065408 ms=0

:))

 
Artyom Trishkin:

Reemplazado:

:))

El código fuente de MQL es uno a uno, he copiado la prueba del registro de la terminal

hmm, difícil de adivinar dónde más han cavado las manos traviesas ))))

no me gusta tanto, el código funciona bien - ¡a mí me funcionó! lo saqué de aquí cuando discutimos

SZY: Win10 - 64, build 2093 (Intel Core - 8GB RAM) - no se observan problemas, ¿qué tienes ahí?

--------------

adjunto...es un script, en la carpeta de scripts...no se sabe que más sugerir

Archivos adjuntos:
 
En Win10 x64 todos los núcleos están ocupados
2019.07.30 00:25:29.057 Test (GBPUSD,M1)   CopyClose: loops=1410065408 ms=72953
2019.07.30 00:27:51.501 Test (GBPUSD,M1)   iClose:    loops=1410065408 ms=143625
2019.07.30 00:30:17.904 Test (GBPUSD,M1)   Close[i]:  loops=1410065408 ms=149078
2019.07.30 00:31:56.618 Test (GBPUSD,M1)   CopyRates: loops=1410065408 ms=88891

Bajo Wine en Debian x64 sólo se ejecuta un kernel por alguna razón
2019.07.30 00:38:03.104 Test (GBPUSD,M1)   CopyClose: loops=1410065408 ms=119863
2019.07.30 00:41:10.478 Test (GBPUSD,M1)   iClose:    loops=1410065408 ms=187364
2019.07.30 00:44:16.935 Test (GBPUSD,M1)   Close[i]:  loops=1410065408 ms=186449
2019.07.30 00:46:29.732 Test (GBPUSD,M1)   CopyRates: loops=1410065408 ms=132794
Archivos adjuntos:
CPU_Win10.png  47 kb
CPU_Wine.png  21 kb
 
Igor Makanu:

El código de MQL es exactamente el mismo, he copiado la prueba del registro de la terminal

hmm, es difícil adivinar dónde más han cavado las plumas traviesas ))))

no me gusta tanto, el código funciona bien - ¡a mí me funcionó! lo saqué de aquí cuando discutimos

SZY: Win10 - 64, build 2093 (Intel Core - 8GB RAM) - no se observan problemas, ¿qué tienes ahí?

--------------

adjunto...es un script, en la carpeta de scripts...no se sabe que más sugerir

// Позволяет, как в 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)
#define    test(M,S,EX)        {ulong mss=GetTickCount();ulong nn=(ulong)pow(10,M);for(ulong tst=0;tst<nn&&!_StopFlag;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
void OnStart()
  {
   double buff[1];
   MqlRates rates[1];
   srand(GetTickCount());
   test(10,"CopyClose",CopyClose(_Symbol,_Period,rand(),1,buff));
   srand(GetTickCount());
   test(10,"iClose",iClose(NULL,0,rand())); 
   srand(GetTickCount());
   test(10,"Close[i]",Close[rand()]); 
   srand(GetTickCount());
   test(10,"CopyRates",CopyRates(_Symbol,_Period,rand(),1,rates)); 
  }
//+------------------------------------------------------------------+

Vin10 - 64 , build 2093 (Intel Core i3-3217U CPU @ 1.80GHz - 12GB RAM)- no se notan problemas...

 
Artyom Trishkin:

problemas notados...

Lo único que hay que hacer aquí es reducir el número de ciclos y si hay un lugar en el que el script funcione - utilizar el desempaquetado GetLastError() para buscarlo

alternativamente: ¿o algunos ajustes de la terminal? - hmm, ¿qué ajustes hay? - número de barras en el gráfico y eso es todo

 
Igor Makanu:

Lo único que hay que hacer aquí es reducir el número de ciclos y si hay un lugar en el que el script funcione - utilizar el desempaquetado GetLastError() para buscarlo

alternativamente: ¿o algunos ajustes de la terminal? - hmm, ¿qué ajustes hay? - Número de barras en el gráfico: eso es todo.

No tengo tiempo para buscarlo. Pensé que había algo "fuera de la caja" - sólo lo ejecuté y vi el resultado. Y así... Sí, y el script no funciona inmediatamente, y se cuelga hasta que lo cierras a la fuerza pulsando el PCM en su icono. Y sólo entonces se imprime algo allí. En general - con las macros uno se complica por alguna razón.

Razón de la queja: