rebuild(stage-12): deliver private review workflows

This commit is contained in:
leefer
2026-07-30 07:45:55 +08:00
parent 0a055867a4
commit b93fb3ec41
32 changed files with 2292 additions and 9 deletions
+54
View File
@@ -0,0 +1,54 @@
from __future__ import annotations
import json
from typing import Any
ACTIONS = {"buy": "买入", "sell": "卖出", "add": "加仓", "trim": "减仓", "watch": "观察"}
EMOTIONS = {
"calm": "平静",
"confident": "笃定",
"hesitant": "犹豫",
"anxious": "焦虑",
"impulsive": "冲动",
}
def note(row) -> dict[str, Any] | None:
return dict(row) if row is not None else None
def trades(rows) -> list[dict[str, Any]]:
result = []
for row in rows:
item = dict(row)
item["tags"] = json.loads(str(item.pop("tags_json")))
item["action_label"] = ACTIONS[str(item["action"])]
item["emotion_label"] = EMOTIONS[str(item["emotion"])]
result.append(item)
return result
def trade_summary(items: list[dict[str, Any]]) -> dict[str, Any]:
realized = [
item for item in items if item["pnl_amount"] is not None or item["pnl_pct"] is not None
]
wins = sum(
float(item["pnl_pct"] if item["pnl_pct"] is not None else item["pnl_amount"]) > 0
for item in realized
)
amounts = [float(item["pnl_amount"]) for item in items if item["pnl_amount"] is not None]
positions = [float(item["position_pct"]) for item in items if item["position_pct"] is not None]
return {
"total": len(items),
"realized": len(realized),
"win_rate": round(wins / len(realized) * 100, 1) if realized else None,
"pnl_amount": round(sum(amounts), 2) if amounts else None,
"average_position": round(sum(positions) / len(positions), 1) if positions else None,
}
def alert(row, today: str) -> dict[str, Any]:
item = dict(row)
item["is_read"] = bool(item["is_read"])
item["due"] = str(item["available_date"]) <= today
return item