Стакан
У каждого инструмента свой стакан, который держится в памяти как три взаимодействующие структуры:Slab arena — одна выделенная область слотов ордеров
Ценовые уровниотображение цена → уровеньвершина находится проходом до конца, а не сканированием
Индекс ордеровid ордера → слототмена и изменение — константное время
ордер
ордер
ордер
ордер
ордер
Двусвязная цепочка в порядке поступления: приоритет внутри уровня позиционный, а не вычисляемый.
Почему порядок слотов фиксированСлоты переиспользуются в фиксированном порядке, индекс — с фиксированным зерном. Не ради производительности: разный порядок слотов у двух валидаторов — это форк.
голова каждого уровня
прямой поиск
Ордера живут в slab arena — заранее выделенной области с константным временем выделения и освобождения. Поэтому операции со стаканом не выделяют память на горячем пути, а освободившиеся слоты переиспользуются в фиксированном порядке, а не там, куда их положит аллокатор. Последняя деталь — не выбор ради производительности: если бы два валидатора переиспользовали слоты в разном порядке, всё, что наблюдает раскладку слотов, разошлось бы.
Та же дисциплина применяется к индексу ордеров: он инициализируется фиксированным зерном, а не случайным. Хеш-таблица со случайным зерном на процесс — стандартная защита от атак на коллизии; на пути исполнения консенсуса это форк.
Цены всюду целочисленные — в субтиковых единицах, а не в десятичных дробях. Как это соотносится с тем, что вы отправляете, — см. Точность.
Приоритет
Приоритет — сначала цена, затем позиция в цепочке на этой цене. «Время» — это каноническая позиция ордера в зафиксированной последовательности блока, а не момент его прихода на узел. Именно это убирает гонку задержек внутри блока. У двух ордеров в одном блоке есть определённое старшинство, которое каждый валидатор вычисляет одинаково, и никакая близость к конкретному узлу его не меняет. Между блоками момент прихода по-прежнему важен, но единицей соревнования становится блок, а не микросекунда. Порядок стадий в ядре усиливает это: отмены выполняются раньше агрессивных выставлений внутри блока, поэтому котировку в стакане нельзя снять ордером, который попал в тот же блок, что и её отмена.Сопоставление ордера
Входящий ордер
Пересекает стакан?
Забрать лучший встречный уровень
Выдать исполнение
Готово
Встать в стакан или отклонить по сроку действияGTC остаётся · IOC отменяет · FOK не исполняет ничего без полного исполнения · «только мейкер» отклоняется вместо пересечения
остаток — следующий уровень
остатка нет
- GTC — оставить остаток в стакане.
- IOC — отменить остаток.
- FOK — если ордер нельзя исполнить целиком, не исполняется вообще ничего.
- ALO — только мейкер: если ордер забрал бы ликвидность, он отклоняется, а не пересекает стакан.
Предотвращение самосделок
Если входящий ордер сопоставился бы со стоящей в стакане ликвидностью того же владельца, сопоставление подавляется, а не исполняется. Какая сторона уступает — настраивается:
Мейкерские ордера, отменённые таким образом, собираются во время сопоставления и удаляются в рамках того же блока, поэтому в стакане не остаётся ордера, который уже подавлен.
Принадлежность для этой проверки определяется на том уровне счёта, который отслеживает стакан. Взгляд со стороны торговли — см. Предотвращение самосделок.
Чего сопоставление не делает
Оно не считает комиссии, не реализует прибыль и убыток, не корректирует позиции и не проверяет маржу. Это происходит после сопоставления, в клиринговой палате, на основе исполнений, которые породило сопоставление. Оно также не решает, имел ли ордер право существовать. Достаточность маржи, лимиты на число активных ордеров, ограничения «только уменьшение» и превращение рыночного ордера в лимитный проверяются и отрабатывают до того, как ордер доходит до стакана. К моменту, когда движок сопоставления видит ордер, вопрос только один: где его место в стакане.Что дальше
Клиринговая палата
Что происходит с балансами и позициями, когда исполнения уже есть.
Типы ордеров
Взгляд со стороны торговли: что можно отправить и как каждый тип себя ведёт.
Стакан заявок
Глубина, уровни и чтение стакана глазами трейдера.
IntentionKernel
Где сопоставление стоит в исполнении блока.