Сохранение стакана

Страницы: 1
RSS
Сохранение стакана, Описание эксперимента с сохранением стакана
 
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
который потом записывается в файл. Очередность в итоговом списке такая же, какая случилась при вызовах коллбэков. Это небольшой кусочек списка, где стакан обозначен знаком =, а сделка знаком *:

=**=****===*====*===*==*=========***=***=**********=====*

Видно, что данные приходят срезами(иначе не было бы нескольких сделок подряд без изменения стакана, такое невозможно). И тут возникает вопрос: а как определить временную метку полученного стакана?? У каждой сделки такая метка есть.

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

А что в Quik? Сохранить последовательность стаканов я могу, но без временных меток они не имеют много смысла.

Поэтому вопросы к разработчикам:
1) Где-то в недрах ваших систем есть временные метки для стаканов? Ведь биржа время заявки шлет. Если это есть, то почему бы это не передать в тот же коллбэк OnQuote, или в getQuoteLevel2?
2) Если таких временных меток на стакане у вас нет, то как вообще вы синхронизируете тот же стакан и таблицу всех сделок, графики да и все остальное, что имеет метку времени? Или же НИКАК??

Моя задача проста: распределить сделки и полученные стаканы на оси времени в верном порядке. Готов выслушать любые предложения:)

P.S. Если кому интересно: файл с записью такой информации только за вечернюю сессию по одному из инструментов срочного рынка занял 97 Мб.
 
Delv, добрый день.

Приносим свои извинения за длительное отсутствие реакции на Ваше обращение.


1. Информация по котировкам поступает без временных меток.
2. Указанные данные транслируются в разных потоках, их синхронизация не выполняется.
 
2) ничего не синхронизируется. Всё едет независимо. Как приехало - так отобразили.
Купили историю заявок на бирже? Серьёзно??
В вашем файле время формирования информации, не более.
 
Цитата
Delv написал:
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
который потом записывается в файл. Очередность в итоговом списке такая же, какая случилась при вызовах коллбэков. Это небольшой кусочек списка, где стакан обозначен знаком =, а сделка знаком *:

=**=****===*====*===*==*=========***=***=**********=====*

Видно, что данные приходят срезами(иначе не было бы нескольких сделок подряд без изменения стакана, такое невозможно). И тут возникает вопрос: а как определить временную метку полученного стакана?? У каждой сделки такая метка есть.

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

А что в Quik? Сохранить последовательность стаканов я могу, но без временных меток они не имеют много смысла.

Поэтому вопросы к разработчикам:
1) Где-то в недрах ваших систем есть временные метки для стаканов? Ведь биржа время заявки шлет. Если это есть, то почему бы это не передать в тот же коллбэк OnQuote, или в getQuoteLevel2?
2) Если таких временных меток на стакане у вас нет, то как вообще вы синхронизируете тот же стакан и таблицу всех сделок, графики да и все остальное, что имеет метку времени? Или же НИКАК??

Моя задача проста: распределить сделки и полученные стаканы на оси времени в верном порядке. Готов выслушать любые предложения:)

P.S. Если кому интересно: файл с записью такой информации только за вечернюю сессию по одному из инструментов срочного рынка занял 97 Мб.
Стакан не приходит целиком. Он передается лишь изменениями. Кроме того, есть сделки, заявки по которым никогда не появляются в стакане.
---------------
сделки в таблицу обезличенных сделок а следовательно и в колбек ALLTrades приходят не срезами, а блоками.
Срезы не гарантируют отсутствие пропусков, а обезличенные сделки приходят без пропусков, но кучей одновременно.
 
Ваша идея не осуществима.
Единственное решение - купить у биржи или торговцев информации с биржи эту информацию.
Но остается вопрос - А смысл?
 
