[Торговая инфраструктура · State machines · Backend-автоматизация]
Управление рисками и жизненный цикл сделок
Контролируемый жизненный цикл торговых операций: каждый сигнал проверяется по правилам риска, проходит через явные состояния и закрывается с записанным результатом.
01Обзор проекта
Сгенерировать сигнал — только половина задачи. Вторая половина — что происходит дальше: проверка параметров, применение настроек риска аккаунта, отслеживание позиции и решение, когда и как её завершить.
Эта подсистема описывает жизненный цикл явно. Сделка проходит через определённые состояния, а каждый переход защищён проверкой и записывается в базу данных.
02Инженерная задача
Торговая автоматизация ломается тихо: пропущенное обновление, частичное исполнение, которое так и не сверили, или ошибка биржи, после которой локальное состояние расходится с реальным. Жизненный цикл должен делать такие случаи видимыми и восстанавливаемыми.
- A
Отклонять опасные сочетания параметров до любой попытки операции.
- B
Поддерживать разные режимы риска и плеча для каждого аккаунта.
- C
Сохранять согласованность локального состояния при сбое или таймауте внешнего вызова.
- D
Формировать итоговый, проверяемый результат для каждой операции.
03Архитектура решения
Наведите или нажмите на этап.
Входящий сигнал
Структурированный сигнал приходит от движка сигналов или другого источника.
04Основные компоненты
- 01
Проверка параметров
Проверяет соотношения входа, стоп-лосса и тейк-профита, числовые границы и обязательные поля.
- 02
Движок рисков
Применяет настройки аккаунта — режим риска, плечо, лимиты экспозиции — и блокирует операции, которые их нарушают.
- 03
State machine
Создана → Проверена → Активна → Частично закрыта → Закрыта, плюс явные состояния «Отклонена» и «Ошибка».
- 04
Интеграция с биржей
Оборачивает вызовы API классификацией ошибок, чтобы сбой становился известным состоянием, а не падением.
- 05
Журнал событий
Каждый переход сохраняется с временем и причиной, формируя историю сделки.
- 06
Проверка результата
Оценивает закрытые операции и наполняет автоматические отчёты.
05Технологический стек
Ядро
- Python
- asyncio
- State machine design
Интеграция
- Binance Futures API ecosystem
- Error classification
Данные
- SQL
- Event history
- Reports
06Интерактивная демонстрация
State machine жизненного цикла сделки
ИллюстрацияИллюстративное демо. Запускайте события и смотрите, какие переходы разрешены. Упрощённая модель, без подключения к бирже.
state = created · fire an event
07Инженерные решения
- 01
Явные состояния вместо флагов
Одно поле состояния с разрешёнными переходами проще проверять и аудировать, чем набор булевых флагов, которые могут противоречить друг другу.
- 02
Ошибки — это состояния
Сбои API переводят операцию в состояние «Ошибка» с причиной, чтобы её можно было изучить и разрешить, а не потерять.
- 03
Правила риска в коде
Лимиты применяются системой до исполнения. Ошибка в конфигурации не может их обойти.
- 04
История только дописывается
Переходы записываются как события, поэтому восстановить, что произошло, просто.
08Надёжность и тестирование
- Защита переходов отклоняет невозможные смены состояния.
- Классификация ошибок биржи на повторяемые и окончательные.
- Сверка локального состояния с внешним после сбоев.
- Регрессионные тесты правил проверки риска.
09Пример кода
from enum import Enum
class TradeState(str, Enum):
CREATED = "created"
VALIDATED = "validated"
ACTIVE = "active"
PARTIALLY_CLOSED = "partially_closed"
CLOSED = "closed"
REJECTED = "rejected"
ERROR = "error"
ALLOWED: dict[TradeState, set[TradeState]] = {
TradeState.CREATED: {TradeState.VALIDATED, TradeState.REJECTED},
TradeState.VALIDATED: {TradeState.ACTIVE, TradeState.REJECTED, TradeState.ERROR},
TradeState.ACTIVE: {TradeState.PARTIALLY_CLOSED, TradeState.CLOSED, TradeState.ERROR},
TradeState.PARTIALLY_CLOSED: {TradeState.CLOSED, TradeState.ERROR},
TradeState.ERROR: {TradeState.ACTIVE, TradeState.CLOSED},
}
class InvalidTransition(Exception):
pass
def transition(current: TradeState, target: TradeState) -> TradeState:
if target not in ALLOWED.get(current, set()):
raise InvalidTransition(f"{current.value} -> {target.value} is not allowed")
return targetИллюстрация Иллюстративный инженерный пример — упрощённая таблица переходов.
Исходный код продукта закрыт. Примеры показывают инженерный подход, а не внутреннюю логику. Больше — в Engineering Lab.
10Возможное развитие
- Дашборды рисков по аккаунтам на основе сохранённой истории событий.
- Режим симуляции, прогоняющий весь цикл на записанных данных.
- Алерты по операциям, которые находятся в состоянии «Ошибка» дольше порога.