Потеря тиковых данных на срочном рынке Московской биржи.

 

Столкнулся с тем, что, реальные данные, записанные во время торговой сессии, и тиковая история, загружаемая в тестер стратегий в режиме “Каждый тик на основе реальных тиков” не совпадают!

Так, например, я запустил свой скрипт на инструменте SBRF-9.19 13 сентября 2019 г. во время реальных торгов и записал все тики в текстовый файл в обработчике функции OnTick(), на следующий день запустил этот же скрипт на эту же дату в тестере стратегий в режиме “Каждый тик на основе реальных тиков”, получил новый файл и сравнил их. Данные, сгенерированные тестером стратегий, оказались примерно в 2 раза больше, хотя как я полагал, что данные должны быть идентичными, см фрагмент.

После этого, я потратил еще некоторое время на анализ данных, сравнив их с  FullOrderLog c  Plaza2 MOEX- и пришел к выводу, что исторические (backtest) данные полностью соответствуют транзакциям FullOrderLog, а данные записанные во время реальной торговой сессии – нет.

Судя по официальной документации https://www.mql5.com/ru/docs/event_handlers/ontick :
"Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится."
Cудя по логам, в режиме backtester обработчик MT5 OnTick() вызывается каждый раз, а в режиме реальных торгов, когда очередной большой по объему ордер сводиться в несколько последовательных сделок (судя timestamp и ордрелог), то терминал их просто игнорирует, так как занят обработкой текущего события OnTick(), а в очередь их не ставит.

Соответственно получается что, HFT-like стратегия, которая хорошо показывает себя на бэктестах, не может применятся на реальных торгах? 
Документация по MQL5: Обработка событий / OnTick
Документация по MQL5: Обработка событий / OnTick
  • www.mql5.com
//|                                                   TradeByATR.mq5 | //|                        Copyright 2018, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Expert initialization function                                   |...
Файлы:
compare.png  196 kb
 
madpower2000:

Столкнулся с тем, что, реальные данные, записанные во время торговой сессии, и тиковая история, загружаемая в тестер стратегий в режиме “Каждый тик на основе реальных тиков” не совпадают!

Так, например, я запустил свой скрипт на инструменте SBRF-9.19 13 сентября 2019 г. во время реальных торгов и записал все тики в текстовый файл в обработчике функции OnTick(), на следующий день запустил этот же скрипт на эту же дату в тестере стратегий в режиме “Каждый тик на основе реальных тиков”, получил новый файл и сравнил их. Данные, сгенерированные тестером стратегий, оказались примерно в 2 раза больше, хотя как я полагал, что данные должны быть идентичными, см фрагмент.

После этого, я потратил еще некоторое время на анализ данных, сравнив их с  FullOrderLog c  Plaza2 MOEX- и пришел к выводу, что исторические (backtest) данные полностью соответствуют транзакциям FullOrderLog, а данные записанные во время реальной торговой сессии – нет.

Судя по официальной документации https://www.mql5.com/ru/docs/event_handlers/ontick :
"Если в очереди уже есть событие NewTick либо это событие находится в состоянии обработки, то новое событие NewTick в очередь mql5-программы не ставится."
Cудя по логам, в режиме backtester обработчик MT5 OnTick() вызывается каждый раз, а в режиме реальных торгов, когда очередной большой по объему ордер сводиться в несколько последовательных сделок (судя timestamp и ордрелог), то терминал их просто игнорирует, так как занят обработкой текущего события OnTick(), а в очередь их не ставит.

Соответственно получается что, HFT-like стратегия, которая хорошо показывает себя на бэктестах, не может применятся на реальных торгах? 

1. Тиковая история на ДЕМО не должна совпадать с реалом (ДЕМО служит для обучения)

2. А как Вы получаете данные с PLAZA II ?

 

1.Речь идет не о ДЕМО акаунте, а о реальном торговом акаунте

2.Есть доступ

 
madpower2000:

1.Речь идет не о ДЕМО акаунте, а о реальном торговом акаунте

2.Есть доступ

Доступ к реалу Плаза?

 
Хотелось бы услышать комментарий по озвученной проблеме от разработчиков MetaQuotes Software...
 
madpower2000:

Cудя по логам, в режиме backtester обработчик MT5 OnTick() вызывается каждый раз, а в режиме реальных торгов, когда очередной большой по объему ордер сводиться в несколько последовательных сделок (судя timestamp и ордрелог), то терминал их просто игнорирует, так как занят обработкой текущего события OnTick(), а в очередь их не ставит.


Соответственно получается что, HFT-like стратегия, которая хорошо показывает себя на бэктестах, не может применятся на реальных торгах? 

Для HFT используется асинхронные приказы (отправили и не ждём ответ). Судя по вышеописанному, вы используете синхронные (отправили и ждём ответ сервера).

 
madpower2000:
Хотелось бы услышать комментарий по озвученной проблеме от разработчиков  MetaQuotes Software...

Какой комментарий Вы хотите услышать от разработчиков, если сами же правильно процитировали справку? Не может советник по определению обработать все тики, потому и пропускает их. Больше добавить нечего. 

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

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

 
Ihor Herasko:

Какой комментарий Вы хотите услышать от разработчиков, если сами же правильно процитировали справку? Не может советник по определению обработать все тики, потому и пропускает их. Больше добавить нечего. 


Советник на реале может обрабатывать все тики, а в тестере нет (по крайней мере раньше так было).

Смотрите здесь https://www.mql5.com/ru/code/16210

madpower2000, выложите часть кода, где Вы получаете и обрабатываете тики

Лента всех сделок
Лента всех сделок
  • www.mql5.com
Хитрый усреднитель Hello Smart Эксперт усредняет убыточные позиции по определенному алгоритму. ColorJSatl_Digit Сглаженный быстрый цифровой фильтр JSatl с цветовой индикацией направления движения, с отображением последнего значения в виде ценовой метки и с возможностью округлять уровни...
 

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

См. вот эту ветку, там описание как это делается, в конце решения для обхода некоторых нюансов.

https://www.mql5.com/ru/forum/317990

Порядок прихода тиков в терминал
Порядок прихода тиков в терминал
  • 2019.07.15
  • www.mql5.com
Всем доброго дня! Брокер Открытие, срочный рынок, реальный счет...
 
Ilya Baranov:

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

См. вот эту ветку, там описание как это делается, в конце решения для обхода некоторых нюансов.

https://www.mql5.com/ru/forum/317990

Вообще никогда не использовал OnTick(), - забудьте про неё на ФОРТС, ведь есть же OnBookEvent(), эта функция ничего не пропускает никогда!

//+------------------------------------------------------------------+
//|                                                       onBook.mq5 |
//|                                     Copyright 2019, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//
bool my_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    my_book = MarketBookAdd(Symbol());
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
    if(my_book == true) MarketBookRelease(Symbol()); 
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(symbol == Symbol())
    {
      //Place you code here
    }
   
  }
//+------------------------------------------------------------------+
 
prostotrader:

Вообще никогда не использовал OnTick(), - забудьте про неё на ФОРТС, ведь есть же OnBookEvent(), эта функция ничего не пропускает никогда!

Откуда информация, что OnBookEvent не пропускает?

Как проверяли?
Причина обращения: