live/deribit,execution: open_orders non ingoia gli errori; ensure_disaster_sl -> unknown (#24)
open_orders solleva RuntimeError se 'all' o 'trigger_all' falliscono, invece di ritornare []
(un bracket disaster-SL perso su 'trigger_all' e' lo stesso difetto di una posizione persa su
'all'). ensure_disaster_sl avvolge la lettura di posizione+open_orders in try/except: su
eccezione ritorna {"state": "unknown", "notes": ...} senza cancellare ne' piazzare, distinto
da "naked" (protezione tolta e non rimessa). shadow.shadow_report chiama open_orders gia'
dentro try/except (non toccato).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+13
-7
@@ -262,17 +262,23 @@ class DeribitRead:
|
||||
|
||||
def open_orders(self, instrument: str) -> list[dict]:
|
||||
"""Ordini APERTI su `instrument` (limit resting + trigger). Deribit puo' omettere i trigger
|
||||
untriggered da type='all' -> interroga anche 'trigger_all' e fa merge per order_id."""
|
||||
untriggered da type='all' -> interroga anche 'trigger_all' e fa merge per order_id.
|
||||
|
||||
⚠️ Se UNA delle due chiamate solleva, NON si ingoia (#24): prima ritornava [] anche a meta'
|
||||
letta, e un bracket disaster-SL perso su 'trigger_all' e' lo stesso difetto di una posizione
|
||||
persa su 'all' — il chiamante (ensure_disaster_sl) deve saperlo, non decidere su dati a
|
||||
meta'. Il chiamante che vuole restare in piedi comunque (shadow.shadow_report) si mette il
|
||||
try/except da solo."""
|
||||
cur = _CONTRACT[instrument]["settle"]
|
||||
seen: dict = {}
|
||||
for typ in ("all", "trigger_all"):
|
||||
try:
|
||||
out = self._unwrap(self._post("/mcp-deribit/tools/get_open_orders",
|
||||
{"currency": cur, "type": typ}))
|
||||
lst = out if isinstance(out, list) else (out.get("orders", []) if isinstance(out, dict) else [])
|
||||
for o in lst:
|
||||
if o.get("instrument_name") == instrument or o.get("instrument") == instrument:
|
||||
seen[o.get("order_id")] = o
|
||||
except Exception:
|
||||
pass
|
||||
except Exception as e: # noqa: BLE001 — si registra il tipo (P3), non si ingoia (#24)
|
||||
raise RuntimeError(f"open_orders illeggibile: {type(e).__name__}: {e}") from e
|
||||
lst = out if isinstance(out, list) else (out.get("orders", []) if isinstance(out, dict) else [])
|
||||
for o in lst:
|
||||
if o.get("instrument_name") == instrument or o.get("instrument") == instrument:
|
||||
seen[o.get("order_id")] = o
|
||||
return list(seen.values())
|
||||
|
||||
Reference in New Issue
Block a user