← Назад

Лог заявок (full order log -> анонимный order log)

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

Комментарии (45)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Alexander
Alexander

Вчера начал заниматься этим, но не закончил. Столкнулся со следующими проблемами:

  1. Первоначально, до начала сессии, стакан уже некий существует - его надо получить и именно им инициализировать стакан инструмента.
  2. Далее начинается анализ потока заявок - есть 3 статуса - а) добавлена б) отменена в) сведена в сделку.

а) Заявка может быть добавлена с любой абсолютно ценой. К примеру, у нас в стакане офер на 11, бид на 9. Мы легко можем послать заявку бай с ценой 15. тогда в ордер_лог будет как раз: <добавлена> 15 Нам же для этого случая (цена > офера) не надо добавлять бид с ценой 15, нам надо просто запомнить что такая заявка есть. Иначе у нас поплывёт весь стакан и мы неправильно будем дальше его строить - Лучший_бид \ лучший_аск, биды, аски будут абсолютно неверными.

б) Отменена - тут всё понятно - просто cancel, удаляем нужный объём.

в) Сведена - тоже понятно, просто уменьшаем на сведённый объём.

Есть вопрос по реализации пункта 1) и по тому как корректно реализовать 2а). Свой вариант для 2а) положил на codeplex, но считаю его далеко не оптимальным.

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

Alexander
Alexander

С помощью Limfocit добавлена поддержка построения стакана по полному ордер логу. 😎

transdex
transdex

Alexander Mukhanchikov: С помощью Limfocit добавлена поддержка построения стакана по полному ордер логу. 😎

Ну и как, сильно отличается от стакана, построенного обычным образом?

Mikhail Sukhov
Mikhail Sukhov Автор

transdex: Ну и как, сильно отличается от стакана, построенного обычным образом?

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

Liberal
Liberal

Alexander Mukhanchikov: С помощью Limfocit добавлена поддержка построения стакана по полному ордер логу. 😎

Не могли бы показать место в документации, с функциями построения стаканов по ордер логу? Есть ли возможность по логу заявок, скачанному вот отсюда: http://ftp.rts.ru/pub/info/historical_data/ строить стаканы? Я в процессе написания соответствующего кода, но что-то нет уверенности в его корректной работе.

Alexander
Alexander

Liberal:

Alexander Mukhanchikov: С помощью Limfocit добавлена поддержка построения стакана по полному ордер логу. 😎

Не могли бы показать место в документации, с функциями построения стаканов по ордер логу? Есть ли возможность по логу заявок, скачанному вот отсюда: http://ftp.rts.ru/pub/info/historical_data/ строить стаканы? Я в процессе написания соответствующего кода, но что-то нет уверенности в его корректной работе.

PlazaTrader.CreateDepthFromOrdersLog

transdex
transdex

Так Вы что, каждую заявку отдельно обрабатываете? Т.е. не так как в ядре РТС?

Alexander
Alexander

transdex: Так Вы что, каждую заявку отдельно обрабатываете? Т.е. не так как в ядре РТС?

приходит ордер лог - он обрабатывается от стакана построенного обычным образом ничем не отличается и отличаться кроме скорости и синхронизации с заявками не должно

transdex
transdex

Alexander Mukhanchikov: приходит ордер лог - он обрабатывается Давайте точнее выражаться. Приходит отдельные заявки или пакеты (очереди заявок)за некоторый интервал времени?

Alexander
Alexander

transdex:

Alexander Mukhanchikov: приходит ордер лог - он обрабатывается Давайте точнее выражаться. Приходит отдельные заявки или пакеты (очереди заявок)за некоторый интервал времени?

приходит новая порция данных по таблице ордер_лога от биржи. она обрабатывается, соответствующим образом меняется стакан

если интересно ещё точнее - подпишитесь на событие добавление новой записи в таблицу ордер лога и смотрите что присылает биржа.

Mikhail Sukhov
Mikhail Sukhov Автор

transdex: Так Вы что, каждую заявку отдельно обрабатываете? Т.е. не так как в ядре РТС?

Если учитывать, что ядро РТС строит стаканы так, что оно по тайм стемпу не совпадает со сделками, то да, мы не так как в РТС😀

transdex
transdex

Мой интерес отнюдь не праздный. Порожден он призывами ( раздающимися на некоторых форумах - rts.ru, smart-lab.ru) запретить Full_Order_Log как Вселенское зло, ибо он позволяет куклу видеть будущее и обижать маленьких. С другой стороны, по моим прикидкам (на РТС не работаю, тонких деталей не знаю, могу и ошибаться) возможен вариант, что ордерлог это просто лог, т.е. история построения текущего агрегированного стакана. Соответственно стакан построенный по ордерлогу будет (в среднем) отставать от текущего агрегированного стакана. Хотя и мельтешит.

