from datetime import datetime from typing import Optional from sqlalchemy import Float, Integer, String, DateTime, JSON from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base class BacktestResult(Base): __tablename__ = "backtest_results" id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) instrument: Mapped[str] = mapped_column(String(20)) granularity: Mapped[str] = mapped_column(String(10)) start_date: Mapped[datetime] = mapped_column(DateTime) end_date: Mapped[datetime] = mapped_column(DateTime) initial_balance: Mapped[float] = mapped_column(Float, default=10000.0) final_balance: Mapped[float] = mapped_column(Float) total_pnl: Mapped[float] = mapped_column(Float) total_trades: Mapped[int] = mapped_column(Integer) winning_trades: Mapped[int] = mapped_column(Integer) losing_trades: Mapped[int] = mapped_column(Integer) win_rate: Mapped[float] = mapped_column(Float) max_drawdown: Mapped[float] = mapped_column(Float) sharpe_ratio: Mapped[Optional[float]] = mapped_column(Float, nullable=True) expectancy: Mapped[float] = mapped_column(Float) # Courbe d'équité [{time, balance}] stockée en JSON equity_curve: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True) # Paramètres de la stratégie utilisés strategy_params: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow)