Торговый дашборд, который обновляется раз в секунду, — это уже не терминал, а витрина с вчерашними ценами. Пока REST-запрос добирается до биржи и возвращается, рынок успевает сделать своё дело. Bitcoin может уйти на двести долларов, а вы увидите это только в следующем опросе. Если такая картина знакома, пора переходить на WebSocket.
Почему поллинг не тянет
Поллинг — это когда вы каждую секунду дёргаете API и спрашиваете: «Ну что там, цена изменилась?». Формально работает, но есть четыре проблемы.
- Задержка. Между сделкой и ответом сервера проходит до секунды. Для алго-трейдинга это вечность.
- Пустой трафик. Если цена не двигалась, вы всё равно гоняете полный HTTP-запрос и получаете те же данные.
- Риск бана. Частые запросы упираются в rate limit. Биржа может просто отключить вас.
- Хрупкость. Без обработки ошибок любой сетевой сбой роняет цикл опроса.
И это только верхушка. Главная беда в том, что вы смотрите на рынок через мутное стекло: чувствуете движение, но не видите сами тики.
Что меняет WebSocket
WebSocket — это постоянное соединение с биржей. Вы один раз открываете сокет, подписываетесь на нужные потоки и получаете сообщения в момент, когда происходит событие. Никаких лишних HTTP-запросов, никаких устаревших снимков данных.
Binance, Alpaca, Kraken — практически все крупные площадки отдают тиковые сделки, стакан и свечи через WebSocket. Формат подписки у разных бирж отличается, но паттерн один: открыли сокет, отправили JSON с названием потока и слушаете.
Например, у Binance поток сделок по BTC/USDT называется btcusdt@trade. В каждом сообщении приезжает цена в поле p, объём в q и время в T. Именно этих данных достаточно для простого мониторинга или торгового бота.
С чего начать
Самый короткий путь — Python и библиотека websockets. Подключение занимает десяток строк: создаёте асинхронную функцию, открываете соединение и в цикле принимаете сообщения. Главное — не забыть обработать ConnectionClosed, чтобы при обрыве сети приложение не упало, а переподключилось.
Дальше — по шагам:
- Выберите биржу и изучите документацию по WebSocket.
- Откройте тестовое соединение и подпишитесь на один поток сделок.
- Выведите в консоль первые десять сообщений и разберите структуру JSON.
- Добавьте обработку ошибок и переподключение.
- Подключите второй поток — например, стакан или свечи.
Когда всё заработает, попробуйте посчитать скользящее окно или послать алерт, если цена за пять секунд ушла больше чем на полпроцента. Это сразу превращает игрушку в полезный инструмент.
Типичные ловушки
| Ловушка | Что происходит | Как избежать |
|---|---|---|
| Забыли про ping/pong | Биржа считает соединение мёртвым и рвёт его | Библиотеки делают это сами, но в своём клиенте отвечайте на ping |
| Подписались не на тот поток | Данные не приходят или приходит другой формат | Проверяйте имя потока: символ@тип. Сверяйтесь с документацией |
| Выводите каждый тик в консоль | Поток сообщений захлёстывает терминал и тормозит приложение | Логируйте по расписанию, а обрабатывайте каждый тик |
| Не проверяете формат сообщений | Биржа обновила схему, и разбор JSON молча ломается | Проверяйте структуру и логируйте неожиданные поля |
Где это даёт реальную пользу
WebSocket-стримы — это база для арбитражных ботов, которые должны успеть поймать разницу цен между биржами до того, как она исчезнет. Это живые графики, где свеча формируется из последних сделок, а не из минутных снимков. Это системы управления рисками, которые мгновенно реагируют на обмеление стакана и отменяют заявки.
Ещё одна недооценённая сфера — обучение. На потоковых данных видно, как новости влияют на рынок в реальном времени. Теория превращается в наблюдаемый процесс, а не абстракцию из учебника.
Переход на WebSocket меняет подход: API перестаёт быть удалённой базой, куда вы ходите за справкой. Оно становится лентой событий, в которой можно жить. Начните с простого подключения к одному потоку. Через неделю вы уже не захотите возвращаться к поллингу — будет ощущение, что смотрите на мир без очков с толстыми стёклами.
Комментарии (0)
Войдите, чтобы комментировать.
Пока нет комментариев. Будьте первым.