refactor(execution): standardize execution skip and reset cleanup

This commit is contained in:
2026-07-02 22:50:04 +03:00
parent d334461339
commit cfd7d76806
2 changed files with 11 additions and 11 deletions

View File

@@ -131,16 +131,14 @@ class ExecutionEngine(
# Не пытаемся повторно открыть позицию в ту же сторону. # Не пытаемся повторно открыть позицию в ту же сторону.
# Сигнал остаётся валидным для UI/Telegram, но execution не дублируется. # Сигнал остаётся валидным для UI/Telegram, но execution не дублируется.
if position.side == POSITION_SIDE_LONG and state.last_signal == SIGNAL_BUY: if position.side == POSITION_SIDE_LONG and state.last_signal == SIGNAL_BUY:
return ExecutionDecision( return self._skip_execution(
EXECUTION_ACTION_NONE, state,
False,
"Сигнал BUY совпадает с уже открытой LONG позицией.", "Сигнал BUY совпадает с уже открытой LONG позицией.",
) )
if position.side == POSITION_SIDE_SHORT and state.last_signal == SIGNAL_SELL: if position.side == POSITION_SIDE_SHORT and state.last_signal == SIGNAL_SELL:
return ExecutionDecision( return self._skip_execution(
EXECUTION_ACTION_NONE, state,
False,
"Сигнал SELL совпадает с уже открытой SHORT позицией.", "Сигнал SELL совпадает с уже открытой SHORT позицией.",
) )

View File

@@ -9,6 +9,10 @@ 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 JsonDict, NumericLike from src.core.types import JsonDict, NumericLike
from src.trading.auto.state import AutoTradeState 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.models import ExecutionDecision
from src.trading.execution.pricing import ExecutionPrice from src.trading.execution.pricing import ExecutionPrice
from src.trading.journal.service import JournalService from src.trading.journal.service import JournalService
@@ -811,7 +815,7 @@ class ExecutionPositionActionsMixin(_ExecutionPositionActionsProtocol):
# чтобы UI/protection/semantics не ждали следующего цикла. # чтобы UI/protection/semantics не ждали следующего цикла.
state.position_opened_monotonic_at = opened_monotonic_at 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_flip_block_reason = None
state.last_execution_action = action state.last_execution_action = action
state.last_execution_reason = f"Позиция {side} открыта." state.last_execution_reason = f"Позиция {side} открыта."
@@ -972,15 +976,13 @@ class ExecutionPositionActionsMixin(_ExecutionPositionActionsProtocol):
# После закрытия очищаем autonomous cooldown/action, # После закрытия очищаем autonomous cooldown/action,
# чтобы новая сделка не унаследовала runtime-действие прошлой позиции. # чтобы новая сделка не унаследовала runtime-действие прошлой позиции.
state.autonomous_last_action = None reset_autonomous_runtime_state(state)
state.autonomous_last_action_reason = None
state.autonomous_last_action_at = None
# После закрытия очищаем protection и lifecycle runtime закрытой позиции. # После закрытия очищаем protection и lifecycle runtime закрытой позиции.
self._reset_runtime_protection_state(state) self._reset_runtime_protection_state(state)
self._reset_position_lifecycle_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_flip_block_reason = None
state.last_execution_action = ( state.last_execution_action = (