Торговый бот — не сигнал в бесконечном цикле. Это распределённая машина состояний, подключённая к удалённой бирже, которая может отвечать с задержкой, быть недоступной или выглядеть противоречиво. Надёжность создают разделение ответственности, инварианты и признание неизвестного состояния риском.
Семь этапов конвейера
| Этап | Отвечает за | Не должен предполагать |
|---|---|---|
| Рыночные данные | Тики, стаканы, свечи, время | Свежесть и порядок без проверки |
| Признаки | Point-in-time преобразования | Будущий close, исправленные данные, полный universe |
| Стратегия | Желаемую экспозицию и отмену сценария | Что ордер исполнится |
| Риск | Лимиты, размер и допуск портфеля | Что запрос равен реальной позиции |
| Исполнение | Ордера, повторы и ценовую политику | Что таймаут означает отказ |
| Сверка | Истину биржи против локального намерения | Что память пережила перезапуск |
| Мониторинг | Здоровье, алерты и аудит | Что молчание означает норму |
Сделайте время и свежесть явными
Храните время события биржи, локального получения и обработки отдельно. Отбрасывайте или изолируйте устаревшие, нарушившие последовательность данные и пропавшие бенчмарки. Свечная стратегия должна указать, действует ли она только после закрытия бара: иначе исторический high/close и живой следующий тик создают скрытое различие между тестом и продом.
Сигнал запрашивает экспозицию, риск даёт разрешение
Отделяйте плагины стратегий от транспорта. Стратегия предлагает сторону, основу размера, окно входа и выход. Движок применяет точность биржи, максимальный номинал, бюджет маржи, коррелированную экспозицию, дневной лимит потерь, equity guard и требования к защите. Так стратегии сравниваются без копирования safety-кода.
Идемпотентность и проблема неизвестного ордера
Каждому намерению нужен детерминированный client order ID. После таймаута запросите ордер по ID и сверьте исполнения до повтора. Надёжно сохраняйте переходы: создан, отправлен, принят, частично исполнен, исполнен, запрос отмены, отменён или окончательно отклонён. Повтор безопасен только тогда, когда не создаёт лишнюю позицию.
Биржа — источник истины, но иногда временно невидимый
При старте возьмите блокировку одного процесса, загрузите устойчивое состояние, запросите балансы, позиции, открытые ордера и последние сделки, затем проведите сверку до разрешения входов. Недоступность private API не означает «позиций нет» или «защита не нужна». Unknown — отдельное состояние, блокирующее рост риска.
Устаревший BBO не запускает срочный целевой ордер. Отсутствующая позиция в ответе API не разрешает новый вход. Непроверенный стоп нельзя считать защитой. Повторные сбои API включают circuit breaker, сохраняют диагностику и требуют выполненных критериев восстановления.
Наблюдаемость — часть исполнения
- Логи: событие, символ, intent ID, order ID, состояние до/после и reason code.
- Метрики: возраст данных, lag цикла, задержка/ошибки API, отклонения, проскальзывание, открытый риск и покрытие защитой.
- Снимки: активная конфигурация без секретов, позиции, состояние стратегии и последняя сверка.
- Алерты: условие, первое появление, эскалация и восстановление — не сообщение на каждом цикле.
Безопасная лестница запуска
- Чистые функции и детерминированные unit-тесты.
- Реплей исторических событий и записанных ответов биржи.
- Paper/shadow-режим на живых данных без ордеров.
- Песочница биржи, если она достоверно моделирует продукт.
- Минимальный live-размер, строгие лимиты и контролируемые сессии.
- Масштабирование только после анализа сделок, комиссий, сбоев и восстановления.
Материалы для реализации
CCXT Manual описывает разделение public/private API, rate limits, ID ордеров и различия бирж. Открытый код CROT — конкретная архитектура для изучения; проверяйте её предпосылки и тесты, не считая open source доказательством доходности.