journal: due movimenti dichiarati nello stesso intervallo, il secondo sovrascrive il primo (TWR falso) #27
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Revisione 2026-09-27 (goldrake): rilievo Opus 5.5, verifica avversariale fable. Sola lettura, nessun codice toccato.
Rilievo C1 [registro-falso]
FILE: PG:src/live/journal.py:246-257
COSA: due movimenti DICHIARATI nello stesso intervallo fra due letture: il secondo sovrascrive il primo (lo cerca in
eventiperts_dopo, trova l'evento del primo dichiarato e ci faupdate).SCENARIO: equity 1000 (10:47) -> 1060 (11:47); dichiarati +25 alle 11:00 e +30 alle 11:30 -> eventi=1, certi=30, fonte="dichiarato+rilevato" (nessun salto era stato rilevato), trading=+30 invece di +5, TWR +2,9% invece di +0,5%. Nessun avviso.
PROVA: VERIFICATO: script su DB tmp + MOVIMENTI_DICHIARATI deviato ->
eventi 1 [(30.0,'dichiarato+rilevato')] certi 30.0 | twr 0.0291 trading 30.0.PROPOSTA: in
giacercare solo eventi con fonte=="rilevato"; se l'evento e' gia' dichiarato, SOMMARE i delta (e la nota), non sostituire. Test con due dichiarati nella stessa ora.Verifica fable C1 VERDETTO: CONFERMATO
GRAVITA': alto
PERCHE':
src/live/journal.py:246-252:gia = next(e for e in eventi if e["ts_dopo"] == cur["ts_utc"])non filtra perfonte; il secondo dichiarato nello stesso intervallo trova l'evento del primo (fonte="dichiarato", appena appeso a 254) eupdate(delta=d["delta"], fonte="dichiarato+rilevato")lo SOSTITUISCE.certie TWR sbagliati senza avviso. Lo scenario del revisore e' coerente con la lettura; la fonte «dichiarato+rilevato» e' inoltre falsa (nessun salto rilevato).CORREZIONE: ok (cercare solo
fonte=="rilevato"; se gia' dichiarato sommare delta e concatenare la dichiarazione).ANALISI (passo 1, Opus) — unita' U4, ramo lavoro/goldrake-u4, repo gitea:Adriano/PythagorasGoal
RIF: #27 (C1), #32 (C2, C10), #34 (C6), #35 (solo C7, C9, C15)
FILE: src/live/journal.py, src/live/tradesdb.py, scripts/live/analista.py, tests/
giacerca un evento per ts_dopo senza filtrare fonte, il secondo dichiarato nello stesso intervallo sovrascrive il primo. Nuovo: cercare solo eventi con fonte == "rilevato" per l'aggancio "dichiarato+rilevato"; se esiste gia' un evento DICHIARATO nello stesso intervallo, SOMMARE i delta e concatenare le dichiarazioni (fonte resta "dichiarato"). Test: +25 e +30 dichiarati nello stesso intervallo, trading reale +5 -> trading risulta +5 e TWR coerente; un dichiarato che coincide con un salto rilevato -> "dichiarato+rilevato" come oggi.restoscartato in silenzio. Leggi tutti i chiamanti (reconcile, stato_aperto, report) e adegua dove leggono i lotti (segno/direzione). Test: long->chiuso (invariato, bit-exact con i test esistenti), short aperto e chiuso, inversione in un fill.#32 C10 — fill "NON VERIFICATO" a qty 0 (place_order error): nel parser (o subito dopo) i fill con qty <= 0 NON entrano nel FIFO ne' in stato_aperto; restano nel DB marcati (colonna esistente verified=0; se serve un campo nuovo, niente migrazioni distruttive: ALTER TABLE ADD COLUMN idempotente). Test.
⚠️ NON cambiare le regex di parse_cron_log ne' il formato che leggono (un'altra unita' lavora su book_execute e ne rispetta il formato).
voce(verificare che rendi_markdown funzioni senza la riga in DB; se legge nota/analisi dal DB, passarle vuote). Test: --secco su DB temporaneo -> DB invariato.adesso.hour + (1 if adesso.minute >= MINUTO_GIRO + 1 else 0)con MINUTO_GIRO = 47 costante di modulo commentata "deve restare d'accordo con la crontab e scripts/cron_book.sh". Test ai minuti 10 e 50.#35 C15 — finestra "ultimi 7 giorni" (~594-597) copre 8 giorni di calendario: baseline = ultima lettura <= giorno-7 fine giornata, oppure la finestra dichiarata nel testo come e' davvero: scegli la correzione che rende VERO il testo e dillo. Test.
#35 C7 — drawdown (~596-615) sulla serie grezza: un prelievo certo diventa drawdown, un versamento alza il picco. Calcolare il DD sulla serie al netto dei movimenti certi (gli stessi che la pagina gia' scorpora per il TWR). Test con versamento e con prelievo.
TEST: nuovi in tests/test_journal_u4.py, tests/test_tradesdb_u4.py; DB sqlite temporanei (tmp_path). Suite completa:
cd <worktree> && /opt/docker/PythagorasGoal/.venv/bin/python -m pytest -q -p no:cacheprovider(baseline 1098 passed, 3 skipped).NON TOCCARE: parse_cron_log e le sue regex; scripts/live/book_execute.py; data/ (nessun DB vero: non esiste nel worktree e non va creato); /opt/docker/PythagorasGoal. Nessuna rete, nessun Telegram.
ESITO: fatto sul ramo, non in produzione
RIF: gitea:Adriano/PythagorasGoal#27
COSA: correzione su lavoro/goldrake (pushato), analisi Opus, codice Sonnet, controllo finale Opus
FILE: commit
ac21e1cPROVA: /home/adriano/lavoro/PythagorasGoal pytest -q → 1166 passed, 3 skipped
MANCA: merge su main — richiede ok esplicito di Adriano (libro vivo). Chiusura con --soluzione dopo il merge.
PROSSIMO: ok di Adriano → merge lavoro/goldrake su main → git pull in /opt/docker/PythagorasGoal
Soluzione
src/live/journal.py: dichiarati agganciati solo a eventi rilevati e sommati nello stesso intervallo; giro atteso da MINUTO_GIRO=47; base7; drawdown su eq_netto.
COMMIT:
ac21e1c, su main dal 27/09/2026 (merge con ok di Adriano). Produzione aggiornata.