О проекте
Клиент занимался ручным арбитражем на криптовалютных биржах — отслеживал расхождения цен вручную и выставлял ордера самостоятельно. Успевал поймать 1–2 возможности в час, упуская большую часть. Задача: автоматизировать поиск и исполнение арбитражных возможностей с реакцией, недостижимой для человека.
Технические требования
- Мониторинг расхождений цен на 6 биржах: Binance, Bybit, OKX, Kraken, Gate.io, Huobi
- Latency исполнения (от обнаружения до отправки ордеров): < 50 мс
- Корректный учёт комиссий, проскальзывания и времени исполнения
- Параллельное выставление ордеров на обеих биржах
- Система управления балансами на всех биржах
- Алерты в Telegram при нештатных ситуациях
Стек и архитектура
Основной язык: Go. Выбран за сочетание производительности и удобства конкурентного кода. asyncio в Python давал latency 150–200 мс на прототипе; Go — стабильные 20–40 мс.
Market data layer: горутины для каждой биржи поддерживают WebSocket-соединение и обновляют общую структуру цен через lock-free канал.
Arbitrage engine: отдельная горутина, читает ценовой кэш, рассчитывает потенциальную прибыль с учётом всех издержек и принимает решение о торговле.
Execution layer: параллельная отправка ордеров через goroutines. При частичном исполнении — автоматическая логика хеджирования.
Risk management: отдельный модуль, проверяет состояние раз в секунду: дневной P&L, открытые позиции, балансы, аномалии в ценах.
Ключевые решения
Обход rate limits
Написали centralized rate limiter с приоритетной очередью: торговые запросы имеют приоритет над информационными. При приближении к лимиту очередь адаптивно замедляет информационные запросы, сохраняя возможность выставлять ордера.
Валидация арбитражной возможности
Перед исполнением бот делает «последнюю проверку»: запрашивает актуальные балансы и глубину ордербука. Добавляет 10–15 мс, но исключает ситуации, когда возможность уже исчезла к моменту отправки.
Управление балансами
Арбитраж требует средств одновременно на нескольких биржах. Реализовали мониторинг балансов с автоматическими уведомлениями при необходимости ребалансировки.
Показатели
- Средняя latency от обнаружения до исполнения: 35 мс
- Торговых пар под мониторингом: 47 (топ-пары на всех 6 биржах)
- Выявляемых возможностей в сутки: 150–300 (зависит от волатильности)
- Из них прибыльных после всех комиссий: 40–60%
- Дневной лимит потерь: срабатывал 3 раза за 6 месяцев работы