Implements FastAPI backend with ML model support for energy trading, including price prediction models and RL-based battery trading policy. Features dashboard, trading, backtest, and settings API routes with WebSocket support for real-time updates.
62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
from typing import Dict, List, Optional
|
|
from datetime import datetime
|
|
from app.utils.logger import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class TradingPosition:
|
|
timestamp: datetime
|
|
position_type: str
|
|
region: Optional[str]
|
|
volume_mw: float
|
|
entry_price: float
|
|
current_price: float
|
|
pnl: float
|
|
|
|
|
|
class TradingService:
|
|
def __init__(self):
|
|
self._positions: List[Dict] = []
|
|
self._orders: List[Dict] = []
|
|
|
|
async def get_positions(self) -> List[Dict]:
|
|
return self._positions.copy()
|
|
|
|
async def get_orders(self, limit: int = 100) -> List[Dict]:
|
|
return self._orders[-limit:]
|
|
|
|
async def place_order(self, order: Dict) -> Dict:
|
|
order_id = f"order_{len(self._orders) + 1}"
|
|
order["order_id"] = order_id
|
|
order["timestamp"] = datetime.utcnow()
|
|
order["status"] = "filled"
|
|
|
|
self._orders.append(order)
|
|
|
|
logger.info(f"Order placed: {order_id}, type: {order.get('type')}, volume: {order.get('volume_mw')}")
|
|
|
|
return order
|
|
|
|
async def close_position(self, position_id: str) -> Dict:
|
|
for i, pos in enumerate(self._positions):
|
|
if pos.get("position_id") == position_id:
|
|
position = self._positions.pop(i)
|
|
position["closed_at"] = datetime.utcnow()
|
|
position["status"] = "closed"
|
|
logger.info(f"Position closed: {position_id}")
|
|
return position
|
|
|
|
raise ValueError(f"Position not found: {position_id}")
|
|
|
|
async def get_trading_summary(self) -> Dict:
|
|
total_pnl = sum(pos.get("pnl", 0) for pos in self._positions)
|
|
open_positions = len([p for p in self._positions if p.get("status") == "open"])
|
|
|
|
return {
|
|
"total_pnl": total_pnl,
|
|
"open_positions": open_positions,
|
|
"total_trades": len(self._orders),
|
|
"last_trade": self._orders[-1]["timestamp"] if self._orders else None,
|
|
}
|