Development системы hot-swap стратегий без остановки бота
Hot-swap стратегий — это возможность заменить торговую стратегию прямо во время работы бота, без остановки, без потери открытых позиций, без downtime. Для маркет-мейкеров и HFT-операторов это критично: каждая минута простоя — упущенный spread income. Для всех остальных — это удобство оперирования и скорость реакции на изменение рыночных условий.
Архитектурный фундамент: Strategy Interface
Hot-swap возможен только если стратегии реализованы через единый интерфейс. Бот работает не с конкретной стратегией, а с абстрактным Strategy объектом. Замена стратегии — это смена объекта, реализующего интерфейс.
class Strategy(ABC):
@abstractmethod
def on_tick(self, market_data: MarketData) -> Optional[Signal]:
"""Вызывается на каждом обновлении рыночных данных"""
pass
@abstractmethod
def on_fill(self, fill: Fill) -> None:
"""Вызывается при исполнении ордера"""
pass
@abstractmethod
def get_state(self) -> StrategyState:
"""Возвращает текущее состояние для передачи преемнику"""
pass
@abstractmethod
def restore_state(self, state: StrategyState) -> None:
"""Восстанавливает состояние от предшественника"""
pass
Методы get_state и restore_state — ключевые для hot-swap. При замене стратегии текущее состояние передаётся новой стратегии: открытые позиции, накопленные метрики, market context.
Протокол замены стратегии
Наивный hot-swap — просто заменить объект — опасен. Если замена происходит в момент обработки сигнала, можно получить inconsistent state. Нужен атомарный протокол:
Фаза 1: Prepare
- Уведомить текущую стратегию о предстоящей замене
- Стратегия завершает текущий цикл (не начинает новые операции)
- Стратегия сериализует своё состояние
Фаза 2: Transition
- Атомарная замена объекта стратегии (с блокировкой)
- Передача состояния новой стратегии
- Новая стратегия восстанавливает контекст
Фаза 3: Verify
- Проверка что новая стратегия корректно инициализировалась
- Запуск первого цикла на новой стратегии
- Если ошибка — откат к предыдущей стратегии
Весь переход занимает миллисекунды. Для HFT это заметно, для большинства стратегий — нет.
Динамическая загрузка плагинов
Для действительно гибкого hot-swap — стратегии как плагины, загружаемые в runtime.
Python: importlib.import_module + reload. Загрузить модуль, получить класс стратегии, инстанцировать.
import importlib
import importlib.util
def load_strategy_from_file(filepath: str, class_name: str) -> Type[Strategy]:
spec = importlib.util.spec_from_file_location("dynamic_strategy", filepath)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return getattr(module, class_name)
Go: plugin package позволяет загружать .so файлы в runtime. Более ограниченный, но типобезопасный. Или gRPC-based strategy runner — стратегия как отдельный процесс, бот общается через gRPC.
Sandboxing: загружаемый код стратегии может содержать баги или даже злонамеренный код. Для multi-tenant систем — запускать стратегии в изолированных процессах/sandbox.
Управление версиями стратегий
При hot-swap важно знать какая версия стратегии работает сейчас:
{
"strategy_id": "trend_following_v2",
"version": "2.3.1",
"deployed_at": "2024-01-15T14:30:00Z",
"deployed_by": "operator",
"previous_version": "2.2.0",
"change_description": "Улучшен entry filter по ATR"
}
Canary deployment: новая стратегия запускается с 10% капитала, старая с 90%. Если новая показывает хорошие результаты — постепенно переключаем. Если хуже — откатываем без потерь.
A/B testing: две версии стратегии работают параллельно на разных инструментах или в разные временные окна. Сравниваем результаты статистически.
Состояние при переключении: что передавать
Не всё состояние нужно передавать при hot-swap:
| Тип состояния | Передавать? | Причина |
|---|---|---|
| Открытые позиции | Да | Новая стратегия должна управлять ими |
| Накопленный P&L | Да | Для лимитов и мониторинга |
| Internal ML model state | Зависит | Если стратегия меняется кардинально — нет смысла |
| Order history | Нет | Берётся из общего лога |
| Market data buffer | Да | Для стратегий требующих исторический контекст |
Если стратегия A — trend following, а на неё переключается стратегия B — mean reversion, передача внутренних сигналов A бессмысленна. Но открытые позиции и риск-лимиты — всегда.
Тестирование hot-swap
Это критично: механизм который не тестировался — не работает когда нужен.
- Unit тесты: переключение между mock стратегиями, проверка передачи состояния
- Integration тесты: переключение под нагрузкой (10 тиков/сек), проверка отсутствия пропущенных сигналов
- Chaos testing: переключение в момент исполнения ордера, при потере соединения с биржей
- Production drill: периодически делать плановый hot-swap в prod для уверенности что механизм работает
Hot-swap стратегий — engineering feat среднего уровня сложности. Основная работа не в механизме замены, а в правильном проектировании Strategy interface с учётом всех edge cases передачи состояния.







