Розробка алгоритму виконання крупних ордерів (iceberg)
Iceberg ордер — техніка приховування істинного розміру крупної заявки. У стакані видна тільки «верхівка айсберга» — невеликий видимий обсяг. Коли він виконується, автоматично виставляється наступний слайс. Контрагенти не знають, що за цим ордером стоїть великий обсяг.
Проблема крупних ордерів
Якщо виставити limit buy 500 BTC у стакан — це миттєво стає видно всім учасникам. Market makers піднімуть ціну (front running). HFT алгоритми виявлять крупний попит та купять вище, потім продадуть вам. Ринок почне рухатися проти вас ще до виконання.
Механіка iceberg ордера
Видима частина: невеликий «display qty» (наприклад, 1 BTC з 100 BTC). Прихована частина: залишок обсягу зберігається локально, не видно в стакані. Автоматичне поповнення: при виконанні видимої частини, наступний слайс автоматично виставляється.
Варіювання розміру слайсів: випадковий розмір кожного слайса (1–3 BTC замість фіксованих 1 BTC) — алгоритмам складніше розпізнати паттерн.
Варіювання ціни: кожен новий слайс виставляється з невеликим випадковим зміщенням від target ціни.
Адаптація до ринкових умов
import random
class IcebergExecutor:
def __init__(self, symbol, total_qty, target_price, exchange):
self.total_qty = total_qty
self.remaining = total_qty
self.target_price = target_price
self.exchange = exchange
def get_slice_size(self):
# Випадковий розмір слайса: ±30% від базового
base_slice = self.total_qty * 0.02 # 2% від загального
variance = base_slice * 0.3
return base_slice + random.uniform(-variance, variance)
def get_slice_price(self, side):
# Випадкове відхилення для зменшення передбачуваності
variance = self.target_price * 0.0001 # 0.01%
offset = random.uniform(-variance, variance)
return self.target_price + offset
async def execute(self, side='buy'):
while self.remaining > 0:
slice_qty = min(self.get_slice_size(), self.remaining)
price = self.get_slice_price(side)
order = await self.exchange.create_limit_order(
self.symbol, side, slice_qty, price
)
# Чекаємо виконання або timeout
filled = await self.wait_for_fill(order['id'], timeout=30)
self.remaining -= filled
# Пауза між слайсами (випадкова)
await asyncio.sleep(random.uniform(1, 5))
Детектирування та обхід детектирування
HFT системи вміють розпізнавати iceberg ордери по паттерну поновлення. Методи обходу:
- Випадкові інтервали між виставленням слайсів
- Використання кількох акаунтів на різних суб-акаунтах
- Комбінування з TWAP/VWAP логікою — слайси виставляються в залежності від ринкового обсягу
- Dark pool використання: Binance Block Trade, OTC desk для дуже крупних ордерів
Моніторинг виконання
Real-time відслідження: відсоток виконання, середня ціна fill vs target, рункове движение ціни під час виконання (proxy для ринкового впливу).
Стек: Python asyncio + CCXT, PostgreSQL для execution logs. Простий веб-інтерфейс для запуску iceberg ордерів, моніторингу прогресу та скасування при необхідності.







