Как получить параметры Open,Low,High,Close в МQL5? - страница 6

 
Artyom Trishkin:

С SERIES_LASTBAR_DATE были какие-то проблемы. Обсуждалось тут где-то давно. Может и поправили уже.

тут не скажу, не пользовался ни разу, а про то с чего начался холивар - функции iXXX() - прекрасно работают, я активно использую около 3-х месяцев (как занялся MQL5) - ни разу не заметил ни багов ни.. - очень удобно и все работает!

ЗЫ: работает как в справке написано :

Параметры

symbol

[in]  Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in]  Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

 
Igor Makanu:

Вы всегда только пишете и не пытаетесь читать? я Вам ссылку на целую статью про "Новый бар" дал! Статьи проверяют - проверяют люди другой компетенции, чем те кто пишут постоянно на форуме  ;)

ЗЫ: если бросите писать и начнете читать , например статью по моей ссылке, то можете найти еще один способ (  SERIES_LASTBAR_DATE  ) не использовать функции iXXX() -  сказали же, что ими не пользоваться ))) - кто бы в баги и ошибки сообщил, что разработчики халтуру выпустили )))))

За ссылку спасибо. Я не критиковал Ваше решение, а только указал на вызов iTime, который сам по себе намекает на использование iXXX функций, которые вытесняют смысл возиться с CopyRates. То есть, искать новый бар с помощью iTime, чтобы использовать CopyRates, чтобы не использовать iXXX функции (iTime).))) Порочный круг.)))
 
// Для Тестера.
bool IsNewBar()
{
  static int PrevBars = 0;
  const int CurrBars = Bars;  

  const bool Res = (CurrBars != PrevBars);
  
  PrevBars = CurrBars;
  
  return(Res);
}
 
Roman:
Благодарю.
 
fxsaber:
Спасибо.
 
Много советников MT4 конвертировал в MT5 без изменения исходников. Сабж в виде Open[i] выкладывал.
 
fxsaber:
Много советников MT4 конвертировал в MT5 без изменения исходников. Сабж в виде Open[i] выкладывал.

Делали когда-нибудь замеры производительности между CopyXXX и iXXX функциями? Очень интересен данный вопрос.

Пока вижу одно явно удобное применение iXXX-функциям - меньше переделывать MQL4-код при портировании его в MQL5.

В остальных случаях (без знаний о производительности) - выбор зиждется лишь на предпочтениях тех, или иных пользователей.

 
fxsaber:
Сабж в виде Open[i] выкладывал.

не обратил внимания на этот код, проверил - работает!

ЗЫ: завтра на свежую голову нужно посмотреть как удалось [] получить - несколько раз пробовал - у меня не  получилось!

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

Делали когда-нибудь замеры производительности между CopyXXX и iXXX функциями? Очень интересен данный вопрос.

Не делал. С барами очень редко имею дело. Быстрее CopyXXX-функций ничего не должно быть. Только если кешировать.

 
Artyom Trishkin:

Делали когда-нибудь замеры производительности между CopyXXX и iXXX функциями? Очень интересен данный вопрос..


fxsaber:

Не делал. С барами очень редко имею дело. Быстрее CopyXXX-функций ничего не должно быть. Только если кешировать.

замерил:

#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