|
|
@@ -361,14 +361,28 @@ class Strategy(Strategy):
|
|
|
quote_total: float | None = None,
|
|
|
) -> dict[str, float | str]:
|
|
|
ratio_price = price if price > 0 else float(self.state.get("last_price") or self.state.get("center_price") or 1.0)
|
|
|
- if base_total is not None or quote_total is not None:
|
|
|
- # Shape planning should see the whole wallet, not only the free slice.
|
|
|
- base_value = max(float(base_total if base_total is not None else self.state.get("base_available") or 0.0), 0.0) * ratio_price
|
|
|
- counter_value = max(float(quote_total if quote_total is not None else self.state.get("counter_available") or 0.0), 0.0)
|
|
|
- total = base_value + counter_value
|
|
|
- ratio = base_value / total if total > 0 else 0.5
|
|
|
- else:
|
|
|
- ratio = self._inventory_ratio(ratio_price if ratio_price > 0 else 1.0)
|
|
|
+ if base_total is None or quote_total is None:
|
|
|
+ live_orders = list(self.state.get("orders") or [])
|
|
|
+ reserved_quote = sum(
|
|
|
+ float(order.get("price") or 0.0) * float(order.get("amount") or 0.0)
|
|
|
+ for order in live_orders
|
|
|
+ if isinstance(order, dict) and str(order.get("side") or "").lower() == "buy"
|
|
|
+ )
|
|
|
+ reserved_base = sum(
|
|
|
+ float(order.get("amount") or 0.0)
|
|
|
+ for order in live_orders
|
|
|
+ if isinstance(order, dict) and str(order.get("side") or "").lower() == "sell"
|
|
|
+ )
|
|
|
+ if base_total is None:
|
|
|
+ base_total = max(float(self.state.get("base_available") or 0.0), 0.0) + reserved_base
|
|
|
+ if quote_total is None:
|
|
|
+ quote_total = max(float(self.state.get("counter_available") or 0.0), 0.0) + reserved_quote
|
|
|
+
|
|
|
+ # Rebalance bias must see the whole wallet, not only the free slice.
|
|
|
+ base_value = max(float(base_total or 0.0), 0.0) * ratio_price
|
|
|
+ counter_value = max(float(quote_total or 0.0), 0.0)
|
|
|
+ total = base_value + counter_value
|
|
|
+ ratio = base_value / total if total > 0 else 0.5
|
|
|
imbalance = min(abs(ratio - 0.5) * 2.0, 1.0)
|
|
|
factor = float(self.config.get("inventory_rebalance_step_factor", 0.15) or 0.0)
|
|
|
factor = min(max(factor, 0.0), 0.9)
|