69 lines
1.9 KiB
Python
69 lines
1.9 KiB
Python
"""K 线数据访问(从库读)。
|
|
|
|
写入由 DataProvider 适配器负责(Tushare 主 → AKShare 兜底)。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from ..models import Candle
|
|
|
|
|
|
async def get_candles(
|
|
session: AsyncSession,
|
|
symbol: str,
|
|
timeframe: str = "1d",
|
|
start: datetime | None = None,
|
|
end: datetime | None = None,
|
|
limit: int = 5000,
|
|
) -> list[Candle]:
|
|
stmt = select(Candle).where(
|
|
Candle.symbol == symbol,
|
|
Candle.timeframe == timeframe,
|
|
)
|
|
if start is not None:
|
|
stmt = stmt.where(Candle.ts >= start)
|
|
if end is not None:
|
|
stmt = stmt.where(Candle.ts <= end)
|
|
stmt = stmt.order_by(Candle.ts.asc()).limit(limit)
|
|
result = await session.execute(stmt)
|
|
return list(result.scalars().all())
|
|
|
|
|
|
async def get_recent_candles(
|
|
session: AsyncSession,
|
|
symbol: str,
|
|
timeframe: str = "1d",
|
|
limit: int = 5000,
|
|
) -> list[Candle]:
|
|
"""取最近 limit 根 K 线(含最新交易日),按时间升序返回。"""
|
|
stmt = (
|
|
select(Candle)
|
|
.where(Candle.symbol == symbol, Candle.timeframe == timeframe)
|
|
.order_by(Candle.ts.desc())
|
|
.limit(limit)
|
|
)
|
|
result = await session.execute(stmt)
|
|
return list(reversed(result.scalars().all()))
|
|
|
|
|
|
async def get_candles_before(
|
|
session: AsyncSession,
|
|
symbol: str,
|
|
timeframe: str,
|
|
before: datetime,
|
|
limit: int = 5000,
|
|
) -> list[Candle]:
|
|
"""取 before 之前(不含)的最近 limit 根 K 线,按时间升序返回(历史向前翻页用)。"""
|
|
stmt = (
|
|
select(Candle)
|
|
.where(Candle.symbol == symbol, Candle.timeframe == timeframe, Candle.ts < before)
|
|
.order_by(Candle.ts.desc())
|
|
.limit(limit)
|
|
)
|
|
result = await session.execute(stmt)
|
|
return list(reversed(result.scalars().all()))
|