Un'eccezione sulla lettura del conto USDE valeva 0 USDE: se il conto ne aveva davvero, l'equity totale risultava sottostimata senza che nulla lo dicesse. Ora _collaterale_usde ritorna None + la nota dell'eccezione, e _equity propaga l'ignoto (real_eq None -> eq_fallback, non un numero falso). shadow_report.online guardava solo il mark di BTC: con ETH in fallback il giro si considerava comunque online. Ora richiede TUTTI i mark da mainnet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+20
-7
@@ -95,15 +95,20 @@ def _positions(client):
|
||||
USDE_INDEX_URL = _usde.index_url()
|
||||
|
||||
|
||||
def _collaterale_usde(client) -> tuple[float, str]:
|
||||
def _collaterale_usde(client) -> tuple[float | None, str]:
|
||||
"""Valore USD dell'USDE tenuto come collaterale. Il PERCHE' e le proprieta' (depeg che
|
||||
PASSA nel sizing, clamp sopra la pari, fallback 1.0 dichiarato mai 0) stanno in
|
||||
src/live/usde.py — difetto d'origine 2026-08-26: `_equity` leggeva solo il conto USDC,
|
||||
-24% fantasma dopo la prima conversione."""
|
||||
-24% fantasma dopo la prima conversione.
|
||||
|
||||
⚠️ (#20) Un'eccezione sulla LETTURA del conto USDE non e' "0 USDE": e' "non lo so". Ritorna
|
||||
None (non 0.0) + la nota dell'eccezione -> `_equity` propaga l'ignoto invece di dedurre un
|
||||
equity piu' basso di quello vero. Eq letta con successo e <= 0 resta 0.0 (conto senza USDE:
|
||||
quello e' un fatto accertato, legittimo)."""
|
||||
try:
|
||||
eq = float(client.account_summary("USDE").get("equity") or 0)
|
||||
except Exception:
|
||||
return 0.0, ""
|
||||
except Exception as e:
|
||||
return None, f"USDE illeggibile: {type(e).__name__}: {e}"
|
||||
if eq <= 0:
|
||||
return 0.0, ""
|
||||
px, _fonte = _usde.prezzo(client, url=USDE_INDEX_URL)
|
||||
@@ -117,6 +122,8 @@ def _equity(client, marks):
|
||||
eq = float(client.account_summary("USDC").get("equity") or 0)
|
||||
if eq > 1:
|
||||
usde_usd, usde_note = _collaterale_usde(client)
|
||||
if usde_usd is None: # (#20) USDE illeggibile -> l'equity e' IGNOTA,
|
||||
return None, usde_note # non "USDC senza USDE": non si assume 0.
|
||||
if usde_usd > 0:
|
||||
return eq + usde_usd, f"mainnet USDC + {usde_note}"
|
||||
return eq, "mainnet USDC"
|
||||
@@ -133,7 +140,8 @@ def _equity(client, marks):
|
||||
if any_ok and tot > 1:
|
||||
return tot, "mainnet coin-margined"
|
||||
# real_eq=None qui -> shadow_report ripiega su paper_cap e alza eq_fallback (diagnostica B):
|
||||
# segnalato a book_execute (alert), non blocca (l'hard-cap $300/asset limita il downside).
|
||||
# segnalato a book_execute, che in modo SOLO PROTEZIONE non manda alcun rebalance_signed —
|
||||
# controlla comunque il disaster-SL, che dipende da posizione/mark, non da equity (#21).
|
||||
return None, "conto flat / non finanziato"
|
||||
|
||||
|
||||
@@ -158,7 +166,9 @@ def shadow_report(offline: bool = False, equity_override: float | None = None) -
|
||||
eq_basis = ("override" if equity_override is not None
|
||||
else eq_src if real_eq else "paper capital (ipotetico: conto non finanziato)")
|
||||
# Opzione B (diagnostica): ONLINE ma equity reale non leggibile -> sizing su paper_cap invece del
|
||||
# conto reale. NON blocca (l'hard-cap $300/asset limita il downside), ma va SEGNALATO.
|
||||
# conto reale. SEGNALATO, e book_execute passa a SOLO PROTEZIONE: nessun rebalance_signed (non
|
||||
# si dimensiona un ordine senza sapere quanto vale il conto), ma il disaster-SL si controlla
|
||||
# comunque per ogni asset (#21).
|
||||
eq_fallback = (f"equity reale non leggibile ({eq_src}) -> sizing su paper_cap ${paper_cap:,.0f} "
|
||||
f"invece del conto reale") if (equity_override is None and client is not None
|
||||
and not real_eq) else None
|
||||
@@ -208,7 +218,10 @@ def shadow_report(offline: bool = False, equity_override: float | None = None) -
|
||||
|
||||
return dict(
|
||||
last_data=str(pd.Timestamp(last_ts, unit="ms", tz="UTC").date()),
|
||||
online=(client is not None and marks_src.get("BTC") == "mainnet"),
|
||||
# (#25) TUTTI i mark devono venire da mainnet, non solo BTC: con due asset, un solo
|
||||
# controllo lasciava ETH libero di essere in fallback (close certificata) senza che
|
||||
# `online` lo dicesse -> il gate offline di book_execute non si accorgeva del guasto.
|
||||
online=(client is not None and all(marks_src.get(a) == "mainnet" for a in ASSETS)),
|
||||
real_equity=real_eq, equity=equity, eq_basis=eq_basis,
|
||||
pos_src=pos_src, pos_error=pos_error, eq_fallback=eq_fallback,
|
||||
assets=assets, orders=orders, live_trades=live_trades,
|
||||
|
||||
Reference in New Issue
Block a user