Files
Chris eea4469095 Initial release v1.1.0
- Complete MVP for tracking Fidelity brokerage account performance
- Transaction import from CSV with deduplication
- Automatic FIFO position tracking with options support
- Real-time P&L calculations with market data caching
- Dashboard with timeframe filtering (30/90/180 days, 1 year, YTD, all time)
- Docker-based deployment with PostgreSQL backend
- React/TypeScript frontend with TailwindCSS
- FastAPI backend with SQLAlchemy ORM

Features:
- Multi-account support
- Import via CSV upload or filesystem
- Open and closed position tracking
- Balance history charting
- Performance analytics and metrics
- Top trades analysis
- Responsive UI design

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-22 14:27:43 -05:00

46 lines
1.6 KiB
Python

"""Pydantic schemas for position-related API operations."""
from pydantic import BaseModel, Field
from datetime import date, datetime
from typing import Optional
from decimal import Decimal
from app.models.position import PositionType, PositionStatus
class PositionBase(BaseModel):
"""Base schema for position data."""
symbol: str
option_symbol: Optional[str] = None
position_type: PositionType
status: PositionStatus
open_date: date
close_date: Optional[date] = None
total_quantity: Decimal
avg_entry_price: Optional[Decimal] = None
avg_exit_price: Optional[Decimal] = None
realized_pnl: Optional[Decimal] = None
unrealized_pnl: Optional[Decimal] = None
class PositionResponse(PositionBase):
"""Schema for position API responses."""
id: int
account_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class PositionStats(BaseModel):
"""Schema for aggregate position statistics."""
total_positions: int = Field(..., description="Total number of positions")
open_positions: int = Field(..., description="Number of open positions")
closed_positions: int = Field(..., description="Number of closed positions")
total_realized_pnl: Decimal = Field(..., description="Total realized P&L")
total_unrealized_pnl: Decimal = Field(..., description="Total unrealized P&L")
win_rate: float = Field(..., description="Percentage of profitable trades")
avg_win: Decimal = Field(..., description="Average profit on winning trades")
avg_loss: Decimal = Field(..., description="Average loss on losing trades")