Тики в реальном времени

 

Всем доброго времени суток.

Появилась необходимость протестировать торговый алгоритм на реальных тиках брокера "Открытие".
Так вот, алгоритм показывает различные результаты в режиме онлайн и в тестере в режиме реальных тиков.
Исходя из этого следующим шагом был произведен сбор тиков в реальном времени (реальные тики) и их сравнение с тиковой историей (исторические тики), получаемой через функцию CopyTicksRange() .
Тики собирались на фьючерсе SBRF за 21.01.2020.

Получились интересные результаты и появились некоторые вопросы.

1. Количество реальных тиков и исторических тиков существенно отличается, но тики в начале и конце торгового дня одинаковые.
Возможно на это влияет особенность обработчика OnTick(), который может пропускать обработку тиков.

2. Больше половины исторических тиков, помимо стандартных флагов (TICK_FLAG_BID ... и т.д.) имеет дополнительный включенный флаг 9 бита.
На реальных тиках такого не наблюдается - нет ни одного тика с включенным флагом 9 бита.

3. Какой либо системности в отличии реальных и исторических тиков, как и включение 9 бита в исторических тиках обнаружить не удалось.
Исторические тики могут полностью соответствовать реальным, при этом 9 бит в флаге у них может быть включен или отключен.
Реальные и исторические тики могут не соответствовать даже в период низкой активности в торговле, когда поступление тиков в терминал не такое интенсивное.

Ticks out

И соответственно вопросы:

К разработчикам - что означает 9 бит в флаге тика?

И к сообществу - кто нибудь сталкивался с подобной коллизией?
Как проводите тестирование алгоритмов на реальных тиках? Только онлайн?

В приложении файлы со сборщиком и анализатором тиков.
И реальные тики по SBRF-3.20 за 21.01.2020. 

Файлы:
ticks.zip  553 kb
 
Vladimir Mikhailov:

Всем доброго времени суток.

Появилась необходимость протестировать торговый алгоритм на реальных тиках брокера "Открытие".
Так вот, алгоритм показывает различные результаты в режиме онлайн и в тестере в режиме реальных тиков.
Исходя из этого следующим шагом был произведен сбор тиков в реальном времени (реальные тики) и их сравнение с тиковой историей (исторические тики), получаемой через функцию CopyTicksRange() .
Тики собирались на фьючерсе SBRF за 21.01.2020.

Получились интересные результаты и появились некоторые вопросы.

1. Количество реальных тиков и исторических тиков существенно отличается, но тики в начале и конце торгового дня одинаковые.
Возможно на это влияет особенность обработчика OnTick(), который может пропускать обработку тиков.

2. Больше половины исторических тиков, помимо стандартных флагов (TICK_FLAG_BID ... и т.д.) имеет дополнительный включенный флаг 9 бита.
На реальных тиках такого не наблюдается - нет ни одного тика с включенным флагом 9 бита.

3. Какой либо системности в отличии реальных и исторических тиков, как и включение 9 бита в исторических тиках обнаружить не удалось.
Исторические тики могут полностью соответствовать реальным, при этом 9 бит в флаге у них может быть включен или отключен.
Реальные и исторические тики могут не соответствовать даже в период низкой активности в торговле, когда поступление тиков в терминал не такое интенсивное.

И соответственно вопросы:

К разработчикам - что означает 9 бит в флаге тика?

И к сообществу - кто нибудь сталкивался с подобной коллизией?
Как проводите тестирование алгоритмов на реальных тиках? Только онлайн?

В приложении файлы со сборщиком и анализатором тиков.
И реальные тики по SBRF-3.20 за 21.01.2020. 

Насмешили Вы своим сборщиком тиков :)

Возьмите за основу "Лента всех сделок"

https://www.mql5.com/ru/code/16210

Доюавлено

И забудьте о тестере для Биржевых инструментов

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

Насмешили Вы своим сборщиком тиков :)

Возьмите за основу "Лента всех сделок"

https://www.mql5.com/ru/code/16210

Доюавлено

И забудьте о тестере для Биржевых инструментов

Приведенный пример всего лишь один из способов агрегирования ленты сделок, и опять же обращение идет к истории.
Чего не хотелось бы делать, так как это тормозит алгоритм. В первую очередь интересуют те тики, которые обрабатываются событием OnTick(). 

