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 balance_usd = safe_float(state.allocated_balance_usd) or 0.0
if risk_percent is None or risk_percent <= 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 self._zero_position_size(state)
return 0.0
if stop_loss_percent is None or stop_loss_percent <= 0: 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 self._zero_position_size(state)
return 0.0
price = safe_float(entry_price) price = safe_float(entry_price)
@@ -59,15 +57,13 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol):
price = None price = None
if price is None or price <= 0: 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 self._zero_position_size(state)
return 0.0
target_risk_usd = balance_usd * (risk_percent / 100) target_risk_usd = balance_usd * (risk_percent / 100)
stop_loss_distance_usd = price * (stop_loss_percent / 100) stop_loss_distance_usd = price * (stop_loss_percent / 100)
if target_risk_usd <= 0 or stop_loss_distance_usd <= 0: 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 self._zero_position_size(state)
return 0.0
base_size = target_risk_usd / stop_loss_distance_usd base_size = target_risk_usd / stop_loss_distance_usd
multiplier = self._adaptive_size_multiplier(state) multiplier = self._adaptive_size_multiplier(state)
@@ -82,6 +78,17 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol):
return self._round_size(final_size) 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 факторам # рассчитать коэффициент изменения размера позиции по итоговым runtime/context факторам
def _adaptive_size_multiplier(self, state: AutoTradeState) -> float: def _adaptive_size_multiplier(self, state: AutoTradeState) -> float:
multiplier = 1.0 multiplier = 1.0
@@ -204,9 +211,10 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol):
4, 4,
) )
allocated_balance = safe_float(state.allocated_balance_usd) or 0.0
state.effective_target_risk_usd = round( state.effective_target_risk_usd = round(
state.allocated_balance_usd allocated_balance * (state.effective_risk_percent / 100),
* (state.effective_risk_percent / 100),
4, 4,
) )
@@ -303,9 +311,10 @@ class ExecutionSizingMixin(_ExecutionSizingProtocol):
4, 4,
) )
allocated_balance = safe_float(state.allocated_balance_usd) or 0.0
state.effective_target_risk_usd = round( state.effective_target_risk_usd = round(
state.allocated_balance_usd allocated_balance * (state.effective_risk_percent / 100),
* (state.effective_risk_percent / 100),
4, 4,
) )