Files
momentum-system/strategy/evaluation/storage.py
T
momentum devandClaude Opus 4.8 b1ef0930ca WS0 cleanup: DuckDB-free + wire DATABASE_URL
- 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>
2026-06-16 00:15:19 -04:00

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