[Торгова інфраструктура · State machines · Backend-автоматизація]

Керування ризиками та життєвий цикл угод

Контрольований життєвий цикл торгових операцій: кожен сигнал перевіряється за правилами ризику, проходить через явні стани й закривається із записаним результатом.

Належність
Підсистема екосистеми торгової та AI-автоматизації Astra Raven
Технічний фокус
State MachinesPythonExchange APIsSQLRisk Validation
Що демонструє
Backend state machines · Інженерія надійності · Фінансова автоматизація · SQL-бази даних · Інтеграція API · Моніторинг угод

01Огляд проєкту

Згенерувати сигнал — лише половина задачі. Друга половина — що відбувається далі: перевірка параметрів, застосування налаштувань ризику акаунта, відстеження позиції та рішення, коли й як її завершити.

Ця підсистема описує життєвий цикл явно. Угода проходить через визначені стани, а кожен перехід захищений перевіркою та записується в базу даних.

02Інженерна задача

Торгова автоматизація ламається тихо: пропущене оновлення, часткове виконання, яке так і не звірили, або помилка біржі, після якої локальний стан розходиться з реальним. Життєвий цикл має робити такі випадки видимими та відновлюваними.

  • A

    Відхиляти небезпечні поєднання параметрів до будь-якої спроби операції.

  • B

    Підтримувати різні режими ризику та плеча для кожного акаунта.

  • C

    Зберігати узгодженість локального стану під час збою або таймауту зовнішнього виклику.

  • D

    Формувати підсумковий результат, який можна перевірити, для кожної операції.

03Архітектура рішення

Наведіть або натисніть на етап.

01

Вхідний сигнал

Структурований сигнал надходить від рушія сигналів або іншого джерела.

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 життєвого циклу угоди

ІлюстраціяІлюстративне демо. Запускайте події та дивіться, які переходи дозволені. Спрощена модель без підключення до біржі.

trade-lifecycle · state machineСтворена
Створена Перевірена Активна Частково закрита Закрита Відхилена Помилка

Параметри ордера · демо-ліміти

макс. плече
20×
макс. відстань стопу
5%
мін. прибуток : ризик
1.2

state = created · fire an event

07Інженерні рішення

  1. 01

    Явні стани замість прапорців

    Одне поле стану з дозволеними переходами простіше перевіряти й аудитувати, ніж набір булевих прапорців, що можуть суперечити один одному.

  2. 02

    Помилки — це стани

    Збої API переводять операцію в стан «Помилка» з причиною, щоб її можна було дослідити й вирішити, а не загубити.

  3. 03

    Правила ризику в коді

    Ліміти застосовуються системою до виконання. Помилка в конфігурації не може їх обійти.

  4. 04

    Історія лише дописується

    Переходи записуються як події, тому відновити, що сталося, просто.

08Надійність і тестування

  • Захист переходів відхиляє неможливі зміни стану.
  • Класифікація помилок біржі на повторювані та остаточні.
  • Звірка локального стану із зовнішнім після збоїв.
  • Регресійні тести правил перевірки ризику.

09Приклад коду

trade_state.py python
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Можливий розвиток

  • Дашборди ризиків за акаунтами на основі збереженої історії подій.
  • Режим симуляції, що проганяє весь цикл на записаних даних.
  • Алерти щодо операцій, які перебувають у стані «Помилка» довше за поріг.
Наступний кейс · 03 Telegram Mini App та інтерфейс продукту Продуктова розробка · UI-інженерія · Інтеграція з бекендом