Цитата
Купили историю заявок на бирже? Серьёзно??
В вашем файле время формирования информации, не более.
Нет, не покупал. Но предложение такое от биржи есть. Стоит недешево.
Честно говоря, не знаю, что именно за время биржа ставит на каждую заявку...Но по крайней мере оно там есть.
А тут, в QUIK у нас получается, что: все едет независимо и в итоге неясно, куда какой кадр стакана относится. То ли он сделку опередил и приехал первым, то ли он опоздал...
 
Цитата
---------------
сделки в таблицу обезличенных сделок а следовательно и в колбек ALLTrades приходят не срезами, а блоками.
Срезы не гарантируют отсутствие пропусков, а обезличенные сделки приходят без пропусков, но кучей одновременно.
Так в чем разница срезов и блоков? В пропуске данных?
 
Вот так этот поток выглядит:

+ Price: 2.451(1)
= Bid: 2.450(98) | Ask: 2.451(52)
= Bid: 2.450(98) | Ask: 2.451(52)
= Bid: 2.450(98) | Ask: 2.451(52)
= Bid: 2.450(98) | Ask: 2.451(52)
= Bid: 2.450(98) | Ask: 2.451(52)
= Bid: 2.450(95) | Ask: 2.451(52)
= Bid: 2.450(95) | Ask: 2.451(52)
+ Price: 2.451(1)
= Bid: 2.450(95) | Ask: 2.451(51)
= Bid: 2.450(95) | Ask: 2.451(51)
= Bid: 2.449(149) | Ask: 2.451(65)
-  Price: 2.450(3)
-  Price: 2.450(2)
-  Price: 2.450(65)
-  Price: 2.450(15) ## 1 ##
-  Price: 2.450(10)
= Bid: 2.449(149) | Ask: 2.451(65)
= Bid: 2.449(149) | Ask: 2.451(65)
= Bid: 2.449(149) | Ask: 2.451(65)
= Bid: 2.449(149) | Ask: 2.451(65)
= Bid: 2.449(149) | Ask: 2.451(65)
= Bid: 2.449(149) | Ask: 2.451(66)
= Bid: 2.449(149) | Ask: 2.451(66)
= Bid: 2.449(149) | Ask: 2.451(66)
= Bid: 2.449(149) | Ask: 2.451(86)
= Bid: 2.449(149) | Ask: 2.451(86)
= Bid: 2.449(149) | Ask: 2.451(86)
= Bid: 2.449(149) | Ask: 2.451(86)
= Bid: 2.449(149) | Ask: 2.451(144)
= Bid: 2.449(145) | Ask: 2.451(144)
-  Price: 2.449(1)
-  Price: 2.449(3)
= Bid: 2.449(145) | Ask: 2.451(145)
= Bid: 2.449(145) | Ask: 2.451(145)
= Bid: 2.449(145) | Ask: 2.451(125)
-  Price: 2.450(1)
= Bid: 2.449(93) | Ask: 2.450(62)
= Bid: 2.449(93) | Ask: 2.450(61)
+ Price: 2.450(1)
= Bid: 2.449(93) | Ask: 2.450(61)
= Bid: 2.449(93) | Ask: 2.450(61)
= Bid: 2.449(93) | Ask: 2.450(81)
+ Price: 2.450(2)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(79)
= Bid: 2.449(93) | Ask: 2.450(77)
+ Price: 2.450(2)
= Bid: 2.449(93) | Ask: 2.450(64)
+ Price: 2.450(5)
= Bid: 2.449(93) | Ask: 2.450(64)
= Bid: 2.449(93) | Ask: 2.450(64)
= Bid: 2.449(93) | Ask: 2.450(64)
= Bid: 2.449(93) | Ask: 2.450(64)
= Bid: 2.449(93) | Ask: 2.450(64)
= Bid: 2.449(93) | Ask: 2.450(64)
= Bid: 2.449(93) | Ask: 2.450(60)
+ Price: 2.450(4)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(93) | Ask: 2.450(60)
= Bid: 2.449(98) | Ask: 2.450(60)
= Bid: 2.449(98) | Ask: 2.450(60)
= Bid: 2.449(98) | Ask: 2.450(60)
= Bid: 2.449(98) | Ask: 2.450(53)
+ Price: 2.450(7)
= Bid: 2.449(99) | Ask: 2.450(53)
= Bid: 2.449(99) | Ask: 2.450(53)
= Bid: 2.449(99) | Ask: 2.450(52)
+ Price: 2.450(1)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(52)
= Bid: 2.449(99) | Ask: 2.450(32)
= Bid: 2.449(99) | Ask: 2.450(32)
= Bid: 2.449(99) | Ask: 2.450(32)
= Bid: 2.449(99) | Ask: 2.450(32)
= Bid: 2.449(99) | Ask: 2.450(32)
= Bid: 2.449(99) | Ask: 2.450(32)
= Bid: 2.449(103) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(32)
= Bid: 2.449(106) | Ask: 2.450(4)
+ Price: 2.450(20)
= Bid: 2.450(1) | Ask: 2.451(115)
+ Price: 2.450(4)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.449(410) | Ask: 2.451(123)
-  Price: 2.450(1)
= Bid: 2.449(410) | Ask: 2.451(123)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.450(1) | Ask: 2.451(115)
= Bid: 2.449(410) | Ask: 2.451(123)
-  Price: 2.450(1)
= Bid: 2.449(410) | Ask: 2.451(123)
= Bid: 2.449(410) | Ask: 2.451(123)
= Bid: 2.449(410) | Ask: 2.451(123)
-  Price: 2.449(1)
= Bid: 2.449(409) | Ask: 2.451(123)
+ Price: 2.451(5)
= Bid: 2.449(409) | Ask: 2.451(118)
= Bid: 2.450(80) | Ask: 2.451(106)
= Bid: 2.450(80) | Ask: 2.451(98)
- Price: 2.450(10)
= Bid: 2.450(70) | Ask: 2.451(98)
= Bid: 2.450(70) | Ask: 2.451(98)
= Bid: 2.450(70) | Ask: 2.451(98)
-  Price: 2.450(6)
= Bid: 2.450(64) | Ask: 2.451(98)
= Bid: 2.450(64) | Ask: 2.451(93)
+ Price: 2.451(5)
= Bid: 2.450(64) | Ask: 2.451(88)
+ Price: 2.451(5)
= Bid: 2.449(381) | Ask: 2.451(88)
-  Price: 2.450(64)
-  Price: 2.449(4)
-  Price: 2.449(1)
-  Price: 2.449(1)
-  Price: 2.449(1)
-  Price: 2.449(1)
= Bid: 2.449(373) | Ask: 2.451(107)
-  Price: 2.449(50)

