Сборка стакана при помощи API
Atom Ответить
17.12.2012


Извиняюсь, если написал не в ту тему.

Я пытаюсь собрать стакан из ордерлога при помощи API, отсюда возник ряд вопросов.

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

Во-вторых, пусть мы рассматриваем только исполненные заявки:

foreach (OrderLogItem OLItem in reader)
{
if (!OLItem.IsMatched()) { continue; }
Order order = OLItem.Order;
if (order.Time >= t) { break; } //t - момент времени, на который собирается стакан
var tmp_trades = order.GetTrades(); //На этом моменте выскакивает ошибка ArgumentException: Заявка №№№ не имеет информацию о шлюзе. Parameter name: order

Как справиться с этой ошибкой, и какого типа можно делать объект tmp_trades?

Пытался так же сделать и по-другому:

if (!OLItem.IsMatched()) { continue; }
Trade trade = OLItem.Trade;
if (trade.Time <= t) { continue; }
decimal price = order.Price;
//Далее идет запись данных в массив, он не так и важна.

Но в этом случае возвращаются пустые массивы, то есть ни одна итерация не прошла условие цикла trade.Time > t

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

Заранее благодарен

Теги:


Спасибо:




13 Ответов
esper

Фотография
Программист
Дата: 17.12.2012
Ответить


Спасибо: abubakirov

abubakirov

Фотография
Дата: 17.12.2012
Ответить


Если я все правильно понял, то делаю следующее:

MarketDepth depth = new MarketDepth(security);
OrderLogMarketDepthBuilder depthBuilder = new OrderLogMarketDepthBuilder(depth);
foreach (OrderLogItem OLitem in reader)
{
if (OLItem.Order >= t) { break; }
depthBuilder.Update(OLItem); //Здесь выскакивает ошибка ArgumentOutOfRangeException: Котировка для заданной цены не была найдена. Parameter name: price. Actual value was 146390.
}
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 17.12.2012
Ответить


Цитата:
if (OLItem.Order >= t) { break; }

Зачем эта доп. проверка? Просто обрабатывайте все записи последовательно, время стакана будет равно времени последней обработанной записи.

Цитата:
Здесь выскакивает ошибка ArgumentOutOfRangeException: Котировка для заданной цены не была найдена. Parameter name: price. Actual value was 146390.

Ошибка говорит о том, что пришла запись о снятии заявки с указанной ценой, но такого уровня в стакане не было. Т.е. стакан до этого времени собран не верно. В Гидре есть построение стаканов с ордерлога, можете посмотреть исходники на кодеплексе.
Спасибо:

vk37

Фотография
Курсы
Дата: 22.10.2013
Ответить


esper Перейти
В Гидре есть построение стаканов с ордерлога, можете посмотреть исходники на кодеплексе.
Если речь идет о задаче по конвертации лога заявок в стакан в Гидре, то можно как-то посмотреть этот код? На кодплексе версия 4.1.9. Там такого функционала не нашел.

Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 22.10.2013
Ответить


vk37 Перейти
esper Перейти
В Гидре есть построение стаканов с ордерлога, можете посмотреть исходники на кодеплексе.
Если речь идет о задаче по конвертации лога заявок в стакан в Гидре, то можно как-то посмотреть этот код? На кодплексе версия 4.1.9. Там такого функционала не нашел.



Послал по скайпу.
Спасибо: vk37

vk37

Фотография
Курсы
Дата: 01.11.2013
Ответить


Попробовал построить стакан по ордер логу. Использовал OrderLogMarketDepthBuilder из версии 4.1.19.1. Ошибок в процессе преобразования RIZ3 не возникло. Результат преобразования отобразил на графике. Второй график - стакан и сделки полученные обычным образом. Что-то не соответствует одно другому )
FromOrderLog.png 142,4KB (0) FromPlazaRouter.png 163,4KB (0)
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.11.2013
Ответить


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

vk37

Фотография
Курсы
Дата: 01.11.2013
Ответить


Такая ситуация на большинстве торговых дней RIZ3 после клиринга. Разрывов данных нет. Странно, что если запустить построение стаканов с момента клиринга в том дне где ценовой уровень поменялся, то, вроде корректно строится. Проблемы при построении стаканов вечерней сессии после дневной. Только вечерняя строится, вроде, нормально.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.11.2013
Ответить


vk37 Перейти
Такая ситуация на большинстве торговых дней RIZ3 после клиринга. Разрывов данных нет. Странно, что если запустить построение стаканов с момента клиринга в том дне где ценовой уровень поменялся, то, вроде корректно строится. Проблемы при построении стаканов вечерней сессии после дневной. Только вечерняя строится, вроде, нормально.


А что говорит исходник?Smile
Спасибо:

vk37

Фотография
Курсы
Дата: 01.11.2013
Ответить


Построение, похоже, выполняется правильно, в т.ч. после клиринга. По видимому, ошибка появляется либо при сохранении построенных стаканов на диск, либо при последующем чтении стаканов с диска. Сохраняю стаканы максимальной глубины.
Спасибо:

vk37

Фотография
Курсы
Дата: 02.11.2013
Ответить


Предполагаю, что есть ошибка при сохранении стаканов. Ниже графики для стаканов глубиной int.Max, 1000, 100, 70. Чем меньше глубина стакана, тем более корректно он сохраняется. Размер файла quotes.bin с неограниченной глубиной стакана получился меньше, чем с глубиной 70.
MaxDepth.Int32.MaxValue.png 112,2KB (2) MaxDepth1000.png 110,3KB (1) MaxDepth100.png 112,2KB (0) MaxDepth70.png 112,2KB (0)
Спасибо:

vk37

Фотография
Курсы
Дата: 02.11.2013
Ответить


Если нужно, могу выслать исходники для воспроизведения ситуации.
Спасибо:

vk37

Фотография
Курсы
Дата: 21.11.2013
Ответить


Вторая попытка построить стакан максимальной глубины. Вроде, нормально строит )
MarketDepthMax.png 100,4KB (0)
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy