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

 
Alexey Viktorov:

В таком случае однозначно CopyRates с первого бара 10 штук. И вызывать не каждый тик, а достаточно при появлении нового бара.

А как понять, что новый бар появился без CopyRates? В смысле, нужно сначала поймать событие нового бара. Без CopyRates возможно? Я немного запутался.)

Вот что значит, не занимался этой темой на МТ5 никогда. Прошу понять.))

 
Alexey Viktorov:

Ой, Владимир. Хоть я и ляпнул такое, но к сожалению не сделал оговорку. Если нужна исключительно цена, к примеру открытия, или время, то нет особой необходимости пользоваться CopyRates() в этом случае вполне достаточно или CopyOpen, или iOpen... соответственно CopyTime или iTime. Выбирается по религиозным пристрастиям.

И дополню свою оговорку: По затратам производительности, ощутимой разницы нет. Соответственно остаются исключительно религиозные пристрастия.

fxsaber делал проверку стоимости CopyRates() - она дороже, чем получение отдельно нужного свойства. Это не относится к ситуации, когда нужно получить все цены разом.

 
Реter Konow:
А как понять, что новый бар появился без CopyRates? В смысле, нужно сначала поймать событие нового бара. Без CopyRates возможно? Я немного запутался.)

Ни на что не обращая внимание, отслеживаем появление нового бара и вызываем CopyRates

Разновидностей функций и способов определения нового бара на сайте вагон и маленька тележка.

 
Реter Konow:

А как понять, что новый бар появился без CopyRates? В смысле, нужно сначала поймать событие нового бара. Без CopyRates возможно? Я немного запутался.)

Вот что значит, не занимался этой темой на МТ5 никогда. Прошу понять.))

Самый простой способ - сравнение времени открытия текущего бара. Если оно не равно ранее запомненному - имеем новый бар - делаем то, что нужно сделать на новом баре и запоминаем это время для следующей проверки.

 
Alexey Viktorov:

Ни на что не обращая внимание, отслеживаем появление нового бара и вызываем CopyRates

Разновидностей функций и способов определения нового бара на сайте вагон и маленька тележка.

Появление нового бара в МТ5 не привязано к началу минуты. Вообще не привязано ко времени. Тут загвоздка. Точно понять появление нового бара ориентируясь только по тикам? Все равно нужно обращаться к таймсерии. Врядли иначе возможно. Хотя... Не уверен на 100%.
 
Artyom Trishkin:

fxsaber делал проверку стоимости CopyRates() - она дороже, чем получение отдельно нужного свойства. Это не относится к ситуации, когда нужно получить все цены разом.

При всём уважении fxsaber'а, я предпочитаю не обращать внимания на такую разницу. Потому и сказал, что "ощутимой разницы нет", а разница при обращении в цикле 1е6 итераций меня не интересует. Мы ведь не пишем стрелялки где можно выпустить 1е6 пуль враз.
 
Artyom Trishkin:

Самый простой способ - сравнение времени открытия текущего бара. Если оно не равно ранее запомненному - имеем новый бар - делаем то, что нужно сделать на новом баре и запоминаем это время для следующей проверки.

Так значит, на каждом тике вызывать CopyRates? Иначе как узнать, что изменилось время открытия текущего бара?
 
Реter Konow:
Так значит, на каждом тике вызывать CopyRates? Иначе как узнать, что изменилось время открытия текущего бара?

можно так class CNewbar , или поиском по форуму NewBar

ЗЫ: целая статья! https://www.mql5.com/ru/articles/159



Alexey Viktorov:

Игорь, вам надо в первый класс. Там учат буквы и после изучения вы поймёте разницу CopyRates и CopyBuffer.

Вот лучше предложите решение этой задачи БЕЗ CopyRates


понятно, все как обычно..уфф,ай,ой.. и ни строчки кода ))) 

я привел свой пример, чтобы показать, что не всегда удобно (а зачастую и редко нужно) получать массив последовательных OHLC, в практических задачах чаще требуется получить выборочно значения OHLC с разных баров (индикаторы не в счет)

ладно, не хворай!

Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
 
Реter Konow:
Так значит, на каждом тике вызывать CopyRates? Иначе как узнать, что изменилось время открытия текущего бара?

Да, на каждом тике проверяем время:

//+------------------------------------------------------------------+
//| Возвращает время указанного бара                                 |
//+------------------------------------------------------------------+
datetime Time(const string symbol_name,const ENUM_TIMEFRAMES timeframe,const int index)
  {
   datetime array[];
   return(CopyTime(symbol_name,timeframe,index,1,array)==1 ? array[0] : 0);
  }
//+------------------------------------------------------------------+

И вкратце как-то так:

static datetime last_time=0;
datetime time_current=Time(Symbol(),PERIOD_CURRENT,0);
if(time_current==0)
  return;
if(time_current!=last_time)
  {
   // Новый бар или первый запуск (для контроля первого запуска можно сделать флаг - чтобы не обрабатывать его как новый бар)
   // делаем что нужно на новом баре
   last_time=time_current;
  }

просто на коленке писал - показать идею, а не точность написания

 
Реter Konow:
Так значит, на каждом тике вызывать CopyRates? Иначе как узнать, что изменилось время открытия текущего бара?

if(prevTime!=iTime(...))

{

   // изменилось время открытия текущего бара

}

prevTime=iTime(...);

Причина обращения: