- Drop duckdb dependency (pyproject, requirements) -> psycopg2-binary. - run_live_paper: boot log shows the real Postgres target (masked); add _db_target_desc() helper. - .env.example: document DATABASE_URL / PG* vars; mark WATCHER_EVENT_DB_PATH legacy. - evaluation/storage.py: INSERT OR REPLACE -> INSERT (setup_id is a fresh uuid). Verified: 67/67 tests green on Postgres with duckdb UNINSTALLED; app boots against the live endpoint (127.0.0.1:5432 proxy) and wrote 205 daily bars. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
34 lines
1.0 KiB
Python
34 lines
1.0 KiB
Python
"""Persist setup evaluations into the research DB (setup_events table)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import uuid
|
|
from datetime import datetime
|
|
|
|
|
|
def store_setup_event(con, symbol: str, session_date, result: dict) -> str:
|
|
"""Insert one evaluation result into setup_events. Returns setup_id."""
|
|
setup_id = str(uuid.uuid4())
|
|
setups = result.get("setups") or []
|
|
best = setups[0] if setups else {}
|
|
con.execute(
|
|
"""
|
|
INSERT INTO setup_events
|
|
(setup_id, symbol, setup_time, session_date, setup_name,
|
|
entry_reference_price, invalidation_price, gap_pct, relative_volume)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
""",
|
|
[
|
|
setup_id,
|
|
symbol,
|
|
datetime.now(),
|
|
session_date,
|
|
best.get("setup_type") or "first_pullback",
|
|
best.get("entry_price"),
|
|
best.get("stop_loss_price"),
|
|
result.get("gap_pct"),
|
|
result.get("relative_volume"),
|
|
],
|
|
)
|
|
return setup_id
|