from fastapi import APIRouter, HTTPException, Query from schemas import ConnectRequest, ConnectResponse, ContractResponse, TickResponse, KlineResponse, DisconnectResponse from tqapi_service import TqApiService router = APIRouter() tq_service = TqApiService() @router.post("/connect", response_model=ConnectResponse) async def connect(request: ConnectRequest): """连接到天勤服务器""" try: success = await tq_service.connect(request.username, request.password) if success: return ConnectResponse(success=True, message="连接成功") else: raise HTTPException(status_code=400, detail="连接失败") except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/contracts", response_model=ContractResponse) async def get_contracts(): """获取合约列表""" try: contracts = await tq_service.get_contracts() return ContractResponse(success=True, data=contracts) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/contract/{symbol}", response_model=ContractResponse) async def get_contract(symbol: str): """获取合约详情""" try: contract = await tq_service.get_contract(symbol) return ContractResponse(success=True, data=contract) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/klines/{symbol}", response_model=KlineResponse) async def get_klines( symbol: str, period: str = Query(..., description="周期,如 1M, 5M, 1H, 1D"), count: int = Query(30, description="数据数量") ): """获取 K 线数据""" try: klines = await tq_service.get_klines(symbol, period, count) return KlineResponse(success=True, data=klines) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.get("/tick/{symbol}", response_model=TickResponse) async def get_tick(symbol: str): """获取 tick 数据""" try: tick = await tq_service.get_tick(symbol) return TickResponse(success=True, data=tick) except Exception as e: raise HTTPException(status_code=500, detail=str(e)) @router.post("/disconnect", response_model=DisconnectResponse) async def disconnect(): """断开连接""" try: success = await tq_service.disconnect() if success: return DisconnectResponse(success=True, message="断开成功") else: raise HTTPException(status_code=400, detail="断开失败") except Exception as e: raise HTTPException(status_code=500, detail=str(e))