""" 成交监控路由 处理成交记录查询 """ from fastapi import APIRouter, Depends, HTTPException, status from typing import List, Optional from datetime import datetime import logging from ..deps import get_current_user, get_vn_service logger = logging.getLogger(__name__) router = APIRouter() @router.get("/", response_model=List[dict]) async def get_all_trades( current_user: dict = Depends(get_current_user), vn_service=Depends(get_vn_service) ): """ 获取所有成交记录 返回所有成交记录,包括成交号、委托号、合约代码、方向、开平、价格、数量、时间等信息 """ trades = await vn_service.get_trades() return [ { "tradeid": t.get("trade_id", ""), "orderid": t.get("order_id", ""), "symbol": t.get("symbol", ""), "exchange": t.get("exchange", ""), "direction": t.get("direction", ""), "offset": t.get("offset", ""), "price": t.get("price", 0.0), "volume": t.get("volume", 0), "datetime": _format_datetime(t.get("time")), "gateway_name": t.get("gateway_name", ""), } for t in trades ] @router.get("/latest", response_model=List[dict]) async def get_latest_trades( limit: int = 50, current_user: dict = Depends(get_current_user), vn_service=Depends(get_vn_service) ): """ 获取最新的成交记录 - **limit**: 返回记录数量,默认 50 条 """ trades = await vn_service.get_trades() # 按时间降序排序,取最新的 limit 条 sorted_trades = sorted( trades, key=lambda x: x.get("time", datetime.min), reverse=True )[:limit] return [ { "tradeid": t.get("trade_id", ""), "orderid": t.get("order_id", ""), "symbol": t.get("symbol", ""), "exchange": t.get("exchange", ""), "direction": t.get("direction", ""), "offset": t.get("offset", ""), "price": t.get("price", 0.0), "volume": t.get("volume", 0), "datetime": _format_datetime(t.get("time")), "gateway_name": t.get("gateway_name", ""), } for t in sorted_trades ] @router.get("/order/{vt_orderid}", response_model=List[dict]) async def get_trades_by_order( vt_orderid: str, current_user: dict = Depends(get_current_user), vn_service=Depends(get_vn_service) ): """ 获取指定委托的所有成交记录 - **vt_orderid**: 委托号(格式:gateway_name.orderid) """ all_trades = await vn_service.get_trades() filtered_trades = [ t for t in all_trades if t.get("order_id", "") == vt_orderid ] return [ { "tradeid": t.get("trade_id", ""), "orderid": t.get("order_id", ""), "symbol": t.get("symbol", ""), "exchange": t.get("exchange", ""), "direction": t.get("direction", ""), "offset": t.get("offset", ""), "price": t.get("price", 0.0), "volume": t.get("volume", 0), "datetime": _format_datetime(t.get("time")), "gateway_name": t.get("gateway_name", ""), } for t in filtered_trades ] @router.get("/symbol/{symbol}", response_model=List[dict]) async def get_trades_by_symbol( symbol: str, current_user: dict = Depends(get_current_user), vn_service=Depends(get_vn_service) ): """ 获取指定合约的所有成交记录 - **symbol**: 合约代码 """ all_trades = await vn_service.get_trades() filtered_trades = [ t for t in all_trades if t.get("symbol", "") == symbol ] return [ { "tradeid": t.get("trade_id", ""), "orderid": t.get("order_id", ""), "symbol": t.get("symbol", ""), "exchange": t.get("exchange", ""), "direction": t.get("direction", ""), "offset": t.get("offset", ""), "price": t.get("price", 0.0), "volume": t.get("volume", 0), "datetime": _format_datetime(t.get("time")), "gateway_name": t.get("gateway_name", ""), } for t in filtered_trades ] def _format_datetime(dt: Optional[datetime]) -> str: """格式化 datetime 对象为字符串""" if dt is None: return "" if isinstance(dt, datetime): return dt.strftime("%Y-%m-%d %H:%M:%S") return str(dt) __all__ = ["router"]