From cfd7d768062960c771805e3576ad9c03ded1e02c Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 2 Jul 2026 22:50:04 +0300 Subject: [PATCH] refactor(execution): standardize execution skip and reset cleanup --- app/src/trading/execution/engine.py | 10 ++++------ app/src/trading/execution/position_actions.py | 12 +++++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/src/trading/execution/engine.py b/app/src/trading/execution/engine.py index a0ee958..784b30f 100644 --- a/app/src/trading/execution/engine.py +++ b/app/src/trading/execution/engine.py @@ -131,16 +131,14 @@ class ExecutionEngine( # Не пытаемся повторно открыть позицию в ту же сторону. # Сигнал остаётся валидным для UI/Telegram, но execution не дублируется. if position.side == POSITION_SIDE_LONG and state.last_signal == SIGNAL_BUY: - return ExecutionDecision( - EXECUTION_ACTION_NONE, - False, + return self._skip_execution( + state, "Сигнал BUY совпадает с уже открытой LONG позицией.", ) if position.side == POSITION_SIDE_SHORT and state.last_signal == SIGNAL_SELL: - return ExecutionDecision( - EXECUTION_ACTION_NONE, - False, + return self._skip_execution( + state, "Сигнал SELL совпадает с уже открытой SHORT позицией.", ) diff --git a/app/src/trading/execution/position_actions.py b/app/src/trading/execution/position_actions.py index 9dcf0be..bc48a5c 100644 --- a/app/src/trading/execution/position_actions.py +++ b/app/src/trading/execution/position_actions.py @@ -9,6 +9,10 @@ from src.core.event_bus import EventBus from src.core.numbers import safe_float from src.core.types import JsonDict, NumericLike from src.trading.auto.state import AutoTradeState +from src.trading.auto.state_reset import ( + reset_autonomous_runtime_state, + reset_execution_block_state, +) from src.trading.execution.models import ExecutionDecision from src.trading.execution.pricing import ExecutionPrice from src.trading.journal.service import JournalService @@ -811,7 +815,7 @@ class ExecutionPositionActionsMixin(_ExecutionPositionActionsProtocol): # чтобы UI/protection/semantics не ждали следующего цикла. state.position_opened_monotonic_at = opened_monotonic_at - state.execution_block_reason = None + reset_execution_block_state(state) state.last_flip_block_reason = None state.last_execution_action = action state.last_execution_reason = f"Позиция {side} открыта." @@ -972,15 +976,13 @@ class ExecutionPositionActionsMixin(_ExecutionPositionActionsProtocol): # После закрытия очищаем autonomous cooldown/action, # чтобы новая сделка не унаследовала runtime-действие прошлой позиции. - state.autonomous_last_action = None - state.autonomous_last_action_reason = None - state.autonomous_last_action_at = None + reset_autonomous_runtime_state(state) # После закрытия очищаем protection и lifecycle runtime закрытой позиции. self._reset_runtime_protection_state(state) self._reset_position_lifecycle_state(state) - state.execution_block_reason = None + reset_execution_block_state(state) state.last_flip_block_reason = None state.last_execution_action = (