from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Enum from sqlalchemy.orm import relationship from sqlalchemy.sql import func import enum from app.db.database import Base class TradeAction(str, enum.Enum): BUY = "BUY" SELL = "SELL" class Simulation(Base): __tablename__ = "simulations" id = Column(Integer, primary_key=True, index=True) user_id = Column(String, nullable=True) # For future multi-user support symbol = Column(String, default="XAU/USD") initial_capital = Column(Float, default=100000.0) current_capital = Column(Float, default=100000.0) total_pnl = Column(Float, default=0.0) total_pnl_percent = Column(Float, default=0.0) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) trades = relationship("Trade", back_populates="simulation", cascade="all, delete-orphan") positions = relationship("Position", back_populates="simulation", cascade="all, delete-orphan") class Trade(Base): __tablename__ = "trades" id = Column(Integer, primary_key=True, index=True) simulation_id = Column(Integer, ForeignKey("simulations.id")) action = Column(Enum(TradeAction)) quantity = Column(Float) price = Column(Float) total = Column(Float) pnl = Column(Float, nullable=True) timestamp = Column(DateTime(timezone=True), server_default=func.now()) simulation = relationship("Simulation", back_populates="trades") class Position(Base): __tablename__ = "positions" id = Column(Integer, primary_key=True, index=True) simulation_id = Column(Integer, ForeignKey("simulations.id")) symbol = Column(String, default="XAU/USD") quantity = Column(Float) avg_price = Column(Float) current_price = Column(Float) unrealized_pnl = Column(Float) unrealized_pnl_percent = Column(Float) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) simulation = relationship("Simulation", back_populates="positions") class AIAnalysisLog(Base): __tablename__ = "ai_analysis_logs" id = Column(Integer, primary_key=True, index=True) simulation_id = Column(Integer, nullable=True) recommendation = Column(String) confidence = Column(Float) reasoning = Column(String) risk_level = Column(String) support_levels = Column(String) # JSON string resistance_levels = Column(String) # JSON string created_at = Column(DateTime(timezone=True), server_default=func.now())