Розробка стакана ордерів (order book)
Order book — центральний компонент будь-якої біржи. Продуктивність напрямою визначає можливості всієї торгової системи: від latency виконання до максимального throughput.
In-memory order book
Order book живе в ОЗУ. Доступ до диска при кожному matching — неприйнятна latency.
Класична структура: два відсортовані контейнери — bid side (покупки, по спаданню ціни) й ask side (продажі, по зростанню ціни). На кожному цінуовому рівні — черга ордерів (FIFO для price-time priority).
Вибір tree:
- Red-black tree: O(log n) для всіх операцій, гарна cache locality
- Skip list: конкурентний, lockfree skip list дає кращу масштабованість
- Sorted slice + binary search: O(n) insert, O(log n) search, працює для малих books <1000 рівнів
Для біржи з 10–20 торговими парами й помірним обсягом: один Go процес обробляє >50,000 ордерів/сек.
Алгоритм matching
Price-time priority (FIFO) — стандарт для більшості бирж.
Снэпшот й інкрементальні оновлення
Клієнт не отримує весь order book при підключенні — це можуть бути мегабайти даних. Архітектура:
- Клієнт запрошує снэпшот (top N рівнів, наприклад 50) через REST
- Підписується на WebSocket channel diff updates
- Застосовує diff до локальної копії
Клієнт відкидає diff з seq <= snapshot.Sequence, застосовує всі наступні.
Візуалізація order book
Групування по тикам
Реальний order book може мати тисячі ціновых рівнів. Для відображення — групування по "тику" (мінімальний крок відображення).
Тики переключаються користувачем (0.01, 0.1, 1, 10, 100 для BTC/USDT) — це змінює детальність відображення.
Depth bar
Візуальний індикатор відносного обсягу на рівні.
Продуктивність
Для біржи з 10–20 торговими парами й помірним обсягом: один Go процес обробляє >50,000 ордерів/сек.
При необхідності масштабування: шардинг по парам (кожна пара — незалежний інстанс), горизонтальне масштабування API-слоя з спільною order book через Redis Sorted Sets.
| Метрика | Значення | Умови |
|---|---|---|
| Matching latency | <100 мкс | In-memory, single core |
| Add order throughput | 100k+ ops/sec | Go, Red-Black tree |
| Cancel order | O(1) | Hash map lookup |
| Snapshot generation | <1 мс | Top 50 рівнів |
| WS diff broadcast | <1 мс | After each trade |
База даних
Order book — лише in-memory. У PostgreSQL персистується:
- Усі ордери (open, filled, cancelled)
- Усі trades
- Снэпшоти order book кожні N хвилин (для відновлення після рестарту)
При старті: завантаження усіх status=open ордерів → відновлення in-memory book.
Таймлайн розробки
- In-memory order book з FIFO matching: 3–4 тижні
- WebSocket diff feed + снэпшоти: 2–3 тижні
- Frontend visualizer з grouping, depth bars: 2–3 тижні
- Повний production-ready компонент: 6–8 тижнів