Это только небольшая часть.
Вот такое вот обозначение ## 1 ## показывает разницу времени в миллисекундах относительно предыдущей сделки.
Хотел прикрепить целый файл, но форум выдает какую-то ошибку.
Здесь показаны только Bid/Ask и количество заявок на этих уровнях. В списке же хранится весь полученный стакан(50 позиций в каждую сторону). Инструмент - фьючерс на природный газ.
 
Цитата
nikolz написал:
Ваша идея не осуществима.
Единственное решение - купить у биржи или торговцев информации с биржи эту информацию.
Но остается вопрос - А смысл?
Да, именно это следует из ответа техподдержки. Решение купить дорогое в общем-то. К тому же купленную информацию придется еще обрабатывать, собирая из нее стакан.
Смысл? Да их масса. Например скормить эти стаканы нейросети, обучив ее на что-то.  
 
Delv, О, Господи! Который раз у нас нейросети? Самое смешное, что за них, кажется, топил сам nikolz. :smile:  
 
Цитата
Владимир написал:
Delv, О, Господи! Который раз у нас нейросети? Самое смешное, что за них, кажется, топил сам nikolz. ::  
Даже не знаю, который. А что не так с нейросетями? Прекрасный фильтр, так-то. Впрочем, даже без нейросетей стакан интересен. Там многое можно увидеть.
 
