Разработка алгоритма smart order routing
Smart Order Routing (SOR) — алгоритм, который автоматически определяет оптимальное место и способ исполнения ордера среди нескольких доступных площадок. Цель: минимизировать стоимость исполнения (цена + fees + slippage) при заданных ограничениях на скорость.
Задача SOR
Нужно купить 50 BTC. Доступны:
- Binance: лучший ask 45,100, доступно 12 BTC
- Bybit: лучший ask 45,095, доступно 8 BTC
- OKX: лучший ask 45,102, доступно 25 BTC
- Kraken: лучший ask 45,098, доступно 10 BTC
Наивный подход: взять лучшую цену (Bybit). Но там только 8 BTC. Нужно оптимально распределить 50 BTC по нескольким биржам.
Алгоритм оптимального распределения
Sweeping liquidity по уровням: строим объединённый стакан из всех бирж, берём лучшие цены начиная с самых дешёвых.
def merge_orderbooks(orderbooks_dict):
"""
Объединяем стаканы нескольких бирж в единый
"""
merged_asks = []
for exchange, ob in orderbooks_dict.items():
for price, qty in ob['asks']:
# Учитываем fees биржи
adjusted_price = price * (1 + fees[exchange])
merged_asks.append({
'exchange': exchange,
'price': price,
'adjusted_price': adjusted_price,
'qty': qty
})
return sorted(merged_asks, key=lambda x: x['adjusted_price'])
def optimal_allocation(merged_asks, target_qty):
allocation = {}
remaining = target_qty
for level in merged_asks:
if remaining <= 0:
break
fill_qty = min(level['qty'], remaining)
exchange = level['exchange']
allocation[exchange] = allocation.get(exchange, 0) + fill_qty
remaining -= fill_qty
return allocation
Учёт транзакционных издержек
Цена исполнения — не единственная составляющая стоимости:
| Составляющая | Описание |
|---|---|
| Exchange fee | Taker fee на каждой бирже (0.03–0.07%) |
| Withdrawal fee | При переводе между биржами (если нужно) |
| Slippage | Разница между лучшей ценой и ценой исполнения |
| Funding rate | Для perpetual позиций |
| Network latency | Быстрее исполнение на ближайших биржах |
Adjusted cost model:
Total Cost = Σ(qty_i × price_i × (1 + fee_i)) + slippage_estimate_i
Latency arbitrage protection
Если SOR одновременно выставляет ордера на нескольких биржах, а цена движется между отправкой ордеров — одна биржа может иметь устаревшую цену. Это latency arb риск.
Mitigation:
- Одновременная отправка ордеров на все биржи (parallel execution)
- Timeout для каждого ордера
- Fallback: если ордер на одной бирже не исполнился — перераспределяем на другие
Управление балансами
SOR требует наличия средств на каждой бирже. Автоматическое управление балансами:
- Мониторинг балансов на всех биржах
- Автоматическое пополнение через transfers (с учётом времени подтверждения)
- Резервирование минимального баланса на каждой бирже
Агрегатор ликвидности
Для DEX рынков SOR реализован в протоколах 1inch, Paraswap, Cowswap — они агрегируют ликвидность с нескольких DEX. Для CEX аналог — собственная реализация, объединяющая ликвидность нескольких централизованных бирж.
DeFi SOR: смарт-контракт разбивает своп на несколько частей и направляет по лучшим маршрутам через Uniswap v3, Curve, Balancer. 1inch v5 использует именно этот подход.
Мониторинг и benchmarking
Execution quality score: фактическая средняя цена vs теоретическая (если бы взяли лучшую цену на одной бирже). SOR должен давать экономию.
Fill rate: процент исполненного объёма к запрошенному.
Latency breakdown: время на каждом этапе — агрегация стаканов, расчёт allocation, отправка ордеров.
Технический стек
Python (asyncio для параллельных запросов к биржам), CCXT Pro (WebSocket для realtime стаканов), Redis для кэширования актуальных стаканов, PostgreSQL для execution logs. API-интерфейс для интеграции с торговыми системами и ботами.
Разрабатываем SOR систему с поддержкой 5–10 крупных CEX, учётом fees и slippage, параллельным исполнением и детальной execution аналитикой.







