diff --git a/app/src/trading/auto/auto_lifecycle.py b/app/src/trading/auto/auto_lifecycle.py index 631186a..8a4450a 100644 --- a/app/src/trading/auto/auto_lifecycle.py +++ b/app/src/trading/auto/auto_lifecycle.py @@ -23,6 +23,8 @@ from src.trading.auto.state_reset import ( reset_position_semantics_state, reset_runtime_expiration_state, reset_signal_runtime_state, + reset_execution_block_state, + reset_position_health_state, ) from src.trading.execution.engine import ExecutionEngine from src.trading.strategies.base import BaseStrategy, StrategyContext @@ -108,7 +110,7 @@ class AutoLifecycleMixin( numeric_value = 1000.0 state.allocated_balance_usd = numeric_value - state.execution_block_reason = None + reset_execution_block_state(state) state.execution_size_adjustment_reason = None return state @@ -159,10 +161,7 @@ class AutoLifecycleMixin( # чтобы запуск не наследовал паузу прошлого цикла. reset_loss_cooldown_state(state) - state.execution_block_title = None - state.execution_block_message = None - state.execution_block_action = None - state.execution_block_reason = None + reset_execution_block_state(state) EventBus.emit( "auto_status_changed", @@ -344,7 +343,7 @@ class AutoLifecycleMixin( def set_max_reserved_balance_percent(self, value: NumericLike | None) -> AutoTradeState: state = self.get_state() state.max_reserved_balance_percent = safe_float(value) - state.execution_block_reason = None + reset_execution_block_state(state) return state def _reset_signal_tracking(self) -> None: @@ -374,17 +373,7 @@ class AutoLifecycleMixin( self._execution_confidence_required_score ) - 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 + reset_position_health_state(state) def _build_strategy_context(self) -> StrategyContext: state = self.get_state() diff --git a/app/src/trading/auto/position_health.py b/app/src/trading/auto/position_health.py index 985326b..f1059a1 100644 --- a/app/src/trading/auto/position_health.py +++ b/app/src/trading/auto/position_health.py @@ -5,6 +5,7 @@ from __future__ import annotations from src.core.numbers import safe_float from src.core.types import NumericLike from src.trading.auto.state import AutoTradeState +from src.trading.auto.state_reset import reset_position_health_state from src.trading.execution.constants import ( EXECUTION_QUALITY_BLOCKED, EXECUTION_QUALITY_WARNING, @@ -37,17 +38,7 @@ class AutoPositionHealthMixin: # синхронизировать runtime health/risk состояние открытой позиции def _sync_position_health_state(self, state: AutoTradeState) -> None: if state.position_side == "NONE" or state.entry_price is 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 + reset_position_health_state(state) return # PnL % и время удержания больше не считаем здесь. diff --git a/app/src/trading/auto/position_semantics.py b/app/src/trading/auto/position_semantics.py index 3453697..687409e 100644 --- a/app/src/trading/auto/position_semantics.py +++ b/app/src/trading/auto/position_semantics.py @@ -4,6 +4,7 @@ from __future__ import annotations from src.core.numbers import safe_float from src.trading.auto.state import AutoTradeState +from src.trading.auto.state_reset import reset_position_semantics_state from src.trading.execution.constants import ( POSITION_EXIT_DAMPING_MATURE_MULTIPLIER, POSITION_EXIT_DAMPING_MATURE_SECONDS, @@ -33,25 +34,7 @@ class AutoPositionSemanticsMixin: # синхронизировать semantics-состояние открытой позиции def _sync_position_semantics_state(self, state: AutoTradeState) -> None: if state.position_side == "NONE" or state.entry_price is 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 + reset_position_semantics_state(state) return lifecycle_stage = self._position_lifecycle_stage(state)