Delv, Да всё не так с нейросетями. Если уж сам разработчик не знает как надо торговать, то его поделие и подавно опозорится. Было тут несколько поклонников нейросетей - приходили с гнутыми пальцами и наполеоновскими планами, а потом тихо и бесследно исчезали. А в стакане можно увидеть.разве что то, что там ХОТЯТ показать. Рынок двигают сделки, а не суходроч в стакане.
 
Цитата
Владимир написал:
А в стакане можно увидеть.разве что то, что там ХОТЯТ показать. Рынок двигают сделки, а не суходроч в стакане.
Совершенно верно. То, что хотят показать. Но из этого тоже можно сделать выводы.
Что касается "гнутых" пальцев: все эти финансовые ряды не стационарны. То есть статистические методы на них бессильны. Остается только выдумывать нечто. Ну например: вряд ли человек сможет адекватно и быстро анализировать сразу несколько потоков. Типа основного тренда плюс анализ разных сопутствующих данных. Участвовал в одном проекте от GeekBrains на эту тему. Было там интересное решение одного из участников. Анализ поведения индекса S&P500 и предсказание его движения(краткосрочного) путем построения языковой модели и анализа с ее помощью новостного фона. Результаты там были просто космос. Больше 70% точности!  
 
Delv, А на кой? Какое нам дело, что нам ХОТЯТ показать? Пусть показывают, что хотят, а мы будем торговать так, как МЫ хотим.

Согласен, "статистические методы бессильны". Но зачем "выдумывать нечто"? Всё уже украдено до нас (с). Естественно, "человек не сможет адекватно и быстро анализировать сразу несколько потоков" - для того и скрипт. он никогда не устаёт, всегда внимателен, умеет быстро и точно считать, у него крепкие нервы - что ещё надо? А вот предсказывать движение курса пока что никому не удавалось за всё время существования биржи.
 
Цитата
Delv написал:
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
Забыл сказать Вам ранее.
1) Существуют сделки, которых нет в стакане.
2) Для эксперимента можно сделать так.
Синхронизируйте часы компьютера от сервера точного времени. При этом проверьте на сколько будет уходить время на Вашем компьютере.
Реально получить 2-5 ms .
Потом пишите стакан и сделки с метками компьютерного времени.
Потом обработайте файл с оценкой разницы компьютерного времени и времени сделок.
В итоге Вы получите, что сделки приходят к Вам с запозданием
Сделки и срезы стаканов могут приходит в одном пакете.
Количество изменений стакана  в действительности всегда больше чем число совершенных сделок.
Но выбор среза стакана очевидно определяется не моментом совершения сделок, либо не только.
-----------------
В любом случае, если так сделаете, то узнаете много нового.
===============
Прим: Когда-то давно привозили данные с биржи по сделкам для экспертизы в рамках одного уголовного дела.
Там много чего есть интересного.
 
Цитата
Владимир написал:
Delv, А на кой? Какое нам дело, что нам ХОТЯТ показать? Пусть показывают, что хотят, а мы будем торговать так, как МЫ хотим.

Согласен, "статистические методы бессильны". Но зачем "выдумывать нечто"? Всё уже украдено до нас (с). Естественно, "человек не сможет адекватно и быстро анализировать сразу несколько потоков" - для того и скрипт. он никогда не устаёт, всегда внимателен, умеет быстро и точно считать, у него крепкие нервы - что ещё надо? А вот предсказывать движение курса пока что никому не удавалось за всё время существования биржи.
Не могу ответить "на кой", пока не попробую. Как попробую - расскажу, поучилось или нет. Без нюансов и подробностей естественно:)
 
Цитата
А вот предсказывать движение курса пока что никому не удавалось за всё время существования биржи.
Я не был бы так уверен!! Просто те, у кого это получилось, рассказывать об этом не будут. Ну я бы не стал. Любая стратегия на рынке имеет свои пределы. Если в нее загнать некое критическое количество трейдеров, она просто перестанет работать.
 
