Come posso ottenere i parametri Open,Low,High,Close in MQL5? - pagina 6

 
Artyom Trishkin:

Ci sono stati alcuni problemi con SERIES_LASTBAR_DATE. È stato discusso qui da qualche parte molto tempo fa. Forse è stato aggiustato.

La funzione iXXX() funziona benissimo, la sto usando da circa 3 mesi (da quando ho iniziato a usare MQL5) - non ho notato nessun bug o... - È molto pratico e tutto funziona!

SZZY: funziona come scritto nella Guida :

Parametri

simbolo

[Nome del simbolo dello strumento. NULL significa simbolo corrente.

timeframe

[Periodo. Può essere uno dei valori dell'enumerazione ENUM_TIMEFRAMES. 0 significa periodo del grafico attuale.

 
Igor Makanu:

Scrivi sempre e solo e non cerchi di leggere? Ti ho dato un link a un intero articolo sul New Bar! Gli articoli sono controllati - controllati da persone di una competenza diversa da quelle che scrivono costantemente sul forum ;)

ZS: se smetti di scrivere e inizi a leggere, come l'articolo sul mio link, puoi trovare un altro modo ( SERIES_LASTBAR_DATE ) per non usare gli iXXX() - ti ho detto di non usarli ))) - che direbbe i bug e gli errori che gli sviluppatori hanno rilasciato ))))) scadente

Grazie per il link. Non stavo criticando la tua soluzione, stavo solo sottolineando la chiamata iTime, che di per sé suggerisce l'uso di funzioni iXXX, il che supera il punto di armeggiare con CopyRate. Cioè, cercare una nuova barra con iTime per usare CopyRates per non usare le funzioni iXXX (iTime))) Circolo vizioso)))
 
// Для Тестера.
bool IsNewBar()
{
  static int PrevBars = 0;
  const int CurrBars = Bars;  

  const bool Res = (CurrBars != PrevBars);
  
  PrevBars = CurrBars;
  
  return(Res);
}
 
Roman:
Grazie.
 
fxsaber:
Grazie.
 
Ha convertitomolti EA MT4 in MT5 senza cambiare il codice sorgente. Ho pubblicato il sabot come Open[i].
 
fxsaber:
Ho convertito molti EA MT4 in MT5 senza modificare il codice sorgente. Ho pubblicato il sabot come Open[i].

Avete mai fatto misurazioni delle prestazioni tra le funzioni CopyXXX e iXXX? Questa domanda è molto interessante.

Finora vedo un ovvio uso conveniente delle funzioni iXXX - meno rifacimento del codice MQL4 quando lo si porta a MQL5.

In altri casi (senza conoscenza delle prestazioni) - la scelta si basa solo sulle preferenze degli utenti.

 
fxsaber:
Sabz sotto forma di Open[i] postato.

Non ho prestato attenzione a questo codice, l'ho controllato - funziona!

ZS: Devo vedere come ho ottenuto [] domani quando avrò la mente libera - ho provato diverse volte - non ha funzionato!

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

Avete mai fatto misurazioni delle prestazioni tra le funzioni CopyXXX e iXXX? Molto interessato a questa domanda.

Non l'ho fatto. Mi occupo molto raramente di bar. Niente dovrebbe essere più veloce delle funzioni CopyXXX. Solo se lo metti nella cache.

 
Artyom Trishkin:

Avete mai fatto misurazioni delle prestazioni tra le funzioni CopyXXX e iXXX? Molto interessato a questa domanda...


fxsaber:

Non l'ho fatto. Mi occupo molto raramente di bar. Niente dovrebbe essere più veloce delle funzioni CopyXXX. Solo se lo metti nella cache.

Misurato:

#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