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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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))