refactor(execution): simplify zero size handling

This commit is contained in:
2026-07-03 11:45:21 +03:00
parent bcbec1aa02
commit ecf8b5f60d

View File

@@ -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,
)