trades.db: ora, prezzo e pos_after veri dei fill dal jsonl #40

Closed
opened 2026-09-27 17:37:34 +00:00 by Adriano · 2 comments
Owner

COSA: trades.db prende i fill da cron_book.log (ts = inizio giro, prezzo a 1 decimale, pos_after NULL). book_executions.jsonl ha dal 2026-08-24T01:07Z ts_utc del fill, prezzo pieno e pos_after. sync arricchisce le righe cron_log col record jsonl corrispondente.
PERCHE: regola 'l'ora e' quella dell'evento' (CLAUDE.md globale); round-trip calcolati su prezzi arrotondati.
NON E': l'unificazione dei parser (TradingBook#11, alla promozione).
FATTO QUANDO: sync abbinato per asset/side/qty/finestra di giro, idempotente, round-trip ricalcolati, test.

COSA: trades.db prende i fill da cron_book.log (ts = inizio giro, prezzo a 1 decimale, pos_after NULL). book_executions.jsonl ha dal 2026-08-24T01:07Z ts_utc del fill, prezzo pieno e pos_after. sync arricchisce le righe cron_log col record jsonl corrispondente. PERCHE: regola 'l'ora e' quella dell'evento' (CLAUDE.md globale); round-trip calcolati su prezzi arrotondati. NON E': l'unificazione dei parser (TradingBook#11, alla promozione). FATTO QUANDO: sync abbinato per asset/side/qty/finestra di giro, idempotente, round-trip ricalcolati, test.
Adriano added the sviluppo label 2026-09-27 17:37:34 +00:00
Author
Owner

ANALISI (passo 1, Opus, 27/09/2026)

ANALISI U12 — gitea:Adriano/PythagorasGoal#39 (bug) + #40 (sviluppo)
CARTELLA: /home/adriano/lavoro/PG-u12 RAMO: lavoro/goldrake-u12 (da main d34b0a8). Contiene la copia locale dei dati in data/.

#39 — pos_after sempre None in book_executions.jsonl (regressione di #23)
FILE: scripts/live/book_execute.py:88-106 (_registra_fill) e ~:325-345 (_run, ramo rebalance)
MODIFICA:

  1. _registra_fill riceve un nuovo keyword pos_after: float | None = None e lo passa a log_event, al posto del None fisso. Aggiornare il docstring.
  2. In _run, ramo normale (dopo fills = trader.rebalance_signed(...)): leggere newpos SUBITO, in un try.
    • Se riesce: pos_after=newpos per tutti i fill del passo (e' cio' che faceva il codice prima di #23) e la stampa "reconcile: pos $X".
    • Se solleva: pos_after=None, stampa "reconcile: pos illeggibile (...)".
    • Poi il ciclo for f in fills: _registra_fill(..., pos_after=...).
    • Vincolo #23 mantenuto: la lettura non puo' impedire la registrazione del fill (il try la isola). Il commento del blocco lo dice.
  3. Ramo RebalanceParziale: pos_after=None (il passo e' a meta'), invariato.
    TEST: in tests/test_book_u2.py, seguendo i trader finti esistenti.
  • rebalance ok con position_usd -> 500.0: il record log_event ha pos_after 500.0.
  • position_usd che solleva dopo il rebalance: fill registrato comunque, pos_after None.
  • Il test #23 esistente (fill non perso se la lettura fallisce) resta verde.

#40 — trades.db arricchito dal jsonl
FILE: scripts/live/trades_db.py::sync, src/live/tradesdb.py
PRIMA leggi come si calcola fill_id (tradesdb.py :164) e l'INSERT (:338, ON CONFLICT DO NOTHING). Se fill_id dipende da ts_utc o price, l'arricchimento NON deve cambiare fill_id: si aggiornano solo le colonne, la chiave resta.
MODIFICA:

  1. Nuova funzione pura in tradesdb.py: arricchisci_da_jsonl(con, righe_jsonl) -> int (righe aggiornate).
    • Riga DB candidata: ts_source='cron_log' e ts_utc >= CUTOFF_TS_VERO (quelle prima non hanno controparte con l'ora vera).
    • Abbinamento: stesso asset, stesso side, |qty - filled| < 1e-9, e ts jsonl in [ts_utc DB, ts_utc DB + 15 minuti] (il DB ha l'inizio giro, il jsonl l'ora del fill).
    • Esattamente UN candidato jsonl -> UPDATE ts_utc=ts jsonl, ts_source='jsonl', price=price jsonl, pos_after=pos_after jsonl (solo se non None; altrimenti resta).
    • Zero o piu' candidati -> non si tocca, e si conta come "ambiguo".
    • Un record jsonl usato una volta non si riusa.
    • Idempotente: una riga gia' ts_source='jsonl' non e' piu' candidata.
  2. sync(): dopo l'inserimento e PRIMA di rebuild_roundtrips (i round-trip devono vedere i prezzi pieni), chiamare arricchisci_da_jsonl.
    • Controlla che rebuild_roundtrips sia chiamato da sync; se no, chiamalo dopo l'arricchimento quando ha aggiornato righe.
    • Il risultato di sync porta arricchiti e ambigui; in verbose una riga di stampa.
  3. Il controllo dei conteggi di #37 C11 (gia' in sync) resta com'e'.
  4. Docstring di tradesdb.py: una frase che dice che dopo sync le righe dal 24/08 hanno l'ora e il prezzo del fill dal jsonl (ts_source='jsonl').
    VERIFICA SUI DATI (sola lettura, sulla COPIA in data/ della tua cartella, MAI /opt/docker):
  • copia data/live/trades.db in /tmp/claude-1001/u12.db e fai girare arricchisci_da_jsonl su quella;
  • riporta quante righe arricchite e quante ambigue sui dati veri.
    TEST: tests/test_tradesdb_arricchisci.py con DB in tmp_path.
  • abbinamento unico -> aggiornato;
  • due jsonl compatibili -> ambiguo, non toccato;
  • secondo sync -> 0 aggiornati;
  • riga prima del cutoff -> non toccata;
  • fill_id invariato dopo l'UPDATE.

NON TOCCARE: il parser di cron_book.log (TradingBook#11), book_execute oltre il punto #39, i dati in /opt/docker/PythagorasGoal.
Suite: SOLO test mirati (tests/test_book_u2.py tests/test_book_live.py tests/test_tradesdb*.py tests/test_trades_db_sync.py tests/test_tradesdb_arricchisci.py). La suite completa la lancia il coordinatore: la VPS ha 7 GB, e con piu' suite in parallelo e' gia' andata in OOM.
COMMIT: "book_execute: pos_after di nuovo nel jsonl, letta subito dopo il rebalance in un try (#39)" e "tradesdb: fill cron_log arricchiti con ora, prezzo e pos_after dal jsonl (#40)".

ANALISI (passo 1, Opus, 27/09/2026) ANALISI U12 — gitea:Adriano/PythagorasGoal#39 (bug) + #40 (sviluppo) CARTELLA: /home/adriano/lavoro/PG-u12 RAMO: lavoro/goldrake-u12 (da main d34b0a8). Contiene la copia locale dei dati in data/. #39 — pos_after sempre None in book_executions.jsonl (regressione di #23) FILE: scripts/live/book_execute.py:88-106 (_registra_fill) e ~:325-345 (_run, ramo rebalance) MODIFICA: 1. _registra_fill riceve un nuovo keyword `pos_after: float | None = None` e lo passa a log_event, al posto del None fisso. Aggiornare il docstring. 2. In _run, ramo normale (dopo `fills = trader.rebalance_signed(...)`): leggere newpos SUBITO, in un try. - Se riesce: pos_after=newpos per tutti i fill del passo (e' cio' che faceva il codice prima di #23) e la stampa "reconcile: pos $X". - Se solleva: pos_after=None, stampa "reconcile: pos illeggibile (...)". - Poi il ciclo `for f in fills: _registra_fill(..., pos_after=...)`. - Vincolo #23 mantenuto: la lettura non puo' impedire la registrazione del fill (il try la isola). Il commento del blocco lo dice. 3. Ramo RebalanceParziale: pos_after=None (il passo e' a meta'), invariato. TEST: in tests/test_book_u2.py, seguendo i trader finti esistenti. - rebalance ok con position_usd -> 500.0: il record log_event ha pos_after 500.0. - position_usd che solleva dopo il rebalance: fill registrato comunque, pos_after None. - Il test #23 esistente (fill non perso se la lettura fallisce) resta verde. #40 — trades.db arricchito dal jsonl FILE: scripts/live/trades_db.py::sync, src/live/tradesdb.py PRIMA leggi come si calcola fill_id (tradesdb.py ~:164) e l'INSERT (~:338, ON CONFLICT DO NOTHING). Se fill_id dipende da ts_utc o price, l'arricchimento NON deve cambiare fill_id: si aggiornano solo le colonne, la chiave resta. MODIFICA: 1. Nuova funzione pura in tradesdb.py: arricchisci_da_jsonl(con, righe_jsonl) -> int (righe aggiornate). - Riga DB candidata: ts_source='cron_log' e ts_utc >= CUTOFF_TS_VERO (quelle prima non hanno controparte con l'ora vera). - Abbinamento: stesso asset, stesso side, |qty - filled| < 1e-9, e ts jsonl in [ts_utc DB, ts_utc DB + 15 minuti] (il DB ha l'inizio giro, il jsonl l'ora del fill). - Esattamente UN candidato jsonl -> UPDATE ts_utc=ts jsonl, ts_source='jsonl', price=price jsonl, pos_after=pos_after jsonl (solo se non None; altrimenti resta). - Zero o piu' candidati -> non si tocca, e si conta come "ambiguo". - Un record jsonl usato una volta non si riusa. - Idempotente: una riga gia' ts_source='jsonl' non e' piu' candidata. 2. sync(): dopo l'inserimento e PRIMA di rebuild_roundtrips (i round-trip devono vedere i prezzi pieni), chiamare arricchisci_da_jsonl. - Controlla che rebuild_roundtrips sia chiamato da sync; se no, chiamalo dopo l'arricchimento quando ha aggiornato righe. - Il risultato di sync porta `arricchiti` e `ambigui`; in verbose una riga di stampa. 3. Il controllo dei conteggi di #37 C11 (gia' in sync) resta com'e'. 4. Docstring di tradesdb.py: una frase che dice che dopo sync le righe dal 24/08 hanno l'ora e il prezzo del fill dal jsonl (ts_source='jsonl'). VERIFICA SUI DATI (sola lettura, sulla COPIA in data/ della tua cartella, MAI /opt/docker): - copia data/live/trades.db in /tmp/claude-1001/u12.db e fai girare arricchisci_da_jsonl su quella; - riporta quante righe arricchite e quante ambigue sui dati veri. TEST: tests/test_tradesdb_arricchisci.py con DB in tmp_path. - abbinamento unico -> aggiornato; - due jsonl compatibili -> ambiguo, non toccato; - secondo sync -> 0 aggiornati; - riga prima del cutoff -> non toccata; - fill_id invariato dopo l'UPDATE. NON TOCCARE: il parser di cron_book.log (TradingBook#11), book_execute oltre il punto #39, i dati in /opt/docker/PythagorasGoal. Suite: SOLO test mirati (tests/test_book_u2.py tests/test_book_live.py tests/test_tradesdb*.py tests/test_trades_db_sync.py tests/test_tradesdb_arricchisci.py). La suite completa la lancia il coordinatore: la VPS ha 7 GB, e con piu' suite in parallelo e' gia' andata in OOM. COMMIT: "book_execute: pos_after di nuovo nel jsonl, letta subito dopo il rebalance in un try (#39)" e "tradesdb: fill cron_log arricchiti con ora, prezzo e pos_after dal jsonl (#40)".
Author
Owner

Soluzione

tradesdb.arricchisci_da_jsonl: righe cron_log dal CUTOFF_TS_VERO abbinate per asset/side/qty e finestra 15 min al record jsonl -> ts_utc, price, pos_after veri, ts_source='jsonl'; ambigui non toccati; idempotente; round-trip ricalcolati dopo. Chiamata da trades_db sync. Produzione: 147 arricchiti, 0 ambigui (backup data/live/trades.db.pre-40-*). Commit bebfa63; porting in TB ed72f92.

**Soluzione** tradesdb.arricchisci_da_jsonl: righe cron_log dal CUTOFF_TS_VERO abbinate per asset/side/qty e finestra 15 min al record jsonl -> ts_utc, price, pos_after veri, ts_source='jsonl'; ambigui non toccati; idempotente; round-trip ricalcolati dopo. Chiamata da trades_db sync. Produzione: 147 arricchiti, 0 ambigui (backup data/live/trades.db.pre-40-*). Commit bebfa63; porting in TB ed72f92.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/PythagorasGoal#40