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

 
Artyom Trishkin:

Il y avait quelques problèmes avec SERIES_LASTBAR_DATE. On en a discuté ici quelque part il y a longtemps. Peut-être qu'il a été réparé.

La fonction iXXX() fonctionne bien, je l'utilise depuis environ 3 mois (depuis que j'ai commencé à utiliser MQL5) - je n'ai pas remarqué de bogues ou... - C'est très pratique et tout fonctionne !

SZZY : il fonctionne comme indiqué dans l'aide :

Paramètres

symbole

[in] Nom du symbole de l'instrument. NULL signifie le symbole actuel.

cadre temporel

Période [en]. Peut être une des valeurs de l'énumération ENUM_TIMEFRAMES. 0 signifie la période du graphique actuel.

 
Igor Makanu:

Tu te contentes toujours d'écrire sans essayer de lire ? Je t'ai donné un lien vers un article complet sur le nouveau bar ! Les articles sont vérifiés - vérifiés par des personnes d'une autre compétence que celles qui écrivent constamment sur le forum ;)

ZS : Si vous arrêtez d'écrire et commencez à lire, comme l'article sur mon lien, vous pouvez trouver un autre moyen ( SERIES_LASTBAR_DATE ) de ne pas utiliser les iXXX() - je vous ai dit de ne pas les utiliser ;))) - qui dirait aux bogues et aux erreurs que les développeurs ont publié de façon bâclée ))))).

Merci pour le lien. Je ne critiquais pas votre solution, je soulignais simplement l'appel à iTime, qui lui-même suggère l'utilisation de fonctions iXXX, ce qui supplante l'intérêt de tripoter les CopyRates. C'est-à-dire, chercher une nouvelle barre avec iTime pour utiliser CopyRates afin de ne pas utiliser les fonctions iXXX (iTime).))))) Un cercle vicieux.)))
 
// Для Тестера.
bool IsNewBar()
{
  static int PrevBars = 0;
  const int CurrBars = Bars;  

  const bool Res = (CurrBars != PrevBars);
  
  PrevBars = CurrBars;
  
  return(Res);
}
 
Roman:
Merci.
 
fxsaber:
Merci.
 
Conversion denombreux EA de MT4 à MT5 sans modifier le code source. J'ai affiché le sabot comme Open[i].
 
fxsaber:
J'ai converti de nombreux EA de MT4 à MT5 sans modifier le code source. J'ai posté le sabot comme Open[i].

Avez-vous déjà effectué des mesures de performance entre les fonctions CopyXXX et iXXX ? Cette question est très intéressante.

Jusqu'à présent, je n'ai vu qu'une seule utilisation pratique évidente des fonctions iXXX : moins de remaniement du code MQL4 lors de son portage vers MQL5.

Dans d'autres cas (sans connaissance des performances) - le choix est basé uniquement sur les préférences des utilisateurs.

 
fxsaber:
Sabz sous forme d'Open[i] affiché.

Je n'ai pas prêté attention à ce code, je l'ai vérifié - il fonctionne !

ZS : Je dois voir comment j'ai obtenu [] demain quand j'aurai les idées claires - j'ai essayé plusieurs fois - ça n'a pas marché !

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

Avez-vous déjà effectué des mesures de performance entre les fonctions CopyXXX et iXXX ? Cette question m'intéresse beaucoup.

Je ne l'ai pas fait. J'ai très rarement affaire à des bars. Rien ne devrait être plus rapide que les fonctions CopyXXX. Seulement si vous le cachez.

 
Artyom Trishkin:

Avez-vous déjà effectué des mesures de performance entre les fonctions CopyXXX et iXXX ? Très intéressé par cette question...


fxsaber:

Je ne l'ai pas fait. J'ai très rarement affaire à des bars. Rien ne devrait être plus rapide que les fonctions CopyXXX. Seulement si vous le cachez.

Mesuré :

#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