65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
import sqlite3
|
|
import time
|
|
from typing import Any, Dict, Optional
|
|
|
|
|
|
class Storage:
|
|
def __init__(self, path: str = "storage.sqlite"):
|
|
self.conn = sqlite3.connect(path)
|
|
self.conn.execute("PRAGMA journal_mode=WAL;")
|
|
self._init()
|
|
|
|
def _init(self) -> None:
|
|
self.conn.execute(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS decisions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
ts REAL NOT NULL,
|
|
symbol TEXT NOT NULL,
|
|
series_ticker TEXT NOT NULL,
|
|
market_ticker TEXT NOT NULL,
|
|
close_time TEXT NOT NULL,
|
|
strike REAL NOT NULL,
|
|
side TEXT NOT NULL,
|
|
market_prob REAL NOT NULL,
|
|
fair_prob REAL NOT NULL,
|
|
edge REAL NOT NULL,
|
|
spread REAL NOT NULL,
|
|
jump REAL NOT NULL,
|
|
reason TEXT NOT NULL
|
|
)
|
|
"""
|
|
)
|
|
self.conn.execute(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS orders (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
ts REAL NOT NULL,
|
|
market_ticker TEXT NOT NULL,
|
|
order_id TEXT,
|
|
mode TEXT NOT NULL,
|
|
status TEXT NOT NULL,
|
|
details TEXT
|
|
)
|
|
"""
|
|
)
|
|
self.conn.commit()
|
|
|
|
def log_decision(self, **row: Any) -> None:
|
|
cols = ",".join(row.keys())
|
|
qs = ",".join(["?"] * len(row))
|
|
self.conn.execute(f"INSERT INTO decisions ({cols}) VALUES ({qs})", list(row.values()))
|
|
self.conn.commit()
|
|
|
|
def log_order(self, market_ticker: str, order_id: Optional[str], mode: str, status: str, details: str = "") -> None:
|
|
self.conn.execute(
|
|
"INSERT INTO orders (ts, market_ticker, order_id, mode, status, details) VALUES (?, ?, ?, ?, ?, ?)",
|
|
(time.time(), market_ticker, order_id, mode, status, details),
|
|
)
|
|
self.conn.commit()
|
|
|
|
def close(self) -> None:
|
|
self.conn.close()
|