From ecf8b5f60dd1e50e9c70a23e3aff324ae4feebd6 Mon Sep 17 00:00:00 2001 From: Sergey Date: Fri, 3 Jul 2026 11:45:21 +0300 Subject: [PATCH] refactor(execution): simplify zero size handling --- app/src/trading/execution/sizing.py | 33 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/app/src/trading/execution/sizing.py b/app/src/trading/execution/sizing.py index 11ab575..28d2015 100644 --- a/app/src/trading/execution/sizing.py +++ b/app/src/trading/execution/sizing.py @@ -43,12 +43,10 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol): balance_usd = safe_float(state.allocated_balance_usd) or 0.0 if risk_percent is None or risk_percent <= 0: - self._sync_adaptive_size_state(state, base_size=0.0, final_size=0.0, multiplier=0.0) - return 0.0 + return self._zero_position_size(state) if stop_loss_percent is None or stop_loss_percent <= 0: - self._sync_adaptive_size_state(state, base_size=0.0, final_size=0.0, multiplier=0.0) - return 0.0 + return self._zero_position_size(state) price = safe_float(entry_price) @@ -59,15 +57,13 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol): price = None if price is None or price <= 0: - self._sync_adaptive_size_state(state, base_size=0.0, final_size=0.0, multiplier=0.0) - return 0.0 + return self._zero_position_size(state) target_risk_usd = balance_usd * (risk_percent / 100) stop_loss_distance_usd = price * (stop_loss_percent / 100) if target_risk_usd <= 0 or stop_loss_distance_usd <= 0: - self._sync_adaptive_size_state(state, base_size=0.0, final_size=0.0, multiplier=0.0) - return 0.0 + return self._zero_position_size(state) base_size = target_risk_usd / stop_loss_distance_usd multiplier = self._adaptive_size_multiplier(state) @@ -82,6 +78,17 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol): return self._round_size(final_size) + # единый выход из расчёта size, когда вход невозможен: + # сбрасывает adaptive size/runtime risk в 0 и возвращает 0.0 + def _zero_position_size(self, state: AutoTradeState) -> float: + self._sync_adaptive_size_state( + state, + base_size=0.0, + final_size=0.0, + multiplier=0.0, + ) + return 0.0 + # рассчитать коэффициент изменения размера позиции по итоговым runtime/context факторам def _adaptive_size_multiplier(self, state: AutoTradeState) -> float: multiplier = 1.0 @@ -204,9 +211,10 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol): 4, ) + allocated_balance = safe_float(state.allocated_balance_usd) or 0.0 + state.effective_target_risk_usd = round( - state.allocated_balance_usd - * (state.effective_risk_percent / 100), + allocated_balance * (state.effective_risk_percent / 100), 4, ) @@ -303,9 +311,10 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol): 4, ) + allocated_balance = safe_float(state.allocated_balance_usd) or 0.0 + state.effective_target_risk_usd = round( - state.allocated_balance_usd - * (state.effective_risk_percent / 100), + allocated_balance * (state.effective_risk_percent / 100), 4, )