Розробка алгоритму smart order routing
Smart Order Routing (SOR) — алгоритм, який автоматично визначає оптимальну площадку та спосіб виконання ордера серед кількох доступних місць. Мета: мінімізувати вартість виконання (ціна + комісії + 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']:
# Враховуємо комісії біржи
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 комісія на кожній біржі (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
Якщо 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, обліком комісій та slippage, паралельним виконанням та детальною execution аналітикою.







