172 lines
3.7 KiB
Python
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] = []
|