You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.7 KiB

from fastapi import APIRouter, HTTPException, Query, Request
from schemas import ConnectRequest, ConnectResponse, ContractResponse, TickResponse, KlineResponse, DisconnectResponse
from tqapi_service import TqApiService
router = APIRouter()
# 存储当前连接的用户凭证
current_credentials = {}
# 获取当前TqApiService实例
async def get_current_service():
if not current_credentials:
raise HTTPException(status_code=401, detail="未连接到天勤服务器")
# 使用当前凭证获取或创建实例
return await TqApiService.get_instance(
current_credentials['username'],
current_credentials['password']
)
@router.post("/connect", response_model=ConnectResponse)
async def connect(request: ConnectRequest):
"""连接到天勤服务器"""
try:
# 存储凭证
current_credentials['username'] = request.username
current_credentials['password'] = request.password
# 获取或创建TqApiService实例
service = await TqApiService.get_instance(request.username, request.password)
return ConnectResponse(success=True, message="连接成功")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/contracts", response_model=ContractResponse)
async def get_contracts():
"""获取合约列表"""
try:
service = await get_current_service()
contracts = await 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:
service = await get_current_service()
contract = await 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:
service = await get_current_service()
klines = await 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:
print(f"[Router] 接收到获取 tick 数据请求symbol: {symbol}")
print(f"[Router] 正在获取当前服务实例...")
service = await get_current_service()
print(f"[Router] 获取服务实例成功")
print(f"[Router] 正在调用 service.get_tick({symbol})...")
tick = await service.get_tick(symbol)
print(f"[Router] 获取 tick 数据成功: {tick}")
return TickResponse(success=True, data=tick)
except Exception as e:
print(f"[Router] 获取 tick 数据失败: {e}")
raise HTTPException(status_code=500, detail=str(e))
@router.post("/disconnect", response_model=DisconnectResponse)
async def disconnect():
"""断开连接"""
try:
service = await get_current_service()
success = await service.disconnect()
if success:
# 清除凭证
current_credentials.clear()
return DisconnectResponse(success=True, message="断开成功")
else:
raise HTTPException(status_code=400, detail="断开失败")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))