Обсуждение статьи "Обработчик события "новый бар"" - страница 2

 

Prival:

Редко, но бывают ситуации, когда котировки по одному инструменту замирают и надолго (видел такое в йеной). И если советник висит на этой паре то ты попал, если не перевел весь код в OnTime().

Если работать на ООП, или использовать определенные алгоритмы то и перевода кода непонадобится. Но согласитесь что удобней получать тики в реальном времени по всем парам находящимся в обзоре (причем не придумывать что-то свое при этом)...

Lizar:

Такое событие можно получить при помощи TimeCuurent(), а вот что с ним дальше делать, как синронизировать - вопрос.

А причем тут TimeCuurent()?
 
Interesting:
 А причем тут TimeCuurent()?

Справка гласит:

В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна.

 
Lizar:

Справка гласит:

В обработчике OnTick() данная функция вернет время пришедшего обрабатываемого тика. В других случаях (например, вызов в обработчиках OnInit(), OnDeinit(), OnTimer() и так далее) это – время прихода последней котировки по любому символу, доступного в окне "Обзор рынка", то самое время, которое показано в заголовке этого окна.

Да это понятно. только если поместить ее в OnTime мы сможем обновлять время не чаще раза в минуту, а если в текущую OnTick() то рискуем пропустить тики по какой-то из пар (в мультах).

А что делать в блоке обработки это понятно (для мультов) - Получаем новое значение, сравниваем с имеющимся и делаем выводы был новый тик или нет.

Но вот скажите мне, нафига это делать в эксперте?

 
Lizar:

Справка гласит:

 

ошибка. вот что гласит справка https://www.mql5.com/ru/docs/basis/function/events

Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт.

Еще раз. Мы говорим про советник который висит на каком-то символе. Он запускается по событию

void OnTick() {}

если находиться внутри этой функции, а тиков по этой паре уже более часа нет, то и ничего сделать в течении часа нельзя. Пока единственный выход, это делать в таймере, он запускается независимо от прихода тиков по инструменту.

 

 

 

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

Да это понятно. только если поместить ее в OnTime мы сможем обновлять время не чаще раза в минуту, а если в текущую OnTick() то рискуем пропустить тики по какой-то из пар (в мультах).

В этом то и дело, что событие мы получить можем, а использовать толком нет.
 
Prival:

ошибка. вот что гласит справка https://www.mql5.com/ru/docs/basis/function/events

Еще раз. Мы говорим про советник который висит на каком-то символе. Он запускается по событию

void OnTick() {}

если находиться внутри этой функции, а тиков по этой паре уже более часа нет, то и ничего сделать в течении часа нельзя. Пока единственный выход, это делать в таймере, он запускается независимо от прихода тиков по инструменту.

Да, если действовать в рамках этого https://www.mql5.com/ru/docs/basis/function/events, то согласен, что наилучший вариант, как сейчас видится, это OnTime. Но это нас только спасет от зависимости поступления тиков. И не спасет от однопоточности: пока обрабатываем сигнал по одному инструменту, рискуем пропустить или запаздать с обработкой других. Особенно это актуально становится при условии "время обработки торговых заявок от 2 до 7 секунд" + реквоты.

А про TimeCuurent() вспомнил, потому что  Interesting заговорил про тики в реальном времени по всем парам находящимся в обзоре рынка.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Хорошая статья, спасибо.
 
спасибо
 

Очень интересная статья. Спасибо, что поделились всем этим.

Однако есть несколько замечаний:

Говоря об этой функции, вы говорите:

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • Вы правы. Но вызывать несколько раз функцию типа isnewbar() в течение 1 тика - плохая практика. Вызовите ее только один раз и сохраните результат в переменной.
  • Проблема в том, что предложенное вами решение - использование класса без статической переменной - не решает того, что вы подчеркнули. И даже ситуация стала еще хуже. Вы должны объявить экземпляр вашего класса как глобальную переменную (объект), а также инициализировать его в OnInit(). Тот, кто будет использовать ваш класс , должен знать об этой операции:
  1. Всегда использовать глобальную переменную
  2. Всегда инициализировать , даже если символ и период заданы по умолчанию (для временного графика).
  • И наконец, "если мы хотим использовать эту функцию, например, еще раз в другом месте в том же цикле вычислений". Все равно она ВСЕГДА возвращает FALSE.

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


Тем не менее, ваша статья заставляет задуматься и предлагает интересные идеи.

 

Хорошая статья, спасибо, что поделились! Все это было очень полезно!

В общем, я взял вашу функцию isNewBar, и при компиляции она выдает следующее сообщение:"возможна потеря данных из-за преобразования типов".

Поэтому я изменил типы var с datetime на long таким образом:

//+------------------------------------------------------------------+
//| Возвращает true, если для пары символ/период появился новый бар |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- запомните время открытия последнего бара в статической переменной
   static long last_time=0;
//--- текущее время
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установите время и выйдите
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомните время и верните true
      last_time=lastbar_time;
      return(true);
     }
//--- если мы дошли до этой строки, то бар не новый; return false
   return(false);
  }

Теперь она компилируется без каких-либо замечаний и, кажется, работает нормально. Спасибо!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5