""" Additional simulated trading endpoints for trades and sessions """ def get_simulated_trades_endpoint(limit: int, current_user: str): """Get recent simulated trades for the current user""" from models import Trade from database import engine from sqlmodel import Session, select with Session(engine) as session: statement = ( select(Trade) .where(Trade.user_email == current_user) .order_by(Trade.executed_at.desc()) .limit(limit) ) trades = session.exec(statement).all() trades_list = [ { "symbol": trade.symbol, "side": trade.side, "price": trade.price, "quantity": trade.quantity, "total": trade.total, "time": trade.executed_at.isoformat() } for trade in trades ] return {"trades": trades_list} def get_simulated_sessions_endpoint(current_user: str): """Get all simulated trading sessions for the current user""" from models import TradingSession from database import engine from sqlmodel import Session, select from datetime import datetime from simulated_trading import simulated_sessions with Session(engine) as session: statement = ( select(TradingSession) .where(TradingSession.user_email == current_user) .order_by(TradingSession.start_time.desc()) ) sessions = session.exec(statement).all() sessions_list = [] for s in sessions: # Check if session is actually running in memory is_actually_running = s.session_id in simulated_sessions # If DB says running but not in memory, it expired/crashed if s.is_running and not is_actually_running: # Update DB to reflect reality s.is_running = False if s.end_time is None: s.end_time = datetime.now() session.add(s) # Calculate elapsed and remaining time now = datetime.now() elapsed = (now - s.start_time).total_seconds() / 60 # minutes # Calculate total duration based on duration_unit if s.duration_unit == "days": total_duration = s.duration_minutes * 24 * 60 else: total_duration = s.duration_minutes remaining = max(0, total_duration - elapsed) sessions_list.append({ "session_id": s.session_id, "strategy": s.strategy, "symbol": s.symbol, "trade_amount": s.trade_amount, "is_running": is_actually_running, # Use real status from memory "position": "NONE", # Default position "trades_count": s.trades_count, "pnl": s.total_pnl, "elapsed_minutes": elapsed, "remaining_minutes": remaining }) session.commit() # Commit any DB updates return {"sessions": sessions_list}