Поговорим про стакан или книгу заявок, как ещё это иногда называют. Почти в любом вёб-терминале он имеет такой вид, как на картинке выше.
1. Что такое стакан на бирже?
Неотъемлемым атрибутом любой торговой площадки является такая сущность, как книга заявок.
Абсолютно все сделки после валидации попадают в ядро биржи, в котором специальный алгоритм сводит покупателей с продавцами.
У книги заявок есть два сортированных списка. Первый называют бидами (Bids), хранит все лимитные заявки на покупку, лучшим в списке считается ордер с наивысшей ценой. Второй называют асками (Asks). Список хранит все заявки на продажу, в котором лучшей заявкой считается ордер с наименьшей ценой.
При наличии нескольких заявок с одинаковой ценой лучшей из них считается та, которая была получена раньше остальных. На основании книги заявок строится агрегированный стакан котировок, который мы привыкли видеть во всех терминалах и интерфейсах бирж. К примеру, в популярной бирже он выглядит так:
Из-за своей формы он и получил название стакан.
2. Класс MarketDepth в OsEngine.
В OsEngine моделированием этой сущности занимается класс MarketDepth. По сути своей это снимок стакана на определенный момент времени. Класс MarketDepthLevel описывает одну строку из стакана.
На ГитХаб этот класс находится здесь.
Внутри проекта это здесь:
Сам же класс, если Вы его откроете, выглядит следующим образом:
Рассмотрим строение этих классов подробнее.
MarketDepth
Time – публичное поле типа DateTime. Хранит время создания текущего снимка.
Asks – публичное поле перечислимого типа. Содержит список всех уровней на продажу. Лучшая цена по индексу 0.
Bids – публичное поле перечислимого типа. Содержит список всех уровней на покупку. Лучшая цена по индексу 0.
AskSummVolume – общедоступное свойство типа decimal. Предоставляет суммарный объем всех уровней на продажу.
BidSummVolume – общедоступное свойство типа decimal. Предоставляет суммарный объем всех уровней на покупку.
SecurityNameCode – общедоступное строковое поле. Содержит наименование инструмента, которому принадлежит данный стакан заявок.
SetMarketDepthFromString – общедоступный метод. Принимает строку, содержащую данные по всем полям, парсит ее и инициализирует состояние объекта.
GetSaveStringToAllDepfh – общедоступный метод. В качестве параметра принимает необходимую глубину обработки уровней, возвращает строку, в которую записаны все поля объекта для дальнейшего сохранения в хранилище.
GetCopy – общедоступный метод возвращает глубокую копию текущего объекта.
MarketDepthLevel
Ask – публичное поле типа decimal. Содержит информацию о суммарном количество лотов на продажу по этому уровню.
Bid – публичное поле типа decimal. Содержит информацию о суммарном количестве лотов на покупку по этому уровню.
Price – публичное поле типа decimal. Цена текущего уровня.
Id – публичное поле типа long. Уникальный идентификатор ценового уровня.
3. Как можно использовать стакан в роботах на OsEngine?
В базовом источнике BotTabSimple, о котором мы будем много говорить в наших гайдах, есть возможность подписаться на обновление стакана и, анализируя его, принимать решения.
Например, в публичной сборке есть пример HighFrequencyTrader, в котором реализован спам ордерами по лучшей цене инструмента. Используйте его как пример:
1. Расположение примера в проекте.
2. А здесь мы подписываемся на событие обновление стакана.
3. Обработчик события обновления стакана.
Удачных алгоритмов!
Поддержка OsEngine: https://t.me/osengine_official_support
Комментарии