Files
2026-05-28 21:43:23 +08:00

172 lines
3.7 KiB
Python

"""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] = []