refactor(auto): add runtime state reset helpers
This commit is contained in:
@@ -11,6 +11,19 @@ from src.core.event_bus import EventBus
|
|||||||
from src.core.numbers import safe_float
|
from src.core.numbers import safe_float
|
||||||
from src.core.types import NumericLike
|
from src.core.types import NumericLike
|
||||||
from src.trading.auto.state import AutoTradeState
|
from src.trading.auto.state import AutoTradeState
|
||||||
|
from src.trading.auto.state_reset import (
|
||||||
|
reset_adaptive_size_state,
|
||||||
|
reset_autonomous_runtime_state,
|
||||||
|
reset_cycle_statistics_state,
|
||||||
|
reset_execution_runtime_state,
|
||||||
|
reset_flip_runtime_state,
|
||||||
|
reset_loss_cooldown_state,
|
||||||
|
reset_market_analysis_state,
|
||||||
|
reset_position_protection_state,
|
||||||
|
reset_position_semantics_state,
|
||||||
|
reset_runtime_expiration_state,
|
||||||
|
reset_signal_runtime_state,
|
||||||
|
)
|
||||||
from src.trading.execution.engine import ExecutionEngine
|
from src.trading.execution.engine import ExecutionEngine
|
||||||
from src.trading.strategies.base import BaseStrategy, StrategyContext
|
from src.trading.strategies.base import BaseStrategy, StrategyContext
|
||||||
from src.trading.strategies.registry import StrategyRegistry
|
from src.trading.strategies.registry import StrategyRegistry
|
||||||
@@ -141,9 +154,8 @@ class AutoLifecycleMixin(
|
|||||||
state.status = "RUNNING"
|
state.status = "RUNNING"
|
||||||
# При ручном запуске из OBSERVING очищаем старую cooldown-блокировку,
|
# При ручном запуске из OBSERVING очищаем старую cooldown-блокировку,
|
||||||
# чтобы запуск не наследовал паузу прошлого цикла.
|
# чтобы запуск не наследовал паузу прошлого цикла.
|
||||||
state.loss_cooldown_active = False
|
reset_loss_cooldown_state(state)
|
||||||
state.loss_cooldown_reason = None
|
|
||||||
state.last_loss_monotonic_at = None
|
|
||||||
state.execution_block_title = None
|
state.execution_block_title = None
|
||||||
state.execution_block_message = None
|
state.execution_block_message = None
|
||||||
state.execution_block_action = None
|
state.execution_block_action = None
|
||||||
@@ -168,21 +180,16 @@ class AutoLifecycleMixin(
|
|||||||
|
|
||||||
state.status = "RUNNING"
|
state.status = "RUNNING"
|
||||||
self._reset_signal_tracking()
|
self._reset_signal_tracking()
|
||||||
state.cycle_realized_pnl_usd = 0.0
|
reset_cycle_statistics_state(state)
|
||||||
state.cycle_closed_trades = 0
|
reset_loss_cooldown_state(state)
|
||||||
state.cycle_winning_trades = 0
|
reset_flip_runtime_state(state)
|
||||||
# Новый цикл должен начинаться без старой блокировки после убытков.
|
|
||||||
state.cycle_losing_trades = 0
|
|
||||||
state.cycle_consecutive_losses = 0
|
|
||||||
state.loss_cooldown_active = False
|
|
||||||
state.loss_cooldown_reason = None
|
|
||||||
state.last_loss_monotonic_at = None
|
|
||||||
state.execution_block_title = None
|
|
||||||
state.execution_block_message = None
|
|
||||||
state.execution_block_action = None
|
|
||||||
state.cycle_trade_fees_usd = 0.0
|
|
||||||
state.cycle_overnight_fees_usd = 0.0
|
|
||||||
state.cycle_started_at = time.monotonic()
|
state.cycle_started_at = time.monotonic()
|
||||||
|
state.cycle_number = int(getattr(state, "cycle_number", 0) or 0) + 1
|
||||||
|
|
||||||
|
state.last_signal = "HOLD"
|
||||||
|
state.signal_started_at = time.monotonic()
|
||||||
|
|
||||||
state.cycle_number = int(getattr(state, "cycle_number", 0) or 0) + 1
|
state.cycle_number = int(getattr(state, "cycle_number", 0) or 0) + 1
|
||||||
state.last_flip_old_side = None
|
state.last_flip_old_side = None
|
||||||
state.last_flip_new_side = None
|
state.last_flip_new_side = None
|
||||||
@@ -227,30 +234,13 @@ class AutoLifecycleMixin(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if previous_status == "OFF":
|
if previous_status == "OFF":
|
||||||
state.cycle_realized_pnl_usd = 0.0
|
reset_cycle_statistics_state(state)
|
||||||
state.cycle_closed_trades = 0
|
reset_loss_cooldown_state(state)
|
||||||
state.cycle_losing_trades = 0
|
reset_flip_runtime_state(state)
|
||||||
state.cycle_consecutive_losses = 0
|
reset_execution_runtime_state(state)
|
||||||
state.loss_cooldown_active = False
|
reset_position_semantics_state(state)
|
||||||
state.loss_cooldown_reason = None
|
|
||||||
state.last_loss_monotonic_at = None
|
|
||||||
state.cycle_winning_trades = 0
|
|
||||||
state.cycle_trade_fees_usd = 0.0
|
|
||||||
state.cycle_overnight_fees_usd = 0.0
|
|
||||||
state.cycle_started_at = time.monotonic()
|
state.cycle_started_at = time.monotonic()
|
||||||
state.last_flip_old_side = None
|
|
||||||
state.last_flip_new_side = None
|
|
||||||
state.last_flip_pnl_usd = None
|
|
||||||
state.last_flip_reason = None
|
|
||||||
state.last_flip_monotonic_at = None
|
|
||||||
state.position_stall_state = None
|
|
||||||
state.position_stall_reason = None
|
|
||||||
state.position_mfe_percent = None
|
|
||||||
state.position_mae_percent = None
|
|
||||||
state.execution_block_title = None
|
|
||||||
state.execution_block_message = None
|
|
||||||
state.execution_block_action = None
|
|
||||||
state.execution_block_reason = None
|
|
||||||
|
|
||||||
self._log_auto_status_changed(
|
self._log_auto_status_changed(
|
||||||
previous_status=previous_status,
|
previous_status=previous_status,
|
||||||
@@ -279,31 +269,14 @@ class AutoLifecycleMixin(
|
|||||||
return state, "Автоторговля уже выключена."
|
return state, "Автоторговля уже выключена."
|
||||||
|
|
||||||
state.status = "OFF"
|
state.status = "OFF"
|
||||||
state.cycle_realized_pnl_usd = 0.0
|
reset_cycle_statistics_state(state)
|
||||||
state.cycle_closed_trades = 0
|
reset_loss_cooldown_state(state)
|
||||||
state.cycle_losing_trades = 0
|
reset_execution_runtime_state(state)
|
||||||
state.cycle_consecutive_losses = 0
|
reset_adaptive_size_state(state)
|
||||||
state.loss_cooldown_active = False
|
reset_flip_runtime_state(state)
|
||||||
state.loss_cooldown_reason = None
|
reset_position_semantics_state(state)
|
||||||
state.last_loss_monotonic_at = None
|
|
||||||
state.execution_block_title = None
|
|
||||||
state.execution_block_message = None
|
|
||||||
state.execution_block_action = None
|
|
||||||
state.execution_block_reason = None
|
|
||||||
state.cycle_winning_trades = 0
|
|
||||||
state.cycle_trade_fees_usd = 0.0
|
|
||||||
state.cycle_overnight_fees_usd = 0.0
|
|
||||||
state.cycle_started_at = None
|
state.cycle_started_at = None
|
||||||
state.adaptive_size_changed_at = None
|
|
||||||
state.last_flip_old_side = None
|
|
||||||
state.last_flip_new_side = None
|
|
||||||
state.last_flip_pnl_usd = None
|
|
||||||
state.last_flip_reason = None
|
|
||||||
state.last_flip_monotonic_at = None
|
|
||||||
state.position_stall_state = None
|
|
||||||
state.position_stall_reason = None
|
|
||||||
state.position_mfe_percent = None
|
|
||||||
state.position_mae_percent = None
|
|
||||||
self.stop_loop()
|
self.stop_loop()
|
||||||
|
|
||||||
EventBus.emit(
|
EventBus.emit(
|
||||||
@@ -390,116 +363,21 @@ class AutoLifecycleMixin(
|
|||||||
|
|
||||||
state = self.get_state()
|
state = self.get_state()
|
||||||
|
|
||||||
state.adaptive_size_base = None
|
reset_adaptive_size_state(state)
|
||||||
state.adaptive_size_final = None
|
reset_signal_runtime_state(state)
|
||||||
state.adaptive_size_multiplier = None
|
reset_execution_runtime_state(state)
|
||||||
state.adaptive_size_reason = None
|
reset_market_analysis_state(state)
|
||||||
state.adaptive_size_factors = None
|
reset_runtime_expiration_state(state)
|
||||||
state.effective_risk_percent = None
|
reset_position_semantics_state(state)
|
||||||
state.effective_target_risk_usd = None
|
reset_position_protection_state(state)
|
||||||
state.execution_size_adjustment_reason = None
|
reset_autonomous_runtime_state(state)
|
||||||
|
reset_loss_cooldown_state(state)
|
||||||
|
|
||||||
state.last_signal = "HOLD"
|
|
||||||
state.last_signal_repeat_count = 0
|
|
||||||
state.last_signal_confidence = 0.0
|
|
||||||
state.last_signal_reason = None
|
|
||||||
state.decision_status = "WAITING"
|
|
||||||
state.decision_reason = None
|
|
||||||
state.is_signal_confirmed = False
|
|
||||||
state.is_signal_ready = False
|
|
||||||
state.signal_confirmation_seconds = 0
|
|
||||||
state.signal_confirmation_required_seconds = self._confirm_min_duration_seconds
|
state.signal_confirmation_required_seconds = self._confirm_min_duration_seconds
|
||||||
state.signal_confirmation_missing_repeats = self._confirm_repeats
|
state.signal_confirmation_missing_repeats = self._confirm_repeats
|
||||||
state.signal_confirmation_progress = 0.0
|
state.execution_confidence_required_score = (
|
||||||
state.signal_confirmation_reason = None
|
self._execution_confidence_required_score
|
||||||
state.signal_started_at = None
|
)
|
||||||
state.signal_updated_at = None
|
|
||||||
|
|
||||||
state.execution_block_reason = None
|
|
||||||
state.execution_semantic_status = None
|
|
||||||
state.execution_semantic_message = None
|
|
||||||
state.execution_semantic_reason = None
|
|
||||||
state.execution_quality = None
|
|
||||||
state.execution_quality_reason = None
|
|
||||||
state.execution_quality_message = None
|
|
||||||
state.execution_price_source = None
|
|
||||||
state.execution_price_age_seconds = None
|
|
||||||
state.execution_bid_price = None
|
|
||||||
state.execution_ask_price = None
|
|
||||||
state.execution_last_price = None
|
|
||||||
state.execution_price_freshness = None
|
|
||||||
state.execution_confidence_score = None
|
|
||||||
state.execution_confidence_level = None
|
|
||||||
state.execution_confidence_required_score = self._execution_confidence_required_score
|
|
||||||
state.execution_confidence_reason = None
|
|
||||||
state.execution_confidence_factors = None
|
|
||||||
|
|
||||||
state.market_state = None
|
|
||||||
state.market_trend = None
|
|
||||||
state.market_volatility = None
|
|
||||||
state.market_analysis_interval = None
|
|
||||||
state.market_analysis_reason = None
|
|
||||||
state.market_analysis_updated_at = None
|
|
||||||
state.market_runtime_degraded = False
|
|
||||||
state.market_trend_strength = None
|
|
||||||
state.market_trend_quality = None
|
|
||||||
state.market_phase = None
|
|
||||||
state.market_phase_direction = None
|
|
||||||
state.market_structure = None
|
|
||||||
state.market_structure_reason = None
|
|
||||||
state.market_score = None
|
|
||||||
state.market_score_label = None
|
|
||||||
state.market_long_score = None
|
|
||||||
state.market_short_score = None
|
|
||||||
|
|
||||||
state.last_closed_candle_change_percent = None
|
|
||||||
state.last_closed_candle_direction = None
|
|
||||||
state.current_interval_change_percent = None
|
|
||||||
state.current_interval_direction = None
|
|
||||||
state.current_interval_label = None
|
|
||||||
|
|
||||||
state.market_trend_gap_percent = None
|
|
||||||
state.market_trend_consistency = None
|
|
||||||
state.market_trend_efficiency = None
|
|
||||||
state.trend_quality_score = None
|
|
||||||
state.ema_distance_atr_ratio = None
|
|
||||||
state.ema_distance_state = None
|
|
||||||
state.entry_timing_state = None
|
|
||||||
state.entry_timing_reason = None
|
|
||||||
state.ema_fast_slope_percent = None
|
|
||||||
state.ema_slow_slope_percent = None
|
|
||||||
state.candle_noise_score = None
|
|
||||||
state.price_position_score = None
|
|
||||||
|
|
||||||
state.htf_interval = None
|
|
||||||
state.htf_atr_percent = None
|
|
||||||
state.htf_atr_percent_baseline = None
|
|
||||||
state.htf_volatility_ratio = None
|
|
||||||
state.htf_volatility = None
|
|
||||||
state.htf_market_state = None
|
|
||||||
state.htf_trend = None
|
|
||||||
state.htf_trend_strength = None
|
|
||||||
state.htf_trend_quality = None
|
|
||||||
state.htf_market_phase = None
|
|
||||||
state.htf_alignment = None
|
|
||||||
state.htf_confirmation_score = None
|
|
||||||
state.htf_reason = None
|
|
||||||
|
|
||||||
state.entry_block_reason = None
|
|
||||||
state.entry_block_message = None
|
|
||||||
|
|
||||||
state.momentum_state = None
|
|
||||||
state.momentum_direction = None
|
|
||||||
state.momentum_change_percent = None
|
|
||||||
state.momentum_strength = None
|
|
||||||
state.breakout_level = None
|
|
||||||
state.breakout_distance_percent = None
|
|
||||||
state.breakout_reason = None
|
|
||||||
|
|
||||||
state.runtime_expired_reason = None
|
|
||||||
state.runtime_expired_message = None
|
|
||||||
state.snapshot_age_seconds = None
|
|
||||||
state.spread_percent = None
|
|
||||||
|
|
||||||
state.position_pnl_percent = None
|
state.position_pnl_percent = None
|
||||||
state.position_hold_seconds = None
|
state.position_hold_seconds = None
|
||||||
@@ -513,58 +391,6 @@ class AutoLifecycleMixin(
|
|||||||
state.position_adverse_momentum = False
|
state.position_adverse_momentum = False
|
||||||
state.position_exit_pressure = None
|
state.position_exit_pressure = None
|
||||||
|
|
||||||
state.position_lifecycle_stage = None
|
|
||||||
state.position_hold_quality = None
|
|
||||||
state.position_decay_state = None
|
|
||||||
state.position_exit_confidence = None
|
|
||||||
state.position_exit_signal = None
|
|
||||||
state.position_intelligence_reason = None
|
|
||||||
state.position_recommended_action = None
|
|
||||||
|
|
||||||
state.position_peak_pnl_usd = None
|
|
||||||
state.position_peak_pnl_percent = None
|
|
||||||
state.position_mfe_percent = None
|
|
||||||
state.position_mae_percent = None
|
|
||||||
state.position_fatigue_score = None
|
|
||||||
state.position_fatigue_state = None
|
|
||||||
state.position_giveback_percent = None
|
|
||||||
state.position_conviction_state = None
|
|
||||||
state.position_exit_urgency = None
|
|
||||||
state.position_reversal_risk = None
|
|
||||||
state.position_stall_state = None
|
|
||||||
state.position_stall_reason = None
|
|
||||||
|
|
||||||
state.position_protection_status = None
|
|
||||||
state.position_protection_reason = None
|
|
||||||
state.break_even_armed = False
|
|
||||||
state.break_even_price = None
|
|
||||||
state.trailing_stop_active = False
|
|
||||||
state.trailing_stop_price = None
|
|
||||||
state.profit_lock_active = False
|
|
||||||
state.profit_lock_price = None
|
|
||||||
state.runtime_protection_action = None
|
|
||||||
state.runtime_protection_reason = None
|
|
||||||
state.runtime_protection_updated_at = None
|
|
||||||
|
|
||||||
state.autonomous_action = None
|
|
||||||
state.autonomous_action_reason = None
|
|
||||||
state.autonomous_action_confidence = None
|
|
||||||
state.autonomous_protection_required = False
|
|
||||||
state.autonomous_reduce_required = False
|
|
||||||
state.autonomous_exit_required = False
|
|
||||||
state.autonomous_last_action = None
|
|
||||||
state.autonomous_last_action_reason = None
|
|
||||||
state.autonomous_last_action_at = None
|
|
||||||
state.last_loss_monotonic_at = None
|
|
||||||
|
|
||||||
# Сброс именно runtime-блокировки, чтобы после нового запуска
|
|
||||||
# не оставалась старая пауза после прошлой убыточной сделки.
|
|
||||||
state.loss_cooldown_active = False
|
|
||||||
state.loss_cooldown_reason = None
|
|
||||||
state.execution_block_title = None
|
|
||||||
state.execution_block_message = None
|
|
||||||
state.execution_block_action = None
|
|
||||||
|
|
||||||
def _build_strategy_context(self) -> StrategyContext:
|
def _build_strategy_context(self) -> StrategyContext:
|
||||||
state = self.get_state()
|
state = self.get_state()
|
||||||
|
|
||||||
|
|||||||
428
app/src/trading/auto/state_reset.py
Normal file
428
app/src/trading/auto/state_reset.py
Normal file
@@ -0,0 +1,428 @@
|
|||||||
|
# app/src/trading/auto/state_reset.py
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
"""
|
||||||
|
Centralized runtime reset helpers for AutoTrade.
|
||||||
|
Helpers для сброса отдельных частей AutoTradeState.
|
||||||
|
|
||||||
|
ВАЖНО:
|
||||||
|
Все функции этого файла отвечают только за очистку runtime-состояния.
|
||||||
|
Каждая функция отвечает только за одну смысловую область runtime.
|
||||||
|
|
||||||
|
Функции намеренно не используют EventBus, JournalService,
|
||||||
|
ExecutionEngine или другие сервисы. Они изменяют только
|
||||||
|
поля AutoTradeState.
|
||||||
|
|
||||||
|
Это позволяет безопасно использовать их из разных runtime-компонентов
|
||||||
|
без изменения бизнес-логики.
|
||||||
|
|
||||||
|
ВАЖНО:
|
||||||
|
Они не должны изменять пользовательские настройки:
|
||||||
|
• symbol
|
||||||
|
• strategy
|
||||||
|
• leverage
|
||||||
|
• risk_percent
|
||||||
|
• stop_loss_percent
|
||||||
|
• take_profit_percent
|
||||||
|
• allocated_balance_usd
|
||||||
|
|
||||||
|
Их задача — заменить сотни ручных присваиваний вида
|
||||||
|
|
||||||
|
state.xxx = None
|
||||||
|
state.yyy = False
|
||||||
|
state.zzz = 0
|
||||||
|
|
||||||
|
едиными helper-функциями.
|
||||||
|
|
||||||
|
Используются из:
|
||||||
|
• auto_lifecycle.py
|
||||||
|
• signal_runtime.py
|
||||||
|
• execution.py
|
||||||
|
• других runtime-модулей.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from src.trading.auto.state import AutoTradeState
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Adaptive Position Sizing
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Runtime-параметры, связанные с динамическим изменением размера позиции.
|
||||||
|
# Сбрасываются при начале нового цикла или полном сбросе runtime.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_adaptive_size_state(state: AutoTradeState) -> None:
|
||||||
|
state.adaptive_size_base = None
|
||||||
|
state.adaptive_size_final = None
|
||||||
|
state.adaptive_size_multiplier = None
|
||||||
|
state.adaptive_size_reason = None
|
||||||
|
state.adaptive_size_factors = None
|
||||||
|
state.effective_risk_percent = None
|
||||||
|
state.effective_target_risk_usd = None
|
||||||
|
state.execution_size_adjustment_reason = None
|
||||||
|
state.adaptive_size_changed_at = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Signal Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Сбрасывает только runtime сигнала.
|
||||||
|
# Не затрагивает market context, позицию или protection.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_signal_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
state.last_signal = "HOLD"
|
||||||
|
state.last_signal_repeat_count = 0
|
||||||
|
state.last_signal_confidence = 0.0
|
||||||
|
state.last_signal_reason = None
|
||||||
|
|
||||||
|
state.signal_started_at = None
|
||||||
|
state.signal_updated_at = None
|
||||||
|
|
||||||
|
state.signal_confirmation_seconds = 0
|
||||||
|
state.signal_confirmation_missing_repeats = 0
|
||||||
|
state.signal_confirmation_progress = 0.0
|
||||||
|
state.signal_confirmation_reason = None
|
||||||
|
|
||||||
|
state.decision_status = "WAITING"
|
||||||
|
state.decision_reason = None
|
||||||
|
state.is_signal_confirmed = False
|
||||||
|
state.is_signal_ready = False
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Execution Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Сбрасывает все runtime-данные, связанные с execution layer:
|
||||||
|
# semantic status, quality, pricing snapshot и confidence.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_execution_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
state.execution_block_reason = None
|
||||||
|
state.execution_block_title = None
|
||||||
|
state.execution_block_message = None
|
||||||
|
state.execution_block_action = None
|
||||||
|
|
||||||
|
state.execution_semantic_status = None
|
||||||
|
state.execution_semantic_message = None
|
||||||
|
state.execution_semantic_reason = None
|
||||||
|
|
||||||
|
state.execution_quality = None
|
||||||
|
state.execution_quality_reason = None
|
||||||
|
state.execution_quality_message = None
|
||||||
|
|
||||||
|
state.execution_price_source = None
|
||||||
|
state.execution_price_age_seconds = None
|
||||||
|
state.execution_bid_price = None
|
||||||
|
state.execution_ask_price = None
|
||||||
|
state.execution_last_price = None
|
||||||
|
state.execution_price_freshness = None
|
||||||
|
|
||||||
|
state.execution_confidence_score = None
|
||||||
|
state.execution_confidence_level = None
|
||||||
|
state.execution_confidence_reason = None
|
||||||
|
state.execution_confidence_factors = None
|
||||||
|
|
||||||
|
state.snapshot_age_seconds = None
|
||||||
|
state.spread_percent = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Market Analysis Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Полностью очищает runtime-анализ рынка.
|
||||||
|
# Используется при истечении TTL или полном сбросе runtime.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_market_analysis_state(state: AutoTradeState) -> None:
|
||||||
|
state.market_state = None
|
||||||
|
state.market_trend = None
|
||||||
|
state.market_volatility = None
|
||||||
|
|
||||||
|
state.market_trend_strength = None
|
||||||
|
state.market_trend_quality = None
|
||||||
|
|
||||||
|
state.market_phase = None
|
||||||
|
state.market_phase_direction = None
|
||||||
|
|
||||||
|
state.market_score = None
|
||||||
|
state.market_score_label = None
|
||||||
|
state.market_long_score = None
|
||||||
|
state.market_short_score = None
|
||||||
|
|
||||||
|
state.last_closed_candle_change_percent = None
|
||||||
|
state.last_closed_candle_direction = None
|
||||||
|
|
||||||
|
state.current_interval_change_percent = None
|
||||||
|
state.current_interval_direction = None
|
||||||
|
state.current_interval_label = None
|
||||||
|
|
||||||
|
state.market_structure = None
|
||||||
|
state.market_structure_reason = None
|
||||||
|
|
||||||
|
state.market_trend_gap_percent = None
|
||||||
|
state.market_trend_consistency = None
|
||||||
|
state.market_trend_efficiency = None
|
||||||
|
|
||||||
|
state.trend_quality_score = None
|
||||||
|
|
||||||
|
state.ema_distance_atr_ratio = None
|
||||||
|
state.ema_distance_state = None
|
||||||
|
|
||||||
|
state.entry_timing_state = None
|
||||||
|
state.entry_timing_reason = None
|
||||||
|
|
||||||
|
state.ema_fast_slope_percent = None
|
||||||
|
state.ema_slow_slope_percent = None
|
||||||
|
|
||||||
|
state.candle_noise_score = None
|
||||||
|
state.price_position_score = None
|
||||||
|
|
||||||
|
state.htf_interval = None
|
||||||
|
state.htf_atr_percent = None
|
||||||
|
state.htf_atr_percent_baseline = None
|
||||||
|
state.htf_volatility_ratio = None
|
||||||
|
state.htf_volatility = None
|
||||||
|
|
||||||
|
state.htf_market_state = None
|
||||||
|
state.htf_trend = None
|
||||||
|
state.htf_trend_strength = None
|
||||||
|
state.htf_trend_quality = None
|
||||||
|
state.htf_market_phase = None
|
||||||
|
|
||||||
|
state.htf_alignment = None
|
||||||
|
state.htf_confirmation_score = None
|
||||||
|
state.htf_reason = None
|
||||||
|
|
||||||
|
state.momentum_state = None
|
||||||
|
state.momentum_direction = None
|
||||||
|
state.momentum_change_percent = None
|
||||||
|
state.momentum_strength = None
|
||||||
|
|
||||||
|
state.breakout_level = None
|
||||||
|
state.breakout_distance_percent = None
|
||||||
|
state.breakout_reason = None
|
||||||
|
|
||||||
|
state.market_analysis_interval = None
|
||||||
|
state.market_analysis_reason = None
|
||||||
|
state.market_analysis_updated_at = None
|
||||||
|
|
||||||
|
state.entry_block_reason = None
|
||||||
|
state.entry_block_message = None
|
||||||
|
|
||||||
|
state.market_runtime_degraded = False
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Runtime Expiration
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Причина последнего автоматического сброса runtime.
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_runtime_expiration_state(state: AutoTradeState) -> None:
|
||||||
|
state.runtime_expired_reason = None
|
||||||
|
state.runtime_expired_message = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Position Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_position_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
state.position_side = "NONE"
|
||||||
|
state.entry_price = None
|
||||||
|
state.position_size = None
|
||||||
|
state.position_opened_monotonic_at = None
|
||||||
|
state.unrealized_pnl_usd = None
|
||||||
|
|
||||||
|
state.position_pnl_percent = None
|
||||||
|
state.position_hold_seconds = None
|
||||||
|
state.position_pressure = None
|
||||||
|
state.position_health_score = None
|
||||||
|
state.position_health_status = None
|
||||||
|
state.position_health_reason = None
|
||||||
|
state.position_risk_level = None
|
||||||
|
state.position_risk_reason = None
|
||||||
|
state.position_trend_alignment = None
|
||||||
|
state.position_adverse_momentum = False
|
||||||
|
state.position_exit_pressure = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Position Semantics / Intelligence
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_position_semantics_state(state: AutoTradeState) -> None:
|
||||||
|
state.position_lifecycle_stage = None
|
||||||
|
state.position_hold_quality = None
|
||||||
|
state.position_decay_state = None
|
||||||
|
state.position_exit_confidence = None
|
||||||
|
state.position_exit_signal = None
|
||||||
|
state.position_intelligence_reason = None
|
||||||
|
state.position_recommended_action = None
|
||||||
|
|
||||||
|
state.position_peak_pnl_usd = None
|
||||||
|
state.position_peak_pnl_percent = None
|
||||||
|
state.position_mfe_percent = None
|
||||||
|
state.position_mae_percent = None
|
||||||
|
state.position_fatigue_score = None
|
||||||
|
state.position_fatigue_state = None
|
||||||
|
state.position_giveback_percent = None
|
||||||
|
state.position_conviction_state = None
|
||||||
|
state.position_exit_urgency = None
|
||||||
|
state.position_reversal_risk = None
|
||||||
|
state.position_stall_state = None
|
||||||
|
state.position_stall_reason = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Protection Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_position_protection_state(state: AutoTradeState) -> None:
|
||||||
|
state.position_protection_status = None
|
||||||
|
state.position_protection_reason = None
|
||||||
|
|
||||||
|
state.break_even_armed = False
|
||||||
|
state.break_even_price = None
|
||||||
|
state.trailing_stop_active = False
|
||||||
|
state.trailing_stop_price = None
|
||||||
|
state.profit_lock_active = False
|
||||||
|
state.profit_lock_price = None
|
||||||
|
|
||||||
|
state.runtime_protection_action = None
|
||||||
|
state.runtime_protection_reason = None
|
||||||
|
state.runtime_protection_updated_at = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Autonomous Management
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_autonomous_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
state.autonomous_action = None
|
||||||
|
state.autonomous_action_reason = None
|
||||||
|
state.autonomous_action_confidence = None
|
||||||
|
state.autonomous_protection_required = False
|
||||||
|
state.autonomous_reduce_required = False
|
||||||
|
state.autonomous_exit_required = False
|
||||||
|
|
||||||
|
state.autonomous_last_action = None
|
||||||
|
state.autonomous_last_action_reason = None
|
||||||
|
state.autonomous_last_action_at = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Loss Cooldown
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_loss_cooldown_state(state: AutoTradeState) -> None:
|
||||||
|
state.last_loss_monotonic_at = None
|
||||||
|
state.loss_cooldown_active = False
|
||||||
|
state.loss_cooldown_reason = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Flip Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_flip_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
state.last_flip_old_side = None
|
||||||
|
state.last_flip_new_side = None
|
||||||
|
state.last_flip_pnl_usd = None
|
||||||
|
state.last_flip_reason = None
|
||||||
|
state.last_flip_monotonic_at = None
|
||||||
|
state.last_flip_at = None
|
||||||
|
state.last_flip_block_reason = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Last Execution Runtime
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_last_execution_state(state: AutoTradeState) -> None:
|
||||||
|
state.last_execution_action = None
|
||||||
|
state.last_execution_reason = None
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Cycle Statistics
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_cycle_statistics_state(state: AutoTradeState) -> None:
|
||||||
|
state.cycle_realized_pnl_usd = 0.0
|
||||||
|
state.cycle_closed_trades = 0
|
||||||
|
state.cycle_winning_trades = 0
|
||||||
|
state.cycle_losing_trades = 0
|
||||||
|
state.cycle_consecutive_losses = 0
|
||||||
|
state.cycle_trade_fees_usd = 0.0
|
||||||
|
state.cycle_overnight_fees_usd = 0.0
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Full Runtime Reset
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_full_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
reset_cycle_statistics_state(state)
|
||||||
|
reset_adaptive_size_state(state)
|
||||||
|
reset_signal_runtime_state(state)
|
||||||
|
reset_execution_runtime_state(state)
|
||||||
|
reset_market_analysis_state(state)
|
||||||
|
reset_runtime_expiration_state(state)
|
||||||
|
reset_position_runtime_state(state)
|
||||||
|
reset_position_semantics_state(state)
|
||||||
|
reset_position_protection_state(state)
|
||||||
|
reset_autonomous_runtime_state(state)
|
||||||
|
reset_loss_cooldown_state(state)
|
||||||
|
reset_flip_runtime_state(state)
|
||||||
|
reset_last_execution_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
# Alias на случай старого имени.
|
||||||
|
def reset_runtime_state(state: AutoTradeState) -> None:
|
||||||
|
reset_full_runtime_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Lifecycle Scenario Resets
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def reset_after_auto_start(state: AutoTradeState) -> None:
|
||||||
|
reset_cycle_statistics_state(state)
|
||||||
|
reset_loss_cooldown_state(state)
|
||||||
|
reset_adaptive_size_state(state)
|
||||||
|
reset_signal_runtime_state(state)
|
||||||
|
reset_execution_runtime_state(state)
|
||||||
|
reset_runtime_expiration_state(state)
|
||||||
|
reset_flip_runtime_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_after_auto_stop(state: AutoTradeState) -> None:
|
||||||
|
reset_full_runtime_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_after_symbol_or_strategy_change(state: AutoTradeState) -> None:
|
||||||
|
reset_adaptive_size_state(state)
|
||||||
|
reset_signal_runtime_state(state)
|
||||||
|
reset_execution_runtime_state(state)
|
||||||
|
reset_market_analysis_state(state)
|
||||||
|
reset_runtime_expiration_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_after_position_closed(state: AutoTradeState) -> None:
|
||||||
|
reset_position_runtime_state(state)
|
||||||
|
reset_position_semantics_state(state)
|
||||||
|
reset_position_protection_state(state)
|
||||||
|
reset_autonomous_runtime_state(state)
|
||||||
|
reset_flip_runtime_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_after_market_runtime_expired(state: AutoTradeState) -> None:
|
||||||
|
reset_market_analysis_state(state)
|
||||||
|
|
||||||
|
|
||||||
|
def reset_after_signal_runtime_expired(state: AutoTradeState) -> None:
|
||||||
|
reset_signal_runtime_state(state)
|
||||||
|
reset_execution_runtime_state(state)
|
||||||
Reference in New Issue
Block a user