73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
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())
|