You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
5.4 KiB
Python
199 lines
5.4 KiB
Python
"""SQLite schema and dataclasses for TGTC trading state."""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
CREATE_TABLES_SQL = """
|
|
CREATE TABLE IF NOT EXISTS tgtc_sessions (
|
|
session_id TEXT PRIMARY KEY,
|
|
session_name TEXT NOT NULL UNIQUE,
|
|
config_path TEXT NOT NULL,
|
|
initial_equity REAL NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'active'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tgtc_snapshots (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
session_id TEXT NOT NULL REFERENCES tgtc_sessions(session_id),
|
|
date TEXT NOT NULL,
|
|
captured_at TEXT NOT NULL,
|
|
symbol TEXT NOT NULL,
|
|
rank INTEGER NOT NULL,
|
|
price REAL,
|
|
pct_change REAL,
|
|
volume REAL,
|
|
market_cap REAL,
|
|
UNIQUE(session_id, captured_at, symbol)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tgtc_candidates (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
session_id TEXT NOT NULL REFERENCES tgtc_sessions(session_id),
|
|
date TEXT NOT NULL,
|
|
symbol TEXT NOT NULL,
|
|
score REAL,
|
|
rank_persistence REAL,
|
|
rank_velocity REAL,
|
|
price_structure REAL,
|
|
volume_quality REAL,
|
|
relative_strength REAL,
|
|
pct_change_at_10 REAL,
|
|
price_at_10 REAL,
|
|
vwap_at_10 REAL,
|
|
above_vwap INTEGER,
|
|
decided_at TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'pending',
|
|
UNIQUE(session_id, date, symbol)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tgtc_positions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
session_id TEXT NOT NULL REFERENCES tgtc_sessions(session_id),
|
|
date TEXT NOT NULL,
|
|
symbol TEXT NOT NULL,
|
|
entry_signal TEXT NOT NULL DEFAULT 'vwap_pullback_reclaim',
|
|
entry_price REAL NOT NULL,
|
|
stop_price REAL NOT NULL,
|
|
current_stop REAL NOT NULL,
|
|
shares INTEGER NOT NULL,
|
|
entered_at TEXT NOT NULL,
|
|
peak_price REAL NOT NULL DEFAULT 0.0,
|
|
partial_taken INTEGER NOT NULL DEFAULT 0,
|
|
be_stop_active INTEGER NOT NULL DEFAULT 0,
|
|
exit_price REAL,
|
|
exit_reason TEXT,
|
|
exited_at TEXT,
|
|
pnl REAL,
|
|
r_multiple REAL,
|
|
is_dry_run INTEGER NOT NULL DEFAULT 1,
|
|
status TEXT NOT NULL DEFAULT 'open',
|
|
UNIQUE(session_id, date, symbol)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tgtc_trades (
|
|
trade_id TEXT PRIMARY KEY,
|
|
session_id TEXT NOT NULL,
|
|
date TEXT NOT NULL,
|
|
symbol TEXT NOT NULL,
|
|
entry_signal TEXT NOT NULL DEFAULT 'vwap_pullback_reclaim',
|
|
entry_price REAL NOT NULL,
|
|
exit_price REAL NOT NULL,
|
|
entered_at TEXT NOT NULL,
|
|
exited_at TEXT NOT NULL,
|
|
shares INTEGER NOT NULL,
|
|
pnl REAL NOT NULL,
|
|
r_multiple REAL NOT NULL,
|
|
exit_reason TEXT NOT NULL,
|
|
is_dry_run INTEGER NOT NULL DEFAULT 1
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tgtc_daily_snapshots (
|
|
session_id TEXT NOT NULL,
|
|
date TEXT NOT NULL,
|
|
equity REAL NOT NULL,
|
|
daily_pnl REAL,
|
|
total_pnl REAL,
|
|
trades_taken INTEGER,
|
|
phase TEXT NOT NULL DEFAULT 'idle',
|
|
PRIMARY KEY (session_id, date)
|
|
);
|
|
"""
|
|
|
|
|
|
@dataclass
|
|
class TGTCSessionRow:
|
|
session_id: str
|
|
session_name: str
|
|
config_path: str
|
|
initial_equity: float
|
|
created_at: str
|
|
status: str = "active"
|
|
|
|
|
|
@dataclass
|
|
class TGTCSnapshotRow:
|
|
session_id: str
|
|
date: str
|
|
captured_at: str
|
|
symbol: str
|
|
rank: int
|
|
price: float | None = None
|
|
pct_change: float | None = None
|
|
volume: float | None = None
|
|
market_cap: float | None = None
|
|
id: int | None = None
|
|
|
|
|
|
@dataclass
|
|
class TGTCCandidateRow:
|
|
session_id: str
|
|
date: str
|
|
symbol: str
|
|
decided_at: str
|
|
score: float | None = None
|
|
rank_persistence: float | None = None
|
|
rank_velocity: float | None = None
|
|
price_structure: float | None = None
|
|
volume_quality: float | None = None
|
|
relative_strength: float | None = None
|
|
pct_change_at_10: float | None = None
|
|
price_at_10: float | None = None
|
|
vwap_at_10: float | None = None
|
|
above_vwap: bool = False
|
|
status: str = "pending"
|
|
id: int | None = None
|
|
|
|
|
|
@dataclass
|
|
class TGTCPositionRow:
|
|
session_id: str
|
|
date: str
|
|
symbol: str
|
|
entry_price: float
|
|
stop_price: float
|
|
current_stop: float
|
|
shares: int
|
|
entered_at: str
|
|
peak_price: float = 0.0
|
|
partial_taken: bool = False
|
|
be_stop_active: bool = False
|
|
entry_signal: str = "vwap_pullback_reclaim"
|
|
exit_price: float | None = None
|
|
exit_reason: str | None = None
|
|
exited_at: str | None = None
|
|
pnl: float | None = None
|
|
r_multiple: float | None = None
|
|
is_dry_run: bool = True
|
|
status: str = "open"
|
|
id: int | None = None
|
|
|
|
|
|
@dataclass
|
|
class TGTCTradeRow:
|
|
trade_id: str
|
|
session_id: str
|
|
date: str
|
|
symbol: str
|
|
entry_price: float
|
|
exit_price: float
|
|
entered_at: str
|
|
exited_at: str
|
|
shares: int
|
|
pnl: float
|
|
r_multiple: float
|
|
exit_reason: str
|
|
entry_signal: str = "vwap_pullback_reclaim"
|
|
is_dry_run: bool = True
|
|
|
|
|
|
@dataclass
|
|
class TGTCDailySnapshotRow:
|
|
session_id: str
|
|
date: str
|
|
equity: float
|
|
daily_pnl: float = 0.0
|
|
total_pnl: float = 0.0
|
|
trades_taken: int = 0
|
|
phase: str = "idle"
|