"""Giornale di bordo: scrive la voce del giorno nel DB e in `docs/journal/YYYY-MM-DD.md`. uv run python scripts/live/journal.py # voce di oggi uv run python scripts/live/journal.py --giorno 2026-08-21 uv run python scripts/live/journal.py --backfill 60 # ricostruisce gli ultimi N giorni uv run python scripts/live/journal.py --nota "testo" # annota il giorno (operatore) SOLA LETTURA su feed, log e venue: non tocca il libro, non manda ordini. Il campo `nota` e' l'UNICO posto per il testo libero, e non viene mai riscritto da un ricalcolo automatico. """ from __future__ import annotations import sys from datetime import date, datetime, timedelta, timezone from pathlib import Path ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(ROOT)) from src.live import journal as J # noqa: E402 from src.live import tradesdb as T # noqa: E402 def _arg(flag: str, default=None): a = sys.argv[1:] return a[a.index(flag) + 1] if flag in a and a.index(flag) + 1 < len(a) else default def una(con, g: date, nota: str | None = None, verbose: bool = True) -> Path: voce = J.costruisci(con, g) J.salva(con, voce, nota=nota) f = J.scrivi_file(con, voce) if verbose: p = voce["pnl"] d = p.get("delta_equity") print(f" {g} equity {p.get('equity_fine') or float('nan'):,.2f} " f"({'n/d' if d is None else f'{d:+.2f}'}) " f"fill {p['fill']} · rt {p['roundtrip_chiusi']} · giri {voce['salute']['giri_book']}/24" f" -> {f.relative_to(ROOT)}") return f if __name__ == "__main__": # sincronizzare PRIMA: altrimenti la sezione 'Libro' (letta dal log) e la sezione 'P&L' # (letta dal DB) descrivono due istanti diversi e la pagina si contraddice da sola. sys.path.insert(0, str(ROOT / "scripts" / "live")) from trades_db import sync as _sync _sync(verbose=False) con = T.connect() nota = _arg("--nota") if (n := _arg("--backfill")): oggi = datetime.now(timezone.utc).date() for i in range(int(n), -1, -1): g = oggi - timedelta(days=i) v = J.costruisci(con, g) # un giorno senza giri di book non e' una voce: e' assenza di dato if v["salute"]["giri_book"] == 0: continue J.salva(con, v); J.scrivi_file(con, v) tot = con.execute("SELECT COUNT(*) c FROM journal").fetchone()["c"] print(f" voci nel giornale: {tot}") else: g = date.fromisoformat(_arg("--giorno", datetime.now(timezone.utc).date().isoformat())) una(con, g, nota=nota, verbose="--quiet" not in sys.argv[1:]) con.close()