a69557f5d8
New paper_trades table (migration 007) + service/router. "Mark as taken" on each setup card (shares prefilled from position sizing, entry from current price, both editable) records a simulated trade. Overview gains an Open Trades table that marks each position to the latest close — P&L in $, %, and R-multiples — with a total unrealized P&L footer and a Sell button to close at the current price. Closed trades are retained for future realized-P&L reporting. Deploy: alembic upgrade (new paper_trades table). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
862 B
Python
36 lines
862 B
Python
"""Schemas for paper trades."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class PaperTradeCreate(BaseModel):
|
|
symbol: str = Field(..., min_length=1, max_length=10)
|
|
direction: str = Field(..., pattern=r"^(long|short)$")
|
|
entry_price: float = Field(..., gt=0)
|
|
shares: float = Field(..., gt=0)
|
|
stop_loss: float = Field(..., gt=0)
|
|
target: float = Field(..., gt=0)
|
|
|
|
|
|
class PaperTradeClose(BaseModel):
|
|
close_price: float | None = Field(default=None, gt=0)
|
|
|
|
|
|
class PaperTradeResponse(BaseModel):
|
|
id: int
|
|
symbol: str
|
|
direction: str
|
|
entry_price: float
|
|
shares: float
|
|
stop_loss: float
|
|
target: float
|
|
status: str
|
|
opened_at: datetime
|
|
close_price: float | None = None
|
|
closed_at: datetime | None = None
|
|
current_price: float | None = None
|