Забыть о тестере для Биржевых инструментов в принципе или о тестере в МТ5?

 
Vladimir Mikhailov:

Приведенный пример всего лишь один из способов агрегирования ленты сделок, и опять же обращение идет к истории.
1. Чего не хотелось бы делать, так как это тормозит алгоритм. В первую очередь интересуют те тики, которые обрабатываются событием OnTick(). 

2. Забыть о тестере для Биржевых инструментов в принципе или о тестере в МТ5?

1. Ничего не тормозит и тормозить не будет.

Вам дали готовое решение, которое просто нужно подправить для своих нужд.

Событие OnTick() не отображает все изменения в стакане, т.е учитывает не все тики!

Вот Вам простой пример для проверки

//+------------------------------------------------------------------+
//|                                                   Ticks_test.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
bool is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
    is_book = MarketBookAdd(Symbol());
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if(is_book == true) MarketBookRelease(Symbol());
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    Print(__FUNCTION__ + " Tick is done!");
   
  }
//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
    if(Symbol() == symbol)
    {
      Print(__FUNCTION__ + " Tick is done!");
    }
   
  }
//+------------------------------------------------------------------+
2020.01.23 16:56:53.226	Ticks_test (GOLD-3.20,M1)	OnTick Tick is done!
2020.01.23 16:56:53.226	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!
2020.01.23 16:56:53.712	Ticks_test (GOLD-3.20,M1)	OnTick Tick is done!
2020.01.23 16:56:53.712	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!
2020.01.23 16:56:53.930	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!
2020.01.23 16:56:53.996	Ticks_test (GOLD-3.20,M1)	OnTick Tick is done!
2020.01.23 16:56:53.996	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!
2020.01.23 16:56:54.016	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!
2020.01.23 16:56:54.280	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!
2020.01.23 16:56:54.392	Ticks_test (GOLD-3.20,M1)	OnBookEvent Tick is done!

2. Для Биржевых инструментов (уже писал что для Биржевых)

Добавлено

Если Вы решили "переползти" с ФОРЕКСа на Биржу, то рекомендую найти топик в этом

разделе "В помощь начинающим" и детально ознакомится с ним.

На Бирже Стакан, а не OnTick() всему "голова".
 
prostotrader:

1. Ничего не тормозит и тормозить не будет.

Вам дали готовое решение, которое просто нужно подправить для своих нужд.

Событие OnTick() не отображает все изменения в стакане, т.е учитывает не все тики!

Вот Вам простой пример для проверки

2. Для Биржевых инструментов (уже писал что для Биржевых)

Добавлено

Если Вы решили "переползти" с ФОРЕКСа на Биржу, то рекомендую найти топик в этом

разделе "В помощь начинающим" и детально ознакомится с ним.

На Бирже Стакан, а не OnTick() всему "голова".

1. Вы правы. Событие OnTick() не совсем связано с событием OnBookEvent().
Первое событие обрабатывает приход новых тиков - изменение котировок, биржевые сделки.
Второе - изменение стакана, что не всегда приводит к биржевой сделке.
Как и биржевая сделка не обязательно должна пройти через стакан. 
Т.е. можно сказать, что первое событие относится к ленте сделок, а второе к стакану.

2. Что использовать для анализа и принятия решения - ленту сделок или стакан или оба варианта, зависит от торгового алгоритма

Похоже придется для анализа ленты сделок использовать событие OnTimer() с миллисекундным периодом.
Буду дальше экспериментировать. 
 

 
Vladimir Mikhailov:

1. Вы правы. Событие OnTick() не совсем связано с событием OnBookEvent().
Первое событие обрабатывает приход новых тиков - изменение котировок, биржевые сделки.
Второе - изменение стакана, что не всегда приводит к биржевой сделке.
Как и биржевая сделка не обязательно должна пройти через стакан. 
Т.е. можно сказать, что первое событие относится к ленте сделок, а второе к стакану.

2. Что использовать для анализа и принятия решения - ленту сделок или стакан или оба варианта, зависит от торгового алгоритма. 

