О проекте
Клиент — независимый трейдер с многолетним опытом, торгующий одновременно на нескольких биржах. Основная боль: приходилось держать открытыми 5–6 вкладок браузера с разными биржами, переключаться между ними вручную, а данные везде были в разных форматах.
Задача: единый рабочий стол, который агрегирует данные со всех нужных площадок и позволяет управлять позициями из одного места.
Технические требования
- Поддержка 15+ бирж через единый унифицированный интерфейс
- Работа на Windows и Linux
- Real-time данные: ордербук, стакан, последние сделки — без задержек
- Выставление и отмена ордеров прямо из терминала
- Агрегированный ордербук (объединение ликвидности с нескольких бирж)
- Потребление памяти в разумных пределах при 50+ WebSocket-соединениях
Стек и архитектура
Frontend: Tauri (Rust backend + React UI). Выбор Tauri вместо Electron обусловлен жёсткими требованиями к производительности и памяти. Аналогичное Electron-приложение потребляло бы 400–600 МБ RAM; Tauri держится в пределах 80–120 МБ.
Слой работы с биржами: Rust. Написали единый адаптер, нормализующий данные от каждой биржи к общему формату. Новая биржа добавляется через реализацию стандартного интерфейса — без затрагивания остального кода.
WebSocket-менеджер: пул соединений с автоматическим переподключением, ведением состояния ордербука, логикой синхронизации snapshot + incremental updates. Написан на Rust с использованием tokio async runtime.
Хранилище: SQLite для локального хранения истории ордеров, настроек и профилей. Real-time данные хранятся только в памяти.
Где было сложно
Агрегированный ордербук
Самая нетривиальная часть. Разные биржи присылают данные с разной частотой и в разных форматах. Нужно было объединять их в единый ордербук, корректно обрабатывая расхождения по времени и формату. Добавили fuzzy matching для идентификации одного инструмента на разных биржах (BTC-USDT vs BTCUSDT vs BTC/USDT).
Рендеринг под нагрузкой
Ордербук с 50 уровнями обновляется несколько раз в секунду. Наивная реализация (перерисовывать всё при каждом обновлении) создавала заметные фризы. Перешли на виртуализированный список с точечными обновлениями только изменившихся строк.
Разные rate limits на разных биржах
Каждая биржа имеет свои ограничения. Написали централизованный rate limiter с очередью запросов per-exchange.
Результат
- Стабильная работа 24/7 без перезапусков более 3 месяцев на тестовом периоде
- Задержка обновления данных: < 5 мс от получения WebSocket-события до отрисовки
- Поддержка 18 бирж в первой версии; новая добавляется за 2–4 часа работы
- Объединённый ордербук агрегирует данные с задержкой < 10 мс