140 lines
4.8 KiB
Python
140 lines
4.8 KiB
Python
# app/src/trading/auto/state.py
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class AutoTradeState:
|
|
# текущее состояние: OFF / OBSERVING / RUNNING
|
|
status: str = "OFF"
|
|
|
|
# выбранная стратегия: TREND / GRID / SCALP
|
|
strategy: str | None = "TREND"
|
|
|
|
# торговый инструмент
|
|
symbol: str = "BTC/USD_LEVERAGE"
|
|
|
|
# риск на одну сделку в %
|
|
risk_percent: float | None = 1.0
|
|
|
|
# текущий PnL
|
|
pnl_usd: float = 0.0
|
|
|
|
# время последней проверки
|
|
last_check_at: str | None = None
|
|
|
|
# последний сырой сигнал стратегии
|
|
last_signal: str | None = None
|
|
|
|
# количество одинаковых сигналов подряд
|
|
last_signal_repeat_count: int = 0
|
|
|
|
# уверенность последнего сигнала от 0.0 до 1.0
|
|
last_signal_confidence: float = 0.0
|
|
|
|
# причина последнего сигнала
|
|
last_signal_reason: str | None = None
|
|
|
|
# время начала текущего сигнала, monotonic timestamp
|
|
signal_started_at: float | None = None
|
|
|
|
# статус торгового решения: WAITING / CONFIRMING / READY / BLOCKED
|
|
decision_status: str = "WAITING"
|
|
|
|
# человекочитаемое объяснение решения
|
|
decision_reason: str | None = None
|
|
|
|
# сигнал подтверждён по количеству повторов
|
|
is_signal_confirmed: bool = False
|
|
|
|
# сигнал готов к будущему execution
|
|
is_signal_ready: bool = False
|
|
|
|
# текущая позиция: NONE / LONG / SHORT
|
|
position_side: str = "NONE"
|
|
|
|
# цена входа
|
|
entry_price: float | None = None
|
|
|
|
# размер позиции
|
|
position_size: float | None = None
|
|
|
|
# нереализованный PnL
|
|
unrealized_pnl_usd: float | None = None
|
|
|
|
# максимальная просадка
|
|
max_drawdown_usd: float | None = None
|
|
|
|
# плечо
|
|
leverage: float | None = 2.0
|
|
|
|
# stop loss по движению цены в %
|
|
stop_loss_percent: float | None = 1.0
|
|
|
|
# take profit по движению цены в %
|
|
take_profit_percent: float | None = None
|
|
|
|
# максимальный допустимый paper-убыток в USD
|
|
max_loss_usd: float | None = None
|
|
|
|
# максимальная доля баланса, которую можно зарезервировать под позицию
|
|
max_reserved_balance_percent: float | None = 50.0
|
|
|
|
# последняя причина блокировки execution
|
|
execution_block_reason: str | None = None
|
|
|
|
# причина авто-уменьшения размера позиции
|
|
execution_size_adjustment_reason: str | None = None
|
|
|
|
# капитал, выделенный только под AutoTrade
|
|
allocated_balance_usd: float = 1000.0
|
|
|
|
# зафиксированный результат закрытых paper-сделок
|
|
realized_pnl_usd: float = 0.0
|
|
|
|
# последнее execution-действие
|
|
last_execution_action: str | None = None
|
|
|
|
# последняя execution-причина
|
|
last_execution_reason: str | None = None
|
|
|
|
# последняя причина блокировки flip
|
|
last_flip_block_reason: str | None = None
|
|
|
|
# время последнего успешного flip
|
|
last_flip_at: str | None = None
|
|
|
|
# состояние рынка по Market State Engine
|
|
market_state: str | None = None
|
|
|
|
# направление тренда: UP / DOWN / FLAT / UNKNOWN
|
|
market_trend: str | None = None
|
|
|
|
# волатильность: LOW / NORMAL / HIGH / UNKNOWN
|
|
market_volatility: str | None = None
|
|
|
|
# таймфрейм анализа рынка
|
|
market_analysis_interval: str | None = None
|
|
|
|
# объяснение последнего анализа рынка
|
|
market_analysis_reason: str | None = None
|
|
|
|
# код причины, почему вход в позицию сейчас не выполнен
|
|
entry_block_reason: str | None = None
|
|
|
|
# человекочитаемое объяснение причины не входа
|
|
entry_block_message: str | None = None
|
|
|
|
# время последнего обновления сигнала, monotonic timestamp
|
|
signal_updated_at: float | None = None
|
|
|
|
# время последнего обновления market analysis, monotonic timestamp
|
|
market_analysis_updated_at: float | None = None
|
|
|
|
# причина runtime expiration
|
|
runtime_expired_reason: str | None = None
|
|
|
|
# человекочитаемое сообщение runtime expiration
|
|
runtime_expired_message: str | None = None |