analista: testata mostra trading_giorno (non l'equity grezza) e 'nel giorno', non 'oggi' (#35 C8)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-27 15:11:20 +00:00
parent 31ec767ff5
commit d80323ff59
2 changed files with 47 additions and 1 deletions
+14 -1
View File
@@ -206,9 +206,22 @@ def testata(voce: dict) -> str:
p, lb = voce.get("pnl") or {}, voce.get("libro") or {} p, lb = voce.get("pnl") or {}, voce.get("libro") or {}
dq, cum = p.get("delta_equity"), p.get("cumulato_da_arming") dq, cum = p.get("delta_equity"), p.get("cumulato_da_arming")
eq = p.get("equity_fine") 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"<b>📓 Giornale — {_b(voce['giorno'])}</b>"] r = [f"<b>📓 Giornale — {_b(voce['giorno'])}</b>"]
r.append(" equity " + (f"<b>${eq:,.2f}</b>" if eq is not None else "n/d") r.append(" equity " + (f"<b>${eq:,.2f}</b>" 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}" + ("" if cum is None else f" · dall'arming {cum:+.2f}"
+ (f" (di cui {p['mov_arming']:+.2f} versati -> trading " + (f" (di cui {p['mov_arming']:+.2f} versati -> trading "
f"{p['trading_da_arming']:+.2f})" f"{p['trading_da_arming']:+.2f})"
+33
View File
@@ -285,6 +285,39 @@ def test_la_testata_porta_i_numeri_che_si_leggono_dalla_notifica():
t = A.testata(_voce_piena()) t = A.testata(_voce_piena())
assert "$637.36" in t and "+2.36" in t and "+39.30" in t 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 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(): def test_il_messaggio_sfugge_l_HTML_e_converte_il_grassetto():