"""MICRO-TEST esecuzione su Deribit mainnet — round-trip minimo su BTC_USDC-PERPETUAL, apri+chiudi. Conto reale = USDC -> strumento ESEGUIBILE = perp LINEARE `BTC_USDC-PERPETUAL` (amount in BTC, step 0.0001 ~ $6). Valida il percorso ordine->fill->reconciliation->chiusura con soldi VERI a size MINIMA (~0x leva, decoupled dal segnale): test della plumbing, non della strategia. Usa open()/close() verificati di src/live/execution.py (logica entrata/uscita presa da Old). Sicurezze: default DRY-RUN. Pre-flight ABORT se posizione preesistente. La chiusura (reduce_only, sempre permessa) flatta comunque dopo l'apertura; verifica finale di FLAT (alert se no). uv run python scripts/live/microtest.py # DRY-RUN: nessun ordine inviato uv run python scripts/live/microtest.py --live # invia il round-trip REALE """ from __future__ import annotations import sys from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(PROJECT_ROOT)) from src.live.execution import FLAT_USD, MAX_AMOUNT, DeribitTrader INSTRUMENT = "BTC_USDC-PERPETUAL" AMOUNT = 0.0001 # base-coin (BTC) = 1 contratto minimo (~$6 a $63k) def main(): live = "--live" in sys.argv[1:] t = DeribitTrader() print("=" * 82) print(" MICRO-TEST esecuzione TP01 — round-trip 0.0001 BTC su BTC_USDC-PERPETUAL (leva ~0x)") print("=" * 82) try: equity = float(t.account_summary("USDC").get("equity") or 0) mark = t.mark_price(INSTRUMENT) pos0 = t.position_usd(INSTRUMENT) except Exception as e: print(f" PRE-FLIGHT FALLITO (read): {type(e).__name__}: {e}\n -> non procedo.") return notional = AMOUNT * mark print(f" conto USDC equity : ${equity:,.2f}") print(f" mark {INSTRUMENT} : ${mark:,.1f}") print(f" posizione attuale : ${pos0:,.2f} notional (dev'essere 0)") print(f" apertura : BUY {AMOUNT:.4f} BTC market (~${notional:.2f}, leva {notional/equity:.4f}x)") print(f" chiusura : SELL {AMOUNT:.4f} BTC market reduce_only") print(f" guardrail: solo {INSTRUMENT}, cap apertura {MAX_AMOUNT[INSTRUMENT]} BTC") if abs(pos0) >= FLAT_USD: print(f"\n ABORT: posizione preesistente (${pos0:,.2f}). Non la tocco. Chiudila a mano e ripeti.") return if not live: print("\n DRY-RUN: nessun ordine inviato. Rilancia con --live per il round-trip reale.") return # ---- LIVE: apertura ---- print("\n >>> LIVE: APERTURA ...") fo = t.open(INSTRUMENT, "buy", AMOUNT, label="tp01-microtest-open") if not fo.verified: print(f" apertura NON verificata: {fo.notes}") # safety: assicura comunque il flat fc = t.close(INSTRUMENT, label="tp01-microtest-safeclose") print(f" safe-close: {'eseguita' if fc else 'gia flat'}; posizione ${t.position_usd(INSTRUMENT):,.2f}") return print(f" FILL: {fo.filled:.4f} BTC @ ${fo.price:,.1f} fee {fo.fee_usdc:.6f} USDC (state={fo.state})") # ---- LIVE: chiusura (reduce_only) ---- print(" >>> LIVE: CHIUSURA (reduce_only) ...") fc = t.close(INSTRUMENT, label="tp01-microtest-close") pos_end = t.position_usd(INSTRUMENT) if fc: print(f" FILL: {fc.filled:.4f} BTC @ ${fc.price:,.1f} fee {fc.fee_usdc:.6f} USDC (state={fc.state})") print(f" posizione finale: ${pos_end:,.2f} notional") # ---- report ---- print("\n " + "-" * 62) if abs(pos_end) < FLAT_USD: print(" ✓ ROUND-TRIP COMPLETO — posizione tornata a FLAT.") else: print(f" ⚠️ posizione NON flat (${pos_end:,.2f}) — INTERVENTO MANUALE: chiudi a mano.") if fo.verified and fc: tot_fee = fo.fee_usdc + fc.fee_usdc pnl = AMOUNT * ((fc.price or 0) - (fo.price or 0)) print(f" entry ${fo.price:,.1f} -> exit ${fc.price:,.1f} | fee {tot_fee:.6f} USDC | " f"pnl lordo {pnl:+.4f} | netto {pnl - tot_fee:+.4f} USDC") print(" Validato: invio ordine reale, fill, fee reali, reconciliation, ritorno a flat.") if __name__ == "__main__": main()