Торговый бот — не сигнал в бесконечном цикле. Это распределённая машина состояний, подключённая к удалённой бирже, которая может отвечать с задержкой, быть недоступной или выглядеть противоречиво. Надёжность создают разделение ответственности, инварианты и признание неизвестного состояния риском.

Семь этапов конвейера

ЭтапОтвечает заНе должен предполагать
Рыночные данныеТики, стаканы, свечи, времяСвежесть и порядок без проверки
ПризнакиPoint-in-time преобразованияБудущий close, исправленные данные, полный universe
СтратегияЖелаемую экспозицию и отмену сценарияЧто ордер исполнится
РискЛимиты, размер и допуск портфеляЧто запрос равен реальной позиции
ИсполнениеОрдера, повторы и ценовую политикуЧто таймаут означает отказ
СверкаИстину биржи против локального намеренияЧто память пережила перезапуск
МониторингЗдоровье, алерты и аудитЧто молчание означает норму

Сделайте время и свежесть явными

Храните время события биржи, локального получения и обработки отдельно. Отбрасывайте или изолируйте устаревшие, нарушившие последовательность данные и пропавшие бенчмарки. Свечная стратегия должна указать, действует ли она только после закрытия бара: иначе исторический high/close и живой следующий тик создают скрытое различие между тестом и продом.

Сигнал запрашивает экспозицию, риск даёт разрешение

Отделяйте плагины стратегий от транспорта. Стратегия предлагает сторону, основу размера, окно входа и выход. Движок применяет точность биржи, максимальный номинал, бюджет маржи, коррелированную экспозицию, дневной лимит потерь, equity guard и требования к защите. Так стратегии сравниваются без копирования safety-кода.

Идемпотентность и проблема неизвестного ордера

Каждому намерению нужен детерминированный client order ID. После таймаута запросите ордер по ID и сверьте исполнения до повтора. Надёжно сохраняйте переходы: создан, отправлен, принят, частично исполнен, исполнен, запрос отмены, отменён или окончательно отклонён. Повтор безопасен только тогда, когда не создаёт лишнюю позицию.

Биржа — источник истины, но иногда временно невидимый

При старте возьмите блокировку одного процесса, загрузите устойчивое состояние, запросите балансы, позиции, открытые ордера и последние сделки, затем проведите сверку до разрешения входов. Недоступность private API не означает «позиций нет» или «защита не нужна». Unknown — отдельное состояние, блокирующее рост риска.

Примеры fail-closed

Устаревший BBO не запускает срочный целевой ордер. Отсутствующая позиция в ответе API не разрешает новый вход. Непроверенный стоп нельзя считать защитой. Повторные сбои API включают circuit breaker, сохраняют диагностику и требуют выполненных критериев восстановления.

Наблюдаемость — часть исполнения

  • Логи: событие, символ, intent ID, order ID, состояние до/после и reason code.
  • Метрики: возраст данных, lag цикла, задержка/ошибки API, отклонения, проскальзывание, открытый риск и покрытие защитой.
  • Снимки: активная конфигурация без секретов, позиции, состояние стратегии и последняя сверка.
  • Алерты: условие, первое появление, эскалация и восстановление — не сообщение на каждом цикле.

Безопасная лестница запуска

  1. Чистые функции и детерминированные unit-тесты.
  2. Реплей исторических событий и записанных ответов биржи.
  3. Paper/shadow-режим на живых данных без ордеров.
  4. Песочница биржи, если она достоверно моделирует продукт.
  5. Минимальный live-размер, строгие лимиты и контролируемые сессии.
  6. Масштабирование только после анализа сделок, комиссий, сбоев и восстановления.

Материалы для реализации

CCXT Manual описывает разделение public/private API, rate limits, ID ордеров и различия бирж. Открытый код CROT — конкретная архитектура для изучения; проверяйте её предпосылки и тесты, не считая open source доказательством доходности.