Mikhail Sukhov
Mikhail Sukhov Автор

transdex: Соответственно стакан построенный по ордерлогу будет (в среднем) отставать от текущего агрегированного стакана.

Про Ахиллеса и черепаху слышали?

transdex
transdex

Mikhail Sukhov: Про Ахиллеса и черепаху слышали?

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

vlad1024
vlad1024

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

transdex
transdex

vlad1024: обычно орделог это и есть первичная информация по которой сводятся заявки и которую отдает ядро, а стаканы вообще может сводить уже брокер и раздавать клиентам, по крайней мере такая ситуация на многих западных площадках. Вопрос в том - когда отдает ядро? Раньше чем агрегированый стакан или одновременно? Одновременно - значит в конце интервала накопления ордеров они обрабатываются ядром практически мгновенно и наступает момент рассылки анонимных данных - одновременно уходит пачка апдейтов переводящих предыдущее состояние агрегированного стакана в текущее, пачка ордеров, обработка которых на месте также переводит предыдущее состояние стакана в текущее и пачка сделок меченных одним временем.

Alexander
Alexander

transdex:

vlad1024: обычно орделог это и есть первичная информация по которой сводятся заявки и которую отдает ядро, а стаканы вообще может сводить уже брокер и раздавать клиентам, по крайней мере такая ситуация на многих западных площадках. Вопрос в том - когда отдает ядро? Раньше чем агрегированый стакан или одновременно? Одновременно - значит в конце интервала накопления ордеров они обрабатываются ядром практически мгновенно и наступает момент рассылки анонимных данных - одновременно уходит пачка апдейтов переводящих предыдущее состояние агрегированного стакана в текущее, пачка ордеров, обработка которых на месте также переводит предыдущее состояние стакана в текущее и пачка сделок меченных одним временем.

мне кажется проще самому сделать быстрый тест получения стакана и всё встанет на свои места,подобные вопросы отпадут

Макс
Макс

А в тестовом доступе на Плазу транслируется FullOrderLog ?

Alexander
Alexander

Макс: А в тестовом доступе на Плазу транслируется FullOrderLog ?

да

Макс
Макс

Alexander Mukhanchikov:

Макс: А в тестовом доступе на Плазу транслируется FullOrderLog ?

да Есть ли пример или описание как получить доступ к нему (FullOrderLog через s#)?

Alexander
Alexander

Макс:

Alexander Mukhanchikov:

Макс: А в тестовом доступе на Плазу транслируется FullOrderLog ?

да Есть ли пример или описание как получить доступ к нему (FullOrderLog через s#)?

SampleGui

FiNick
FiNick

Alexander Mukhanchikov:

Макс: А в тестовом доступе на Плазу транслируется FullOrderLog ?

да

Версия 4.1.1. Подключаюсь к тестовому контуру. Подписываюсь на plaza.NewOrderLogItems, на старте выполняю plaza.RegisterOrderLog(security). Событие NewOrderLogItems не приходит, хотя стакан обновляется.

Пробовал подключиться к тестовому контуру гидрой. В логе огромное число ошибок типа: 02:46:58.0813267 Plaza Сохранение лога заявок для LKU2@RTS 02:46:58.0823267 Plaza System.ArgumentOutOfRangeException: Неправильный объем заявки. Parameter name: items Actual value was 0.

Mikhail Sukhov
Mikhail Sukhov Автор

FiNick: Версия 4.1.1. Подключаюсь к тестовому контуру.

SampleGUI так же себя ведет?

VirKato
VirKato

Два вопроса: 1)После объединения micex предоставляет full order log по основной площадке? 2)Где можно купить ордер лог по фондовой секции micex (интересуют синие чипсы)? Спасибо!

Alexander
Alexander

нет \ нигде, нет в природе. по крайней мере в открытом доступе для покупки

VirKato
VirKato

т.е. максимум, что провайдит micex это обычный стакан который мы видим в квике? http://rts.micex.ru/a235

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

FiNick
FiNick

SampleGUI вроде нормально, попробую разобраться. Но гидра глючит

Mikhail Sukhov
Mikhail Sukhov Автор

FiNick: SampleGUI вроде нормально, попробую разобраться. Но гидра глючит

У нас она работает на ОЛ.

FiNick
FiNick

А что вообще делает метод trader.RegisterOrderLog?? Что он есть, что нету, разницы не вижу.

Кстати, написал свою программку, которая собирает OrderLogItems. При попытке сохранить OrderLogItems в хранилище возникает та же ошибка, что и у Гидры: вроде как встречаются ордера с обьемом 0. Попробую их отфильтровать.

Вопрос: разве никто не тестировал гидру на сохранение OrderLogItems? Только у меня эта ошибка?

FiNick
FiNick

