From d80323ff596abb641f6e99f34d76435196903239 Mon Sep 17 00:00:00 2001 From: "Adriano (goldrake)" Date: Sun, 27 Sep 2026 15:11:20 +0000 Subject: [PATCH] analista: testata mostra trading_giorno (non l'equity grezza) e 'nel giorno', non 'oggi' (#35 C8) Co-Authored-By: Claude Sonnet 5 --- src/live/analista.py | 15 ++++++++++++++- tests/test_analista.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/live/analista.py b/src/live/analista.py index e669d98..ba0812e 100644 --- a/src/live/analista.py +++ b/src/live/analista.py @@ -206,9 +206,22 @@ def testata(voce: dict) -> str: p, lb = voce.get("pnl") or {}, voce.get("libro") or {} dq, cum = p.get("delta_equity"), p.get("cumulato_da_arming") eq = p.get("equity_fine") + # (#35 C8) il cron gira alle 00:30 sul giorno CHIUSO: "oggi" e' ieri -> "nel giorno". E se + # ci sono movimenti di capitale CERTI (mov_giorno; bool() come journal.scorporo: assente o + # 0 -> nessun movimento) la cifra da mostrare e' trading_giorno (al netto), non l'equity + # grezza: altrimenti un versamento si legge come P&L (successo il 25/08, +$1.399 letti come + # profitto). Se trading_giorno non e' calcolabile si resta su delta_equity, ma con l'etichetta + # nuova: non e' "oggi", e non e' comunque il trading al netto. + dq_t = p.get("trading_giorno") + if p.get("mov_giorno") and dq_t is not None: + nota_dq = f" ({dq_t:+.2f} nel giorno, di cui {p['mov_giorno']:+.2f} movimenti)" + elif dq is not None: + nota_dq = f" ({dq:+.2f} nel giorno)" + else: + nota_dq = "" r = [f"๐Ÿ““ Giornale โ€” {_b(voce['giorno'])}"] r.append(" equity " + (f"${eq:,.2f}" if eq is not None else "n/d") - + ("" if dq is None else f" ({dq:+.2f} oggi)") + + nota_dq + ("" if cum is None else f" ยท dall'arming {cum:+.2f}" + (f" (di cui {p['mov_arming']:+.2f} versati -> trading " f"{p['trading_da_arming']:+.2f})" diff --git a/tests/test_analista.py b/tests/test_analista.py index d24eec5..1348f7d 100644 --- a/tests/test_analista.py +++ b/tests/test_analista.py @@ -285,6 +285,39 @@ def test_la_testata_porta_i_numeri_che_si_leggono_dalla_notifica(): t = A.testata(_voce_piena()) assert "$637.36" in t and "+2.36" in t and "+39.30" in t assert "BTC $+116" in t and "leva 0.41x" in t and "1 fill" in t + # (#35 C8) il cron gira alle 00:30 sul giorno CHIUSO: non e' "oggi", e' "nel giorno". + assert "nel giorno" in t and "oggi" not in t + + +def test_testata_con_movimento_mostra_trading_giorno_non_il_grezzo(): + """(#35 C8) Un versamento di $1.399 non deve leggersi come P&L: con mov_giorno != 0 e + trading_giorno calcolabile, la cifra mostrata e' trading_giorno, non delta_equity.""" + voce = _voce_piena() + voce["pnl"] = dict(voce["pnl"], delta_equity=1401.36, mov_giorno=1399.0, trading_giorno=2.36) + t = A.testata(voce) + assert "+2.36 nel giorno" in t + assert "di cui +1399.00 movimenti" in t + assert "+1401.36" not in t # il grezzo non compare piu' in testata + + +def test_testata_con_movimento_ma_trading_giorno_none_resta_sul_grezzo(): + """(#35 C8) Se trading_giorno non e' calcolabile (None) si resta su delta_equity, ma con + l'etichetta nuova, non "oggi".""" + voce = _voce_piena() + voce["pnl"] = dict(voce["pnl"], delta_equity=1401.36, mov_giorno=1399.0, trading_giorno=None) + t = A.testata(voce) + assert "+1401.36 nel giorno" in t + assert "di cui" not in t + + +def test_testata_senza_movimento_mostra_il_grezzo_con_etichetta_nuova(): + """(#35 C8) mov_giorno assente o 0: nessun movimento da scorporare, stesso trattamento di + journal.scorporo (bool()).""" + voce = _voce_piena() + voce["pnl"] = dict(voce["pnl"], mov_giorno=0.0, trading_giorno=2.36) + t = A.testata(voce) + assert "+2.36 nel giorno" in t + assert "di cui" not in t def test_il_messaggio_sfugge_l_HTML_e_converte_il_grassetto():