feat: link decision signals with alerts and portfolio risk (#1715)

Co-authored-by: mumu <42829555+ZhuLinsen@users.noreply.github.com>
This commit is contained in:
Alfred
2026-06-19 09:43:40 +08:00
committed by GitHub
parent 626b63c144
commit a7876fe11c
28 changed files with 2047 additions and 5 deletions

View File

@@ -93,6 +93,8 @@ from api.v1.schemas.portfolio import (
PortfolioImportBrokerItem,
PortfolioImportBrokerListResponse,
PortfolioFxRefreshResponse,
PortfolioDecisionSignalRiskBlock,
PortfolioDecisionSignalRiskItem,
PortfolioRiskResponse,
)
from api.v1.schemas.alerts import (
@@ -204,6 +206,8 @@ __all__ = [
"PortfolioImportBrokerItem",
"PortfolioImportBrokerListResponse",
"PortfolioFxRefreshResponse",
"PortfolioDecisionSignalRiskBlock",
"PortfolioDecisionSignalRiskItem",
"PortfolioRiskResponse",
# alerts
"AlertDeleteResponse",

View File

@@ -117,6 +117,7 @@ class AlertTriggerItem(BaseModel):
"evaluator_snapshot / legacy_text / null"
),
)
decision_signal_summary: Optional[Dict[str, Any]] = None
class AlertTriggerListResponse(BaseModel):

View File

@@ -263,6 +263,20 @@ class PortfolioFxRefreshResponse(BaseModel):
error_count: int
class PortfolioDecisionSignalRiskItem(BaseModel):
account_id: Optional[int] = None
symbol: str
market: str
signal: Dict[str, Any] = Field(default_factory=dict)
class PortfolioDecisionSignalRiskBlock(BaseModel):
available: bool = True
total: int = 0
actions: Dict[str, int] = Field(default_factory=dict)
items: List[PortfolioDecisionSignalRiskItem] = Field(default_factory=list)
class PortfolioRiskResponse(BaseModel):
as_of: str
account_id: Optional[int] = None
@@ -273,3 +287,4 @@ class PortfolioRiskResponse(BaseModel):
sector_concentration: Dict[str, Any] = Field(default_factory=dict)
drawdown: Dict[str, Any] = Field(default_factory=dict)
stop_loss: Dict[str, Any] = Field(default_factory=dict)
decision_signal_risk: PortfolioDecisionSignalRiskBlock = Field(default_factory=PortfolioDecisionSignalRiskBlock)