Не получается отфильтровать. Та же ошибка: Ошибка | Неправильный объем заявки. Parameter name: items Actual value was 0.

Ошибка возникает при попытке сделать storage.GetOrderLogStorage(rFut, dataPath).Save(OLItems). Какой конкретно OrderLogItem ему не нравится не понятно, и что это за параметр items тоже не понятно. Гидра на этом же падает.

FiNick
FiNick

Заметил вот такую вот ерунду: из 10000 первых OrderLogItems за сегодня, у 380 через некоторое время Order'а сменили обьем, 344 из них сменили обьем на 0. Соответственно в итоговом списке, который я собираюсь сохранить на жесткий диск через storage.GetOrderLogStorage.Save оказалась куча ордеров с обьемом 0, и сохранение вылетает с ошибкой! Тут мне пришла гениальная мысль: может обьем ставится в 0 когда заявку отменяют? Тогда почему сохранение на диск ругается на такие заявки?

Mikhail Sukhov
Mikhail Sukhov Автор

FiNick: Заметил вот такую вот ерунду: из 10000 первых OrderLogItems за сегодня, у 380 через некоторое время Order'а сменили обьем, 344 из них сменили обьем на 0. Соответственно в итоговом списке, который я собираюсь сохранить на жесткий диск через storage.GetOrderLogStorage.Save оказалась куча ордеров с обьемом 0, и сохранение вылетает с ошибкой! Тут мне пришла гениальная мысль: может обьем ставится в 0 когда заявку отменяют? Тогда почему сохранение на диск ругается на такие заявки?

Объем в ОЛ - это объем операции. Ни регистрация ни снятие ни сведение не может иметь нулевой объем. Что-то у вас в данных, которые приходят... SampleGUI нормально работает с хранилищем?

FiNick
FiNick

SampleGUI не использует хранилище вроде, если только я сам в коде не напишу. Тут стакан у SampleGUI совершенно неправильно считается, прикрепил фотку. По мере того, как скачиваются OrderLogItems стакан все больше и больше накапливает ошибку.

Mikhail Sukhov
Mikhail Sukhov Автор

FiNick: SampleGUI не использует хранилище вроде, если только я сам в коде не напишу. Тут стакан у SampleGUI совершенно неправильно считается, прикрепил фотку. По мере того, как скачиваются OrderLogItems стакан все больше и больше накапливает ошибку.

Версия с транка так же ведет себя?

FiNick
FiNick

Да, с транка также. Кстати, если к тестовому серверу коннектиться, то вроде стакан правильно строится (и dev, и trunk). У меня версия исходников stocksharp-18055

А нет, вру, на тестовом также стакан глючит, но меньше

FiNick
FiNick

SampleGUI с Release 4.1.1 версии, вроде не вижу ошибок в стакане. Я себе в робота запихал самые последние библиотеки 4.1.2, а они походу глючные. Завтра откачу до релиз 4.1.1 и посмотрю что там.

Maxim
Maxim

День добрый.

1) Уважаемые, что получилось в итоге? Быстрее формировать стакан из лога или получать обычным способом? Или самому надо тестировать? 🙄

2) И второй вопрос. Откуда лучше брать BestBid и BestAsk? Под лучше, я имею ввиду где меньшая задержка от биржы. Насколько я понимаю, сейчас есть три варианта (например, для фьючерсов):

а) через поток FORTS_FUTAGGR5_REPL. Правильно ли я понимаю, что этому потоку соответствует MarketDepth.BestAsk и MarketDepth.BestBid?

б) через поток FORTS_FUTCOMMON_REPL Правильно ли я понимаю, что этому потоку соответствует Security.BestBid и Security.BestAsk?

в) через формирование стакана из ОрдерЛога. Правильно ли я понимаю, что в этом случае аналогично варианту а) надо использовать MarketDepth.BestAsk и MarketDepth.BestBid?

Maxim
Maxim

Maxim: День добрый.

1) Уважаемые, что получилось в итоге? Быстрее формировать стакан из лога или получать обычным способом? Или самому надо тестировать? 🙄

2) И второй вопрос. Откуда лучше брать BestBid и BestAsk? Под лучше, я имею ввиду где меньшая задержка от биржы. Насколько я понимаю, сейчас есть три варианта (например, для фьючерсов):

а) через поток FORTS_FUTAGGR5_REPL. Правильно ли я понимаю, что этому потоку соответствует MarketDepth.BestAsk и MarketDepth.BestBid?

б) через поток FORTS_FUTCOMMON_REPL Правильно ли я понимаю, что этому потоку соответствует Security.BestBid и Security.BestAsk?

в) через формирование стакана из ОрдерЛога. Правильно ли я понимаю, что в этом случае аналогично варианту а) надо использовать MarketDepth.BestAsk и MarketDepth.BestBid?

