1279ea605a
Il feed 1h certificato si ferma alle 00:00: per le letture successive `asof` dava la stessa barra a t0 e t1, mercato "fermo" = 0, e qualunque calo >=10% del giorno sarebbe stato un "movimento" scorporato come prelievo (giornale dal 25/08, report da oggi). Con feed assente tutto era "ambiguo" e il report stampava e1/e0-1 sotto l'etichetta TWR. - journal.movimenti_capitale: stato "mercato non misurabile" (feed fermo/assente/barra mancante) => ambiguo con la ragione; leva_tetto = min(frac x n x scala, LEVA_LORDA_MAX) (P1). - journal.rendimento_twr: salto non classificabile => twr E trading None con motivo. - journal.pnl_giorno CHIAMA rendimento_twr (prima rifaceva cum - certi: "entrambi la chiamano" era falso); la pagina stampa il TWR; analista qualifica il cumulato "di cui versati". - trades_db --report: la classe di ogni salto con la sua misura (mercato max a leva piena). - book_execute docstring: banda dello stop -33,5%/-26,5% (era invertita), "non costa ordini" -> micro-ordini di ri-taglia (22/48, C2), latenza <=1h solo con feed fresca, conteggi di r0823 al posto di "raddoppia" (2 contro 1 e' rotolante vs pavimento sulla riga 4h; la peggiore misurata e' 24h). - test_book_cadenza: LTF_MIN importato da skyhook; tutte le righe attive della crontab (una sola); tre stati dello skip (col progetto ma senza cron_book => ROSSO); slot di release testato con venue_probe (il :07 come controllo positivo); parser regolare, passo > 0. - r0823_sl_anchor: guardia sul :47 (era sul vecchio :07), prosa al passato; cron_chain.sh idem. - CLAUDE.md: §5.7 frase invertita corretta, §5.14 limite vero (non l'artefatto della fixture), §2 ora della LETTURA (13:47Z), nuovo debito §5.15 (USDE fuori dal bound di mercato). - diari: tempi "scritto" corretti coi commit; sezione "Seconda tornata". Test +11 (858 verdi). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XDJsH3iDSaBns3ccpPBwiu
99 lines
4.3 KiB
Python
99 lines
4.3 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
|
|
|
|
|
|
def test_il_report_con_il_feed_assente_non_stampa_il_grezzo_come_TWR(monkeypatch, capsys):
|
|
# revisione 02/09: con data/raw assente (host ripristinato prima di rebuild_history) ogni
|
|
# salto era "ambiguo", certi=0, e il report stampava +243% sotto l'etichetta TWR
|
|
monkeypatch.setattr(J, "_px_1h", lambda a: None)
|
|
con = T.connect()
|
|
_prepara(con, [("2026-08-24T10:47:01+00:00", 600.0),
|
|
("2026-08-25T11:47:01+00:00", 2000.0),
|
|
("2026-08-26T10:47:01+00:00", 2020.0)])
|
|
con.close()
|
|
_carica_script().report()
|
|
out = capsys.readouterr().out
|
|
assert "TWR : n/d" in out and "trading da arming : n/d" in out
|
|
assert "% =" not in out and "+236" not in out
|
|
assert "[ambiguo: mercato non misurabile" in out
|