缓存看股数据

This commit is contained in:
2026-08-16 21:24:41 +08:00
parent 65d2f54d1b
commit f192a08384
5 changed files with 45 additions and 758 deletions

View File

@@ -107,6 +107,8 @@ def _rows_to_bars(rows) -> list[Bar]:
_ADJUST_MODES = ("bfq", "qfq", "hfq")
# MA 全量集合(前端已改为本地计算 MA后端始终返回此集合以保证缓存一致
_FULL_MA_SET = (5, 10, 20, 30, 60, 120, 250)
def _adjust_bars(bars: list[Bar], factors, from_mode: str, to_mode: str) -> list[Bar]:
@@ -814,10 +816,11 @@ async def screener_preview(
symbol = plain_code(ts_code)
# --- Redis 读缓存历史窗口end 翻页)只增不改,最新窗口每日由全市场同步推进;
# 键含 ver:candles 版本号同步完成后自增旧缓存全部失效TTL 兜底cache.py---
# 键含 ver:candles 版本号同步完成后自增旧缓存全部失效TTL 兜底cache.py
# 注ma_periods 不参与缓存键 —— 前端已改为本地计算 MA后端始终返回全量 MA 集合
cache_key = cache.digest(
"preview", ts_code, timeframe, limit, adjust,
end_dt.strftime("%Y-%m-%d") if end_dt else None, ma_periods, zx_periods,
end_dt.strftime("%Y-%m-%d") if end_dt else None,
await cache.get_version("candles"),
)
cached = await cache.cache_get(f"pv:{cache_key}")
@@ -896,7 +899,8 @@ async def screener_preview(
kdj = ind.kdj(highs, lows, closes)
boll = ind.bollinger(closes)
indicators = {
"ma": {f"ma{p}": _series_to_jsonable(ind.ma(closes, p)) for p in ma_periods},
# MA 始终返回全量集合(前端本地计算 MA此处仅保留兼容缓存键不依赖 ma_periods
"ma": {f"ma{p}": _series_to_jsonable(ind.ma(closes, p)) for p in _FULL_MA_SET},
"macd": {
"dif": _series_to_jsonable(macd["macd"]),
"dea": _series_to_jsonable(macd["signal"]),

View File

@@ -1,10 +1,15 @@
"""应用配置pydantic-settings。可由 .env / 环境变量覆盖。"""
from pathlib import Path
from pydantic import model_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
# 确保 .env 文件总是相对于 config.py 所在目录加载,无论从哪个目录启动 uvicorn
_ENV_FILE = Path(__file__).resolve().parent.parent / ".env"
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
model_config = SettingsConfigDict(env_file=str(_ENV_FILE) if _ENV_FILE.exists() else ".env", extra="ignore")
app_name: str = "Stock Backtest"