Вчера начал заниматься этим, но не закончил.
Столкнулся со следующими проблемами:
- Первоначально, до начала сессии, стакан уже некий существует - его надо получить и именно им инициализировать стакан инструмента.
- Далее начинается анализ потока заявок - есть 3 статуса -
а) добавлена
б) отменена
в) сведена в сделку.
а) Заявка может быть добавлена с любой абсолютно ценой. К примеру, у нас в стакане офер на 11, бид на 9. Мы легко можем послать заявку бай с ценой 15.
тогда в ордер_лог будет как раз:
<добавлена> 15
Нам же для этого случая (цена > офера) не надо добавлять бид с ценой 15, нам надо просто запомнить что такая заявка есть. Иначе у нас поплывёт весь стакан и мы неправильно будем дальше его строить - Лучший_бид \ лучший_аск, биды, аски будут абсолютно неверными.
б) Отменена - тут всё понятно - просто cancel, удаляем нужный объём.
в) Сведена - тоже понятно, просто уменьшаем на сведённый объём.
Есть вопрос по реализации пункта 1) и по тому как корректно реализовать 2а).
Свой вариант для 2а) положил на codeplex, но считаю его далеко не оптимальным.
И самый главный вопрос - так ли нам нужно построение стакана по полному ордер_логу?
Слишком он большой для прокачки. Если включаем не с начала дня, то прокачивает с час.