feat(strategy_pythagoras): port DB schema from strategy_crypto
This commit is contained in:
@@ -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()
|
||||||
Reference in New Issue
Block a user