Движок сопоставления
Движок сопоставления книги ордеров Yoyo Market (далее — Yoyo) отвечает за связывание ордеров на покупку и продажу на рынках типа orderbook. Он использует приоритет цена-время и поддерживает частичное исполнение, автоматическое обеспечение ликвидности и обновление балансов в реальном времени.
Приоритет цена-время
Ордера сопоставляются по двум правилам, применяемым по порядку:
- Приоритет цены: Ордера с лучшей ценой сопоставляются первыми.
- Ордера на покупку сопоставляются с наименьшим ask (самый дешевый ордер на продажу).
- Ордера на продажу сопоставляются с наивысшим bid (самый дорогой ордер на покупку).
- Приоритет времени: Когда несколько ордеров существуют по одной цене, первым исполняется ордер, размещенный раньше (FIFO).
Процесс сопоставления
Когда поступает новый ордер, движок пытается сопоставить его немедленно:
Поступает ордер на покупку
- Движок просматривает сторону продаж книги ордеров, отсортированную по возрастанию цены (наименьшая первой).
- Если наименьшая цена ask меньше или равна цене ордера на покупку (для лимитных) или любой цене (для рыночных), происходит сопоставление.
- Сделка исполняется по цене ask (цене продавца).
- Если бюджет ордера на покупку не полностью израсходован, движок продолжает сопоставление со следующим наименьшим ask.
- Оставшийся бюджет (для лимитных ордеров) остается в книге ордеров как постоянный bid.
Поступает ордер на продажу
- Движок просматривает сторону покупок книги ордеров, отсортированную по убыванию цены (наивысшая первой).
- Если наивысшая цена bid больше или равна цене ордера на продажу (для лимитных) или любой цене (для рыночных), происходит сопоставление.
- Сделка исполняется по цене bid (цене покупателя).
- Если акции ордера на продажу не полностью проданы, движок продолжает сопоставление со следующим наивысшим bid.
- Оставшиеся акции (для лим итных ордеров) остаются в книге ордеров как постоянный ask.
Частичное исполнение
Ордера не обязаны исполняться за одно сопоставление. Крупный ордер на покупку может сопоставляться с несколькими меньшими ордерами на продажу, и наоборот. Каждое отдельное сопоставление создает отдельную запись сделки. Статус ордера переходит из pending в partial после первого неполного исполнения и в filled после полного потребления всей суммы.
Создание сделки
Каждое сопоставление ордера на покупку с ордером на продажу создает сделку с:
- Ценой: Цена исполнения (цена ожидающего ордера).
- Суммой: Количество акций, обмененных в этом сопоставлении.
- Комиссией покупателя:
price * fee%, списываемая с покупателя. - Комиссией продавца:
price * fee%, списываемая с продавца. - Временными метками: Точное время исполнения.
Сделки транслируются в реальном времени через WebSocket-ленту по адресу /api/v1/ws/trades.
Обновление балансов
При каждой сделке балансы обновляются атомарно:
- Покупатель: Баланс уменьшается на
price * (1 + fee%) * shares. Позиция увеличивается на количество приобретенных акций. - Продавец: Баланс увеличивается на
price * (1 - fee%) * shares. Позиция уменьшается на количество проданных акций.
Все операции с балансами являются транзакционными для предотвращения несоответствий.