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 не дублируется.
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 позицией.",
)

View File

@@ -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 = (