feat(strategy_pythagoras): port DB schema from strategy_crypto

This commit is contained in:
Adriano Dal Pastro
2026-05-19 13:53:08 +00:00
parent 7f2db19a7c
commit 074ebe0379
@@ -0,0 +1,87 @@
"""Schema SQLite per le tabelle paper-trading della strategia pythagoras.
Owned dal member strategy_pythagoras: il DDL e' standalone rispetto al core,
e scrive su un database dedicato (state/strategy_pythagoras_paper.db, env
STRATEGY_PYTHAGORAS_PAPER_DB_PATH) separato dal runs.db del core GA. Pattern
replicabile per future strategie.
"""
from __future__ import annotations
import sqlite3
from pathlib import Path
PAPER_SCHEMA_SQL = """
CREATE TABLE IF NOT EXISTS paper_trading_runs (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
started_at TEXT NOT NULL,
stopped_at TEXT,
status TEXT NOT NULL DEFAULT 'running',
initial_capital REAL NOT NULL,
config_json TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS paper_trading_positions (
paper_run_id TEXT NOT NULL,
symbol TEXT NOT NULL,
side TEXT NOT NULL,
qty REAL NOT NULL,
entry_price REAL NOT NULL,
entry_ts TEXT NOT NULL,
PRIMARY KEY (paper_run_id, symbol),
FOREIGN KEY (paper_run_id) REFERENCES paper_trading_runs(id)
);
CREATE TABLE IF NOT EXISTS paper_trading_trades (
id INTEGER PRIMARY KEY AUTOINCREMENT,
paper_run_id TEXT NOT NULL,
symbol TEXT NOT NULL,
side TEXT NOT NULL,
qty REAL NOT NULL,
entry_price REAL NOT NULL,
exit_price REAL NOT NULL,
entry_ts TEXT NOT NULL,
exit_ts TEXT NOT NULL,
pnl REAL NOT NULL,
fees REAL NOT NULL,
FOREIGN KEY (paper_run_id) REFERENCES paper_trading_runs(id)
);
CREATE TABLE IF NOT EXISTS paper_trading_equity (
id INTEGER PRIMARY KEY AUTOINCREMENT,
paper_run_id TEXT NOT NULL,
ts TEXT NOT NULL,
equity REAL NOT NULL,
cash REAL NOT NULL,
positions_value REAL NOT NULL,
FOREIGN KEY (paper_run_id) REFERENCES paper_trading_runs(id)
);
CREATE TABLE IF NOT EXISTS paper_trading_ticks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
paper_run_id TEXT NOT NULL,
symbol TEXT NOT NULL,
ts TEXT NOT NULL,
bar_ts TEXT NOT NULL,
close_price REAL NOT NULL,
signal TEXT NOT NULL,
action_taken TEXT NOT NULL,
FOREIGN KEY (paper_run_id) REFERENCES paper_trading_runs(id)
);
CREATE INDEX IF NOT EXISTS idx_paper_trades_run ON paper_trading_trades(paper_run_id, exit_ts);
CREATE INDEX IF NOT EXISTS idx_paper_equity_run ON paper_trading_equity(paper_run_id, ts);
CREATE INDEX IF NOT EXISTS idx_paper_ticks_run ON paper_trading_ticks(paper_run_id, ts);
"""
def init_schema(db_path: Path | str) -> None:
"""Crea (se mancanti) le tabelle paper_trading_* sul db indicato."""
Path(db_path).parent.mkdir(parents=True, exist_ok=True)
conn = sqlite3.connect(str(db_path))
try:
conn.executescript(PAPER_SCHEMA_SQL)
conn.commit()
finally:
conn.close()