- FastAPI app with async SQLAlchemy + Alembic migrations - API: positions CRUD, PnL summary, trade history, webhook endpoint - Dark-themed SPA frontend (vanilla HTML/JS) - K8s: deployment, service, configmap, TsProxy for Tailscale access - Backed by hermes-pgdb / trading_data database - Wired into Flux staging pipeline
21 lines
941 B
Python
21 lines
941 B
Python
from sqlalchemy import Column, String, Numeric, Enum, DateTime, JSON, func
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
import uuid
|
|
|
|
from database import metadata
|
|
|
|
positions = Table(
|
|
"positions",
|
|
metadata,
|
|
Column("id", UUID(as_uuid=True), primary_key=True, default=uuid.uuid4),
|
|
Column("symbol", String(32), nullable=False, index=True),
|
|
Column("direction", Enum("long", "short", name="position_direction"), nullable=False),
|
|
Column("entry_price", Numeric(precision=16, scale=8), nullable=False),
|
|
Column("exit_price", Numeric(precision=16, scale=8)),
|
|
Column("quantity", Numeric(precision=16, scale=8), nullable=False),
|
|
Column("exchange", String(32), nullable=False, index=True),
|
|
Column("opened_at", DateTime(timezone=True), server_default=func.now(), nullable=False),
|
|
Column("closed_at", DateTime(timezone=True)),
|
|
Column("pnl", Numeric(precision=16, scale=2)),
|
|
Column("metadata", JSON),
|
|
)
|