diff --git a/src/strategy_pythagoras/strategy_pythagoras/backend/schema.py b/src/strategy_pythagoras/strategy_pythagoras/backend/schema.py new file mode 100644 index 0000000..e68c864 --- /dev/null +++ b/src/strategy_pythagoras/strategy_pythagoras/backend/schema.py @@ -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()