refactor(execution): simplify zero size handling
This commit is contained in:
@@ -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,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user