Разработка алгоритма исполнения крупных ордеров (iceberg)
Iceberg ордер — техника скрытия истинного размера крупной заявки. В стакане виден только «верхушка айсберга» — небольшой видимый объём. Когда он исполняется, автоматически выставляется следующий слайс. Контрагенты не знают, что за этим ордером стоит большой объём.
Проблема крупных ордеров
Если выставить limit buy 500 BTC в стакан — это мгновенно становится видно всем участникам. Маркет-мейкеры поднимут цену (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
)
# Ждём исполнения или таймаут
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 деск для очень крупных ордеров
Мониторинг исполнения
Real-time tracking: процент исполнения, средняя цена fill vs target, рыночное движение цены во время исполнения (proxy для рыночного влияния).
Стек: Python asyncio + CCXT, PostgreSQL для execution logs. Простой веб-интерфейс для запуска iceberg ордеров, мониторинга прогресса и отмены при необходимости.







