Add trading cockpit storage
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import sqlite3
|
||||
import time
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
||||
class TradeStore:
|
||||
def __init__(self, path: Path):
|
||||
self.path = path
|
||||
self.path.parent.mkdir(parents=True, exist_ok=True)
|
||||
self._init()
|
||||
|
||||
def _connect(self) -> sqlite3.Connection:
|
||||
connection = sqlite3.connect(self.path)
|
||||
connection.row_factory = sqlite3.Row
|
||||
return connection
|
||||
|
||||
def _init(self) -> None:
|
||||
with self._connect() as db:
|
||||
db.execute(
|
||||
"""
|
||||
create table if not exists runs (
|
||||
id integer primary key autoincrement,
|
||||
kind text not null,
|
||||
created_at integer not null,
|
||||
label text,
|
||||
payload text not null
|
||||
)
|
||||
"""
|
||||
)
|
||||
db.execute(
|
||||
"""
|
||||
create table if not exists paper_orders (
|
||||
id integer primary key autoincrement,
|
||||
created_at integer not null,
|
||||
symbol text not null,
|
||||
side text not null,
|
||||
status text not null,
|
||||
quantity real not null,
|
||||
entry real not null,
|
||||
stop real not null,
|
||||
target real not null,
|
||||
risk_amount real not null,
|
||||
payload text not null
|
||||
)
|
||||
"""
|
||||
)
|
||||
|
||||
def save_run(self, kind: str, payload: dict[str, Any], label: str | None = None) -> int:
|
||||
with self._connect() as db:
|
||||
cursor = db.execute(
|
||||
"insert into runs(kind, created_at, label, payload) values(?, ?, ?, ?)",
|
||||
(kind, int(time.time()), label, json.dumps(payload)),
|
||||
)
|
||||
return int(cursor.lastrowid)
|
||||
|
||||
def recent_runs(self, kind: str | None = None, limit: int = 25) -> list[dict[str, Any]]:
|
||||
query = "select id, kind, created_at, label, payload from runs"
|
||||
params: list[Any] = []
|
||||
if kind:
|
||||
query += " where kind = ?"
|
||||
params.append(kind)
|
||||
query += " order by id desc limit ?"
|
||||
params.append(limit)
|
||||
with self._connect() as db:
|
||||
rows = db.execute(query, params).fetchall()
|
||||
return [
|
||||
{
|
||||
"id": row["id"],
|
||||
"kind": row["kind"],
|
||||
"created_at": row["created_at"],
|
||||
"label": row["label"],
|
||||
"payload": json.loads(row["payload"]),
|
||||
}
|
||||
for row in rows
|
||||
]
|
||||
|
||||
def save_paper_order(self, order: dict[str, Any]) -> int:
|
||||
with self._connect() as db:
|
||||
cursor = db.execute(
|
||||
"""
|
||||
insert into paper_orders(
|
||||
created_at, symbol, side, status, quantity, entry, stop, target, risk_amount, payload
|
||||
) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
""",
|
||||
(
|
||||
int(time.time()),
|
||||
order["symbol"],
|
||||
order["side"],
|
||||
order["status"],
|
||||
order["quantity"],
|
||||
order["entry"],
|
||||
order["stop"],
|
||||
order["target"],
|
||||
order["risk_amount"],
|
||||
json.dumps(order),
|
||||
),
|
||||
)
|
||||
return int(cursor.lastrowid)
|
||||
|
||||
def recent_paper_orders(self, limit: int = 25) -> list[dict[str, Any]]:
|
||||
with self._connect() as db:
|
||||
rows = db.execute(
|
||||
"select id, created_at, payload from paper_orders order by id desc limit ?",
|
||||
(limit,),
|
||||
).fetchall()
|
||||
result = []
|
||||
for row in rows:
|
||||
payload = json.loads(row["payload"])
|
||||
payload["id"] = row["id"]
|
||||
payload["created_at"] = row["created_at"]
|
||||
result.append(payload)
|
||||
return result
|
||||
Reference in New Issue
Block a user