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.

113 lines
3.6 KiB

"""
AmazingData 数据服务平台 - 历史数据 API
"""
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import Optional, List
from backend.models.database import get_db
from backend.models.schemas import (
BaseResponse, SingleKlineRequest, BatchStockRequest,
BatchFutureRequest, KlineDataResponse
)
from backend.services.data_service import data_service
from backend.auth.dependencies import get_current_user
from backend.models.tables import User
router = APIRouter()
@router.post("/single", response_model=BaseResponse)
async def get_single_kline(
request: SingleKlineRequest,
current_user: Optional[User] = Depends(get_current_user)
):
"""获取单只股票/期货K线数据"""
result = data_service.get_single_kline(
code=request.code,
trading_day=request.trading_day,
period=request.period.value,
save_path=request.save_path
)
if "error" in result:
return BaseResponse(code=500, message=result["error"], data=result)
return BaseResponse(data=result)
@router.post("/batch-stocks", response_model=BaseResponse)
async def batch_get_stock_kline(
request: BatchStockRequest,
current_user: Optional[User] = Depends(get_current_user)
):
"""批量获取股票K线数据"""
result = data_service.batch_get_stock_kline(
codes=request.codes,
trading_days=request.trading_days,
save_path=request.save_path,
batch_size=request.batch_size
)
if "error" in result:
return BaseResponse(code=500, message=result["error"], data=result)
return BaseResponse(data={"files": result, "count": len(result)})
@router.post("/batch-futures", response_model=BaseResponse)
async def batch_get_future_kline(
request: BatchFutureRequest,
current_user: Optional[User] = Depends(get_current_user)
):
"""批量获取期货K线数据"""
result = data_service.batch_get_future_kline(
underlying_codes=request.underlying_codes,
use_main_contract=request.use_main_contract,
trading_days=request.trading_days,
save_path=request.save_path
)
if "error" in result:
return BaseResponse(code=500, message=result["error"], data=result)
return BaseResponse(data={"files": result, "count": len(result)})
@router.get("/stock-codes", response_model=BaseResponse)
async def get_stock_codes(current_user: Optional[User] = Depends(get_current_user)):
"""获取股票代码列表"""
codes = data_service.get_stock_codes()
return BaseResponse(data={"codes": codes, "count": len(codes)})
@router.get("/future-codes", response_model=BaseResponse)
async def get_future_codes(current_user: Optional[User] = Depends(get_current_user)):
"""获取期货代码列表"""
codes = data_service.get_future_codes()
return BaseResponse(data={"codes": codes, "count": len(codes)})
@router.get("/trading-days", response_model=BaseResponse)
async def get_trading_days(
year: Optional[int] = None,
month: Optional[int] = None,
current_user: Optional[User] = Depends(get_current_user)
):
"""获取交易日列表(简化实现)"""
from datetime import date, timedelta
today = date.today()
if year:
target_date = date(year, month or 1, 1)
else:
target_date = today
# 简单返回最近30天实际应查询交易日历
trading_days = []
for i in range(30):
d = target_date - timedelta(days=i)
if d.weekday() < 5: # 排除周末
trading_days.append(d.strftime('%Y%m%d'))
return BaseResponse(data={"trading_days": trading_days})