Михаил, Алекс, можете ответить на вопросы? 🙂 Или кто другой может знает?

FiNick
FiNick

Уважаемые коллеги,

Обращаем Ваше внимание на изменение в порядке предоставления услуги "полный журнал заявок".

С 17.04.2012 начата передача анонимного лога заявок в отдельном потоке FORTS_ORDLOG_REPL с таблицами orders_log, multileg_orders_log, sys_events, так же следует обратить внимание на объединение данных по фьючерсным и опционным заявкам в одной таблице.

С 20.07.2012 отключается передача полного анонимного журнала заявок в потоках FORTS_FUTTRADE_REPL и FORTS_OPTTRADE_REPL, таблицы orders_log, multileg_orders_log.

Начиная с 23.07.2012 в данных таблицах останутся только Ваши собственные заявки. Всем пользователям данной услуги необходимо убедится в том, что к 20.07.2012 вы получаете полный журнал заявок из нового потока FORTS_ORDLOG_REPL, обратная совместимость не сохраняется!

Что делать??

Alexander
Alexander

FiNick: Уважаемые коллеги,

Обращаем Ваше внимание на изменение в порядке предоставления услуги "полный журнал заявок".

С 17.04.2012 начата передача анонимного лога заявок в отдельном потоке FORTS_ORDLOG_REPL с таблицами orders_log, multileg_orders_log, sys_events, так же следует обратить внимание на объединение данных по фьючерсным и опционным заявкам в одной таблице.

С 20.07.2012 отключается передача полного анонимного журнала заявок в потоках FORTS_FUTTRADE_REPL и FORTS_OPTTRADE_REPL, таблицы orders_log, multileg_orders_log.

Начиная с 23.07.2012 в данных таблицах останутся только Ваши собственные заявки. Всем пользователям данной услуги необходимо убедится в том, что к 20.07.2012 вы получаете полный журнал заявок из нового потока FORTS_ORDLOG_REPL, обратная совместимость не сохраняется!

Что делать??

Переходить полностью на StockSharp если вы этого ещё не сделали. Поток FORTS_ORDLOG_REPL мы поддержали уже давно, когда другие об этом даже и не думали.

FiNick
FiNick

Я и так "полностью на StockSharp"=) Вы хотите сказать, что StockSharp уже давно получает полный ордер лог из потока FORTS_ORDLOG_REPL, потому никаких изменений в программу вносить не надо?

Alexander
Alexander

Да

Alexander
Alexander
  1. Я не сравнивал. По моим предположениям - чётко что одно быстрее другого не будет. Когда как
  2. security.BestBid \ security.BestAsk или marketdepth.BestBid \ marketDepth.BestAsk

они обновляются вместе

Liberal
Liberal

Формирую стакан по Order Log (trader.CreateDepthFromOrdersLog = true). В стратегию добавляют событие Security.WhenNewOrderLogItems(). Первая обработка события соответствует первой поступившей строке Order Log. Стакан должен быть еще не сформирован. Тем не менее Security.GetMarketDepth().Bids и Security.GetMarketDepth().Asks показывают множество значений. Вопрос, откуда они берутся? Может быть, начальное состояние стакана генерируется случайно, а дальше идет его обновление по Order Log? Или, может быть, первые несколько событий не срабатывают, и за это время формируется стакан?

Для контроля я попробовал не формировать стакан из лога (trader.CreateDepthFromOrdersLog = false), и тогда при первом вызове события Security.WhenNewOrderLogItems(), получаю, как это и должно быть ночью на выходных, пустой стакан.

FlashPlayer
FlashPlayer

Доброго дня! Помогите пожалуйста разобраться с одной проблемой. Подключаюсь к тестовому серверу с помощью Плазы 2. Запускаю SampleGui последней редакции 4.1.6. Начинаю получать сделки, инструменты, стаканы по ним, могу отправить заявку, снять ее и даже сделать сделку, НО совершенно никак не реагирует программа на событие Trader.NewOrderLogItems += items => items.ForEach(_ordersLogWindow.AddOperation); То есть можно поставить там брейкпоинт, но на него мы никогда не упадем. Я пишу именно про СемплГуи, так как попытался сначала сам подписаться в своем проекте на получение ОЛ, но у меня ничего не получилось - подумал, что делаю что-то не так, но и в вашем примере к сожалению это не работает тоже. Потом я подумал, что все дело в тестовом сервере, но потом наткнулся на эту тему - тут как раз выше человек пишет, что СемплГуи даже версии 4.1.1 у него работает на тестовом сервере, хотя эта версия у меня тоже не реагирует на события нового ордерлогайтима. Помогите пожалуйста разобраться - что может быть не так? И только у меня одного не работает получение изменений ордерлога на тестовом? Может быть все таки проблема в самом тестовом сервере и оттуда просто не транслируется данная информация? Спасибо.