Похоже придется для анализа ленты сделок использовать событие OnTimer() с миллисекундным периодом.
Буду дальше экспериментировать. 
 

Плохая идея использовать таймер.

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

У Вас в голове "каша".

Любое изменение стакана и есть тик, включающий в себя и "ленту сделок".

Сработал OnBookEvent(), это значит, что:

1. Произошла сделка или

2. Появился новый ASK или

3. Появился новый Bid, или

4. Кто-то снял свой отложенный ордер или

5. Изменился объем ASK или

6 Изменился объем Bid

Все это отражается в OnBookEvent() ....

Удачи!

Добавлено

В отличии от ФОРЕКСа, где Вы торгуете с компьютером ДЦ,

на Бирже у Вас реальные аппоненты (Физ. лица и Юрики)!

Биржа только "сводит" Ваши ордера (не бесплатно, конечно :) ).

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 

В отличии от ФОРЕКСа, где Вы торгуете с компьютером ДЦ,

на Бирже у Вас реальные аппоненты (Физ. лица и Юрики)!

Биржа только "сводит" Ваши ордера (не бесплатно, конечно :) ).

Про ECN не слыхали?

 
Aleksey Mavrin:

Про ECN не слыхали?

)))))))))

почитайте про ECN


Обсуждение статьи "Выцарапываем профит до последнего пипса"
Обсуждение статьи "Выцарапываем профит до последнего пипса"
  • 2019.07.25
  • www.mql5.com
Опубликована статья Выцарапываем профит до последнего пипса: Автор: fxsaber...
 
Aleksey Mavrin:

Про ECN не слыхали?

Зачем Вы пришли сюда?

Продолжайте искать Грааль на ФОРЕКСе...

 
prostotrader:

Зачем Вы пришли сюда?

Продолжайте искать Грааль на ФОРЕКСе...

А что тут ваша частная территория?

И невежливо указывать малознакомым людям что им делать. Это показывает низковатый уровень вашего развития.

 
Vladimir Mikhailov:

К разработчикам - что означает 9 бит в флаге тика?

Про 9-й бит не знаю, спрашивали про недокументированный 7-й:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5

Slava, 2018.12.04 11:09

Alain Verleyen:

2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 1 галочка: 2018.12.03 00: 52: 27.671 1.13338 / 1.13354 / 0.00000 0 флаги: 230 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 2 tick: 2018.12.03 00: 52: 27.743 1.13335 / 1.13348 / 0.00000 0 флаги: 230 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 3 tick: 2018.12.03 00: 52: 27.821 1.13327 / 1.13343 / 0.00000 0 флаги: 230 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 4 tick: 2018.12.03 00: 52: 27.888 1.13326 / 1.13343 / 0.00000 0 флаги: 226 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 5 tick: 2018.12.03 00: 52: 27.965 1.13327 / 1.13345 / 0.00000 0 флаги: 230 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 6 tick: 2018.12.03 00: 52: 28.194 1.13328 / 1.13346 / 0.00000 0 флаги: 230 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 7 tick: 2018.12.03 00: 52: 28.265 1.13328 / 1.13346 / 0.00000 0 флаги: 96 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 8 tick: 2018.12.03 00: 52: 28.327 1.13326 / 1.13344 / 0.00000 0 флаги: 230 
2018.12.03 09: 58: 06.898 TicksInfo (EURUSD, M5) EURUSD: 9 tick: 2018.12.03 00: 52: 28.405 1.13326 / 1.13344 / 0.00000 0 флаги: 96 
2018.12.03 09: 58: 06.899 TicksInfo (EURUSD, M5) EURUSD: 10 tick: 2018.12.03 00: 52: 28.809 1.13326 / 1.13344 / 0.00000 0 флаги: 96 
2018.12.03 09: 58: 06.899 TicksInfo (EURUSD, M5) EURUSD: 11 tick: 2018.12.03 00: 52: 29.289 1.13326 / 1.13344 / 0.00000 0 флаги: 96 

Очевидно, что флаг бит на бит 7 (значение 128, недокументированный ), возможно ли знать значение?

Это - служебный флаг, который выставляет датафид, если у тика по какой-либо причине не был выставлен флаг TICK_FLAG_BID, при том что тик должен быть применён к бару.


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