"""Pydantic 请求/响应模型""" from typing import Optional, List from pydantic import BaseModel, Field # ── 大盘阶段 ── class MarketRegimeBase(BaseModel): name: str trade_type: str allow_direction: str remark: str = "" class MarketRegimeCreate(MarketRegimeBase): pass class MarketRegimeUpdate(BaseModel): name: Optional[str] = None trade_type: Optional[str] = None allow_direction: Optional[str] = None remark: Optional[str] = None class MarketRegimeOut(MarketRegimeBase): id: int class Config: from_attributes = True # ── 账户 ── class AccountBase(BaseModel): account_name: str total_capital: float = 100 trade_cycle: str risk_ratio: str enable: int = 1 remark: str = "" class AccountCreate(AccountBase): pass class AccountUpdate(BaseModel): account_name: Optional[str] = None total_capital: Optional[float] = None trade_cycle: Optional[str] = None risk_ratio: Optional[str] = None enable: Optional[int] = None remark: Optional[str] = None class AccountOut(AccountBase): id: int class Config: from_attributes = True # ── 策略 ── class StrategyBase(BaseModel): strategy_name: str fit_cycle: str fit_trend_strength: str trade_type: str strategy_rule: str remark: str = "" class StrategyCreate(StrategyBase): pass class StrategyUpdate(BaseModel): strategy_name: Optional[str] = None fit_cycle: Optional[str] = None fit_trend_strength: Optional[str] = None trade_type: Optional[str] = None strategy_rule: Optional[str] = None remark: Optional[str] = None class StrategyOut(StrategyBase): id: int class Config: from_attributes = True # ── 匹配绑定 ── class RegimeMatchBase(BaseModel): market_regime_id: int market_cycle: str trend_strength: str account_id: int strategy_id: int force_direction: str = "" class RegimeMatchCreate(RegimeMatchBase): pass class RegimeMatchUpdate(BaseModel): market_regime_id: Optional[int] = None market_cycle: Optional[str] = None trend_strength: Optional[str] = None account_id: Optional[int] = None strategy_id: Optional[int] = None force_direction: Optional[str] = None class RegimeMatchOut(RegimeMatchBase): id: int regime_name: Optional[str] = None account_name: Optional[str] = None strategy_name: Optional[str] = None class Config: from_attributes = True # ── 日常使用:匹配查询 ── class MatchRequest(BaseModel): market_cycle: str = Field(..., description="大盘周期:日线/4H/1H") market_regime_id: int = Field(..., description="大盘阶段 ID") trend_strength: str = Field(..., description="趋势强弱:强/弱/震荡") class MatchAccountOut(BaseModel): id: int account_name: str total_capital: float trade_cycle: str risk_ratio: str force_direction: str = "" class Config: from_attributes = True class MatchStrategyOut(BaseModel): id: int strategy_name: str fit_cycle: str strategy_rule: str force_direction: str = "" class Config: from_attributes = True class MatchResult(BaseModel): """匹配结果:系统仅做前置策略匹配,不做任何自动校验""" market_cycle: str regime_name: str trade_type: str allow_direction: str trend_strength: str status: str # ok / watch / disabled message: str = "" accounts: List[MatchAccountOut] = [] strategies: List[MatchStrategyOut] = []