"""全局配置:从环境变量 / .env 读取。 关键点: - OWN_DB_DSN 自有 Postgres(看板只读它,ETL 写它)—— 必填 - LEGACY_MYSQL_DSN 现有 MySQL-A(18.199),读 zs_day_data —— 选填,留空则跳过指数同步 - LEGACY_PG_DSN 现有 PG(16.150),读 gp_market_sentiment —— 选填,留空则跳过情绪同步 - OHLC_PROVIDER 指数 OHLC 数据源(你后续提供)。默认 "none" → 退化为收盘线 """ from __future__ import annotations from functools import lru_cache from typing import List, Optional from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore" ) # ---- 数据库 ---- own_db_dsn: str = Field( default="postgresql+psycopg://asevent:asevent@db:5432/asevent", alias="OWN_DB_DSN", ) legacy_mysql_dsn: Optional[str] = Field(default=None, alias="LEGACY_MYSQL_DSN") legacy_pg_dsn: Optional[str] = Field(default=None, alias="LEGACY_PG_DSN") # ---- 指数范围(dot 式,与 zs_day_data.symbol 一致)---- index_codes: str = Field(default="000001.SH,399006.SZ,000688.SH", alias="INDEX_CODES") # ---- OHLC 源(预留插槽)---- # "none" = 无源,open=high=low=close,ohlc_source='close_only'(退化为收盘线) # 你接入后在 sources.py:build_ohlc_provider 里注册自己的实现,并把此值改成对应名字 ohlc_provider: str = Field(default="none", alias="OHLC_PROVIDER") # ---- 顶底信号参数(初值,实机回测后再调)---- vol_window: int = Field(default=250, alias="VOL_WINDOW") # 量能/价格分位滚动窗口 w_vol: float = Field(default=0.35, alias="W_VOL") w_price: float = Field(default=0.25, alias="W_PRICE") w_sentiment: float = Field(default=0.25, alias="W_SENTIMENT") w_etf: float = Field(default=0.15, alias="W_ETF") hot_threshold: float = Field(default=80.0, alias="HOT_THRESHOLD") # 过热/顶部 cold_threshold: float = Field(default=20.0, alias="COLD_THRESHOLD") # 冰点/底部 # ---- 其它 ---- cors_origins: str = Field(default="*", alias="CORS_ORIGINS") @property def index_code_list(self) -> List[str]: return [c.strip() for c in self.index_codes.split(",") if c.strip()] @property def cors_origin_list(self) -> List[str]: return [c.strip() for c in self.cors_origins.split(",") if c.strip()] @lru_cache def get_settings() -> Settings: return Settings() # 指数中文名映射(展示用) INDEX_NAMES = { "000001.SH": "上证综指", "399006.SZ": "创业板指", "000688.SH": "科创50", "399001.SZ": "深证成指", }