Files
PythagorasGoal/tests/test_trades_report.py
T
Adriano Dal Pastro 835e0c8666 revisione 02/09: il rotolante si CONTROLLA ogni ora (non "si ri-ancora"), TWR con limiti dichiarati e tre stati
Quattro segnalazioni della revisione sui commit di oggi, tutte verificate e riparate.

1. book_execute.py (+ CLAUDE.md §5.7, memoria 40): «il disaster-SL rotolante si ri-ancora ogni
   ora» era falso — ensure_disaster_sl lascia il bracket finche' lo stop e' entro il 5% e la
   taglia entro il 10%; il giro orario CONTROLLA, ri-ancora oltre la tolleranza (mark
   +5,263%/-4,762%). Lo stop siede fra -26,3% e -33,3% dal mark corrente.
2. journal.rendimento_twr: limite dichiarato (D5) — l'intervallo che contiene un movimento
   certo esce intero dal rendimento, il suo P&L di mercato va in `certi`; errore massimo meta'
   del movimento per costruzione (25/08: ~$0,5). Non si stima (P12). Segmenti a lunghezza zero
   non prodotti; nessun tempo a mercato -> 0,0 dichiarato numero.
3. base di equity zero: `twr` E `trading` None con motivo (il salto 0->X e' invisibile al
   classificatore, `trading` valeva l'intero conto); il report stampa n/d.
4. test_book_cadenza: la guardia estrae ogni prescrizione «ogni/every N unita'» e pretende 60
   minuti, con controllo positivo (M15); limite P13 dichiarato.

Test +5 (847 verdi). Diari 02/09 e 02/09b con la sezione "Revisione".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RziUCB336YPUUyDJ29x4Ke
2026-09-02 15:17:05 +00:00

83 lines
3.5 KiB
Python

"""`trades_db.py --report` non stampa piu' un bonifico come rendimento (debito #14, 2026-09-02).
Il numero che stampava era `e1/e0-1` sulla serie grezza: «+243%» per il 96,3% un versamento.
Il report ora CHIAMA `journal.rendimento_twr` (P1: non rifa' il conto). `T.connect()` nudo
finisce in tmp grazie alla fixture autouse di conftest: qui non si tocca il libro vivo.
"""
from __future__ import annotations
import importlib.util
import sys
from pathlib import Path
import pandas as pd
import pytest
ROOT = Path(__file__).resolve().parents[1]
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 _carica_script():
spec = importlib.util.spec_from_file_location("trades_db_script", ROOT / "scripts/live/trades_db.py")
mod = importlib.util.module_from_spec(spec)
spec.loader.exec_module(mod)
return mod
def _px_piatto(livello=100.0):
ix = pd.date_range("2026-08-20", "2026-08-27", freq="1h", tz="UTC")
return pd.Series(livello, index=ix)
def _prepara(con, equity):
con.execute("INSERT INTO fills (fill_id, ts_utc, ts_source, asset, side, qty, price, fee) "
"VALUES ('f1','2026-08-24T10:47:15+00:00','test','BTC','buy',0.001,60000.0,0.01)")
for ts, eq in equity:
con.execute("INSERT INTO equity (ts_utc, equity, src) VALUES (?,?,?)", (ts, eq, "test"))
con.commit()
def test_il_report_stampa_il_TWR_e_non_il_grezzo(monkeypatch, capsys):
monkeypatch.setattr(J, "_px_1h", lambda a: _px_piatto())
con = T.connect() # -> tmp (conftest), NON data/live/trades.db
assert "data/live" not in str(con.execute("PRAGMA database_list").fetchone()[2])
_prepara(con, [("2026-08-24T10:47:01+00:00", 600.0),
("2026-08-25T10:47:01+00:00", 630.0), # +5%: sotto soglia rilevatore
("2026-08-25T11:47:01+00:00", 2030.0), # +1400: versamento
("2026-08-26T10:47:01+00:00", 2009.7)]) # -1%
con.close()
_carica_script().report()
out = capsys.readouterr().out
assert "TWR : +3.95%" in out
assert "+234.95%" not in out and "+235" not in out # il grezzo non compare piu'
assert "movimenti capitale : +1,400.00 certi" in out
assert "trading da arming : +9.70" in out
assert "movimenti di capitale INCLUSI" in out # il delta $ resta, etichettato
def test_il_report_senza_movimenti_dice_lo_stesso_numero_di_prima(monkeypatch, capsys):
monkeypatch.setattr(J, "_px_1h", lambda a: _px_piatto())
con = T.connect()
_prepara(con, [("2026-08-24T10:47:01+00:00", 600.0), ("2026-08-25T10:47:01+00:00", 630.0)])
con.close()
_carica_script().report()
out = capsys.readouterr().out
assert "TWR : +5.00%" in out and "movimenti capitale" not in out
def test_il_report_a_base_zero_dice_n_d_e_non_l_intero_conto(monkeypatch, capsys):
monkeypatch.setattr(J, "_px_1h", lambda a: _px_piatto())
con = T.connect()
_prepara(con, [("2026-08-24T09:47:01+00:00", 0.0),
("2026-08-24T10:47:01+00:00", 598.06),
("2026-08-25T10:47:01+00:00", 610.0)])
con.close()
_carica_script().report()
out = capsys.readouterr().out
assert "trading da arming : n/d" in out and "TWR : n/d" in out
assert "trading da arming : +610.00" not in out # l'intero conto NON e' "trading"
assert "(+610.00 di equity, movimenti di capitale INCLUSI)" in out # il fatto resta, etichettato