Мониторинг торгового бота: всё, кроме P&L
P&L рассказывает, что произошло. Он не рассказывает, исправна ли машина, которая это произвела, — а к моменту, когда P&L покажет сломанного бота, тот ломается уже давно.
Инженеры Vizanix · об авторе
- РАЗДЕЛ
- Архитектура ботов
- ОПУБЛИКОВАНО
- 2026-08-28
- ГЛАВ
- 6
- ЧИТАТЬ ДАЛЬШЕ
- 3
- ЯЗЫК
- написано на русском
Спросите оператора, за чем он следит, и большинство назовёт кривую эквити. Это худший из доступных сигналов здоровья: медленный, шумный и перепутанный с рынком. Бот может быть тихо сломан несколько дней внутри нормально выглядящего P&L, а совершенно здоровый бот может неделю терять деньги.
Разделите два вопроса
«Работает ли стратегия?» и «работает ли программа?» — разные вопросы с разными данными. Эта статья про второй. У метрик ниже общее свойство: понять, что они сломались, можно, ничего не зная про рынок.
Базовый набор
| Метрика | Что ловит | Когда алертить |
|---|---|---|
| Свежесть данных | Мёртвый поток, который не выдал ошибку | По топику нет сообщений дольше ожидаемого интервала |
| Расхождение часов | Дрейф, который начнёт отклонять подписанные запросы | Устойчивое расхождение выше доли recv_window |
| Задержка round-trip ордера | Деградация площадки или сети | p99 выше порога, взятого с нормальной недели |
| Reject rate по кодам | Ошибки расчёта объёма, дрейф фильтров, смена прав | Любая устойчивая ненулевая частота по коду, который обычно нулевой |
| Число переподключений | Проблемы сети или хоста, нестабильность площадки | Частота заметно выше базовой |
| Глубина очереди запросов | Давление лимитов до того, как оно станет отказами | Глубина растёт, а не колеблется |
| Расхождения при сверке | Разъезжающуюся машину состояний | Любое ненулевое расхождение при переподключении |
| Время итерации цикла | Стратегию, отстающую от рынка | Время итерации приближается к интервалу бара |
Наш конвейер свечей выводит почти всё это одним health-объектом на шард: подключённые сокеты, подписанные топики, монеты, буферы, счётчик сообщений, коррекции, переподключения, расхождение часов и булев флаг. В устойчивом режиме это читается как 10/10 шардов, около 1850 топиков, 725 монет, примерно 900 сообщений в секунду и расхождение в пределах ±40 мс. Сдвиг любого из этих показателей виден сразу.
Reject rate по кодам, а не в сумме
Суммарный reject rate прячет всё интересное. Разбивайте по кодам ошибок площадки, потому что каждый код означает, что сломалось что-то своё:
- Рост
110004означает, что расчёт объёма неверно учитывает маржу. - Рост
170137означает, что фильтры инструментов разошлись с вашим кэшем. - Любой
10018вообще означает проблему с белым списком IP — обычно переезд сервера. - Любой
10005вообще означает, что права API-ключа изменились без вас. - Рост
10006означает, что доработать надо очередь запросов, а не число повторов.
Справочник ошибок покрывает частые. Операционно важно другое: коды, которые обычно нулевые, должны алертить при первом же появлении, а не по достижении порога.
Алерты, на которые действительно реагируют
Способ сломать мониторинг — усталость от алертов. Оператор, научившийся игнорировать канал, находится в худшем положении, чем оператор без алертов: он считает, что прикрыт.
Работают три уровня:
- Будить. Торговля идёт там, где не должна, или не идёт там, где должна. Неразрешимое состояние ордера. Сработал kill switch. Позиция без стопа.
- Уведомить. Деградация, которая пока не привела к убытку: вырос reject rate, выросли задержки, шторм переподключений, растёт очередь.
- Дайджест. Сводка за сутки: исполнения, отказы по кодам, переподключения, худшая задержка, расхождения при сверке, сработавшие лимиты.
Дайджест — это то, что пропускают, и то, что ловит медленную деградацию. Код отказа, появляющийся раз в сутки на протяжении недели, невидим в реальном времени и очевиден при недельном сравнении.
Пусть бот сам подаёт признаки жизни
Система мониторинга, которая сообщает только о проблемах, не отличает «всё хорошо» от «мониторинг умер». Выдавайте положительный heartbeat с фиксированным интервалом и алертите на его отсутствие.
Так же получаются честные цифры доступности, а не вспомненные. Мы пишем снимки эквити с фиксированной частотой именно поэтому: пропуски в ряду — это пропуски в работе, и они измеримы, а не восстанавливаются по памяти. Когда мы проверили свой стенд, честная цифра оказалась 86,4% с одним провалом на 34 часа — совершенно нормальное число для стенда в активной разработке, и ровно та причина, по которой мы не печатаем на сайте «99,9% uptime».
Логируйте отрицательные события
Записывайте, почему сигнал не сработал, почему ордер не был поставлен, какое правило риска отказало. Наш сигнальный движок хранит каждую оценку вместе со значениями факторов — 5,76 миллиона за пятнадцать суток — и причину пропуска для каждого отказа.
Это стоит места на диске и превращает самый частый вопрос оператора «почему он ничего не делает?» из сеанса отладки в запрос к базе. Такой обмен стоит совершать каждый раз.
Статья описывает инженерную практику. Это не инвестиционная рекомендация. Vizanix разрабатывает программное обеспечение и не обещает торговую доходность.