Comment obtenir les paramètres Open,Low,High,Close dans MQL5 ? - page 7

 
Igor Makanu:


mesurée :

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, je pense qu'un modérateur a besoin d'un bonjour enflammé ))))

Exécution du 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'est-ce qu'il y a ? (pas le temps d'y penser)

 
Artyom Trishkin:

Exécution du script :

Qu'est-ce qu'il y a ? (pas le temps d'y penser)

il n'y a pas de vérification du nombre de barres sur le graphique, peut-être la sortie par une barre inexistante - j'ai une période illimitée et H1 sur eu, rand() semble donner 65 mille au maximum


J'ai fait sauter le compilateur rand(), voici un test correct des 4 méthodes :

// Позволяет, как в 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:

il n'y a pas de contrôle du nombre de barres sur le graphique, il peut se planter sur une barre inexistante - j'ai une période illimitée et H1 sur eu, rand() semble donner 65 mille au maximum


J'ai fait sauter le compilateur rand(), voici un test correct des 4 méthodes :

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
En quelque sorte, ce n'est pas bon quand on a besoin d'un fichier :)
 
Artyom Trishkin:
Ce qui n'est pas bon quand on a besoin d'un fichier :)

Hmm, je suppose que ce n'est pas possible sans un demi-litre...

pourquoi loops=-2147483648 est différent dans mon code source !

;)

PS : pour ulong- ints remplacer dans la définition - si vous allez tester jusqu'au matin ))))

 
Igor Makanu:

Hmm, je suppose que ce n'est pas possible sans un demi-litre...

pourquoi loops=-2147483648 est différent dans mon code source !

;)

PS : pour ulong-into les ints dans la définition - si vous allez tester jusqu'au matin ))))

Remplacé :

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:

Remplacé :

:))

Le code source MQL est un-à-un, j'ai copié le test à partir du journal du terminal

hmm, difficile de deviner où d'autres mains coquines ont creusé ))))

je ne suis pas si enthousiaste, le code fonctionne bien - il a fonctionné pour moi ! je l'ai obtenu d'ici quand nous avons discuté

SZY : Win10 - 64, build 2093 (Intel Core - 8GB RAM) - aucun problème constaté, qu'est-ce que vous avez là ?

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

ci-joint...c'est un script, dans le dossier script...je ne sais pas quoi suggérer d'autre

Dossiers :
 
Sur Win10 x64, tous les cœurs sont engagés.
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

Sous Wine sur Debian x64, seul un noyau fonctionne pour une raison quelconque.
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
Dossiers :
CPU_Win10.png  47 kb
CPU_Wine.png  21 kb
 
Igor Makanu:

Le code source MQL est exactement le même, j'ai copié le test depuis le journal du terminal

hmm, il est difficile de deviner où d'autres vilains stylos ont creusé ))))

je ne suis pas si enthousiaste, le code fonctionne bien - il a fonctionné pour moi ! je l'ai obtenu d'ici quand nous avons discuté

SZY : Win10 - 64, build 2093 (Intel Core - 8GB RAM) - aucun problème constaté, qu'est-ce que vous avez là ?

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

ci-joint...c'est un script, dans le dossier script...je ne sais pas quoi suggérer d'autre

// Позволяет, как в 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)- aucun problème constaté...

 
Artyom Trishkin:

problèmes constatés...

La seule chose à faire ici est de réduire le nombre de cycles et s'il y a un endroit où le script fonctionnera - utilisez le déballage GetLastError() pour le rechercher.

alternativement : ou certains paramètres du terminal? - hmm, quels sont les réglages possibles ? - nombre de barres sur le graphique et c'est tout

 
Igor Makanu:

La seule chose à faire ici est de réduire le nombre de cycles et s'il y a un endroit où le script fonctionnera, utilisez l'undo GetLastError() pour le rechercher.

alternativement : ou certains paramètres du terminal? - hmm, quels sont les réglages possibles ? - Nombre de barres sur le graphique - c'est tout.

Je n'ai pas le temps de le chercher. J'ai pensé qu'il y avait quelque chose "hors de la boîte" - je l'ai juste exécuté et j'ai vu le résultat. Et donc... Oui, et le script ne fonctionne pas immédiatement, et se bloque jusqu'à ce que vous le fermiez de force en appuyant sur le PCM sur son icône. Et c'est seulement à ce moment-là que quelque chose est imprimé. En général - avec les macros on a des problèmes pour une raison quelconque.