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

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.

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