Стакан (order book) - сердце биржи: список всех лимитных заявок по инструменту, из которого матчинг собирает сделки. Его устройство - классический вопрос собеседований в трейдинговые команды, и это редкий случай, когда «структура данных» и «бизнес» - одно и то же.

Две стороны и приоритет цена-время

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

Внутри одного ценового уровня заявки упорядочены по времени: кто встал раньше, тот исполняется раньше. Это приоритет цена-время - базовое правило честности биржи: при равной цене время решает.

Структура данных

Двухслойная. Для навигации по ценам нужен отсортированный контейнер - TreeMap от цены к уровню или плоский массив уровней, если шаг цены фиксированный (на реальных биржах часто так: цена всегда кратна тику). Внутри уровня - FIFO-очередь заявок: обычная очередь, но реализованная без аллокаций на каждую заявку.

Операции: добавить заявку - найти уровень (или создать) и встать в конец очереди; отменить - снять из очереди по идентификатору; матчить - брать лучшую встречную заявку, пока есть объём и цены пересекаются. Матчинг порождает сделки - их записывают в журнал, а остаток объёма стоит в очереди.

Детерминизм и предсказуемость

На горячем пути стакана важны две вещи. Детерминизм: одинаковая последовательность событий даёт одинаковое состояние - без зависимости от порядка обхода хешей или от таймингов. Предсказуемость: никаких ресайзов структур на ровном месте (массив уровней фиксированного размера), никакой блокировки всего стакана при правке одного уровня - секционирование по инструменту или лок на уровень.

Именно поэтому на собеседовании про стакан ждут не «TreeMap и всё», а обсуждения: что с отменой заявки из середины очереди, что при частичном исполнении, как ведёт себя спред при всплеске, и почему порядок операций должен быть воспроизводим.

Что запомнить

  • Стакан: bids по убыванию, asks по возрастанию, приоритет цена-время.
  • Структура: сортированные уровни цен + FIFO-очередь заявок в уровне.
  • Матчинг: лучшие уровни встречных сторон, пока есть объём и пересечение цен.
  • Детерминизм и предсказуемость важнее микросекундной хитрости структуры.