Como obter parâmetros Abertos, Baixos, Altos, Fechados em MQL5? - página 6

 
Artyom Trishkin:

Houve alguns problemas com SERIES_LASTBAR_DATE. Foi discutido aqui em algum lugar há muito tempo. Talvez tenha sido consertado.

A função iXXX() funciona muito bem, estou usando-a há cerca de 3 meses (desde que comecei a usar MQL5) - não notei nenhum bug ou... - É muito útil e tudo funciona!

SZZY: funciona como escrito em Help :

Parâmetros

símbolo

[em] Nome do símbolo do instrumento. NULL significa símbolo atual.

cronograma

[em] Período. Pode ser um dos valores da enumeração ENUM_TIMEFRAMES. 0 significa o período da tabela atual.

 
Igor Makanu:

Você sempre escreve e não tenta ler? Eu lhe dei um link para um artigo inteiro sobre o Novo Bar! Os artigos são verificados - verificados por pessoas de competência diferente daquelas que escrevem constantemente no fórum ;)

ZS: Se você parar de escrever e começar a ler, como o artigo no meu link, você pode encontrar outra maneira ( SERIES_LASTBAR_DATE ) de não usar o iXXX() - Eu disse para você não usá-los ))) - quem diria aos bugs e erros que os desenvolvedores lançaram o shoddy )))))

Obrigado pelo link. Eu não estava criticando sua solução, apenas apontando a chamada do iTime, que por si só sugere o uso das funções iXXX, o que substitui o ponto de mexer com o CopyRates. Ou seja, procure uma nova barra usando o iTime para usar o CopyRates para não usar as funções 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:
Obrigado.
 
fxsaber:
Obrigado.
 
Converteumuitos MT4EAs para MT5 sem alterar o código fonte. Eu coloquei o sabot como Open[i].
 
fxsaber:
Converti muitos MT4 EAs para MT5 sem modificar o código fonte. Eu coloquei o sabot como Open[i].

Já fez medições de desempenho entre as funções CopyXXX e iXXX? Esta pergunta é muito interessante.

Até agora, vejo um uso conveniente óbvio das funções iXXX - menos remake do código MQL4 ao portá-lo para MQL5.

Em outros casos (sem conhecimento de desempenho) - a escolha é baseada apenas nas preferências dos usuários.

 
fxsaber:
Sabz na forma de Open[i] postado.

Não prestou atenção a este código, verificou - ele funciona!

ZS: Preciso ver como consegui [] amanhã quando tenho a cabeça limpa - eu tentei várias vezes - não funcionou!

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

Já fez medições de desempenho entre as funções CopyXXX e iXXX? Muito interessado nesta questão.

Eu não tenho. Eu muito raramente lido com bares. Nada deve ser mais rápido do que as funções CopyXXX. Somente se você armazená-lo em cache.

 
Artyom Trishkin:

Já fez medições de desempenho entre as funções CopyXXX e iXXX? Muito interessado nesta questão...


fxsaber:

Eu não tenho. Eu muito raramente lido com bares. Nada deve ser mais rápido do que as funções CopyXXX. Somente se você armazená-lo em cache.

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