Цитата
nikolz написал:
Цитата
Delv написал:
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
Забыл сказать Вам ранее.
1) Существуют сделки, которых нет в стакане.
2) Для эксперимента можно сделать так.
Синхронизируйте часы компьютера от сервера точного времени. При этом проверьте на сколько будет уходить время на Вашем компьютере.
Реально получить 2-5 ms .
Потом пишите стакан и сделки с метками компьютерного времени.
Потом обработайте файл с оценкой разницы компьютерного времени и времени сделок.
В итоге Вы получите, что сделки приходят к Вам с запозданием
Сделки и срезы стаканов могут приходит в одном пакете.
Количество изменений стакана  в действительности всегда больше чем число совершенных сделок.
Но выбор среза стакана очевидно определяется не моментом совершения сделок, либо не только.
-----------------
В любом случае, если так сделаете, то узнаете много нового.
===============
Прим: Когда-то давно привозили данные с биржи по сделкам для экспертизы в рамках одного уголовного дела.
Там много чего есть интересного.
Спасибо, надо будет поинтересоваться. Пока же я буду просто использовать очередность сделок и кадров стакана. Разница по времени там небольшая будет. Те же 2-5 мс для меня не имеют особого значения, так как на сделку(отправка заявки на биржу и получение ответа по транзакции) уходит куда больше. До 250 мс.
 
Цитата
Delv написал:
Цитата
nikolz написал:
 
Цитата
Delv  написал:
Решил сохранить историческую информацию о стаканах по отдельно взятому инструменту.
Есть 2 обработчика: OnQuote и OnAllTrades. В обоих стоит фильтрация по инструменту. События из них кладутся в некий общий список(std::list<std::any>),
 Забыл сказать Вам ранее.
1) Существуют сделки, которых нет в стакане.
2) Для эксперимента можно сделать так.
Синхронизируйте часы компьютера от сервера точного времени. При этом проверьте на сколько будет уходить время на Вашем компьютере.
Реально получить 2-5 ms .
Потом пишите стакан и сделки с метками компьютерного времени.
Потом обработайте файл с оценкой разницы компьютерного времени и времени сделок.
В итоге Вы получите, что сделки приходят к Вам с запозданием
Сделки и срезы стаканов могут приходит в одном пакете.
Количество изменений стакана  в действительности всегда больше чем число совершенных сделок.
Но выбор среза стакана очевидно определяется не моментом совершения сделок, либо не только.
-----------------
В любом случае, если так сделаете, то узнаете много нового.
===============
Прим: Когда-то давно привозили данные с биржи по сделкам для экспертизы в рамках одного уголовного дела.
Там много чего есть интересного.
Спасибо, надо будет поинтересоваться. Пока же я буду просто использовать очередность сделок и кадров стакана. Разница по времени там небольшая будет. Те же 2-5 мс для меня не имеют особого значения, так как на сделку(отправка заявки на биржу и получение ответа по транзакции) уходит куда больше. До 250 мс.
2-5 ms - это  не задержка прихода, а ошибка синхронизации времени компьютера относительно времени биржи.
Эта величина погрешности. Вы же не используете градусник у которого погрешность измерения 10 градусов.
-----------------------------
На форуме я выкладывал результаты измерения запаздывания прихода сделок и свечей. Получались даже секунды, а для свечей десятки секунд.
----------------
Но если Вам все равно, но какой смысл вообще смотреть вчерашний день.
 
Delv, Общее утверждение опровергается частным. Пример - в студию! Просто те, у кого это получилось, узнавали об этом ПОСЛЕ того как, а если не получалось, тем более молчали в тряпочку. А пределы моей стратегии настолько безграничны, что мне по гроб жизни хватит.
Цитата
на сделку (отправка заявки на биржу и получение ответа по транзакции) уходит куда больше. До 250 мс.
Оптимист! Если я правильно помню, мой личный рекорд по задержке 17 с половиной МИНУТ.
Страницы: 1
Читают тему
Наверх