From 870ee7e3b9bf57ba64880e035c849a6d9dc09e33 Mon Sep 17 00:00:00 2001 From: xxm Date: Sun, 2 Aug 2026 23:32:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BB=84=E5=90=88Tab=E7=AA=81=E5=87=BA?= =?UTF-8?q?=E6=88=90=E5=91=98=E7=9B=88=E5=88=A9=E7=8E=87=20+=20=E6=89=8B?= =?UTF-8?q?=E5=B7=A5=E5=8F=AF=E8=A1=8C=E6=80=A7=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 前端: 成员卡片盈利率/年化/10年收益提为大字醒目显示(原10px小字用户看不到) - 前端: v_mr卡片加实盘链路说明(22k信号→组合执行628→每日扫描仅3候选→人工确认) - 前端: 标注毛利vs扣费口径(单笔均收益=毛利, 组合年化/收益=已扣0.2%费用) - 后端: members补充组合模拟实际执行笔数(5槽/36槽), 用于年均笔数展示 --- evolution/evolution_api.py | 4 ++++ static/index.html | 26 +++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/evolution/evolution_api.py b/evolution/evolution_api.py index 6238d802..ac754e51 100644 --- a/evolution/evolution_api.py +++ b/evolution/evolution_api.py @@ -119,6 +119,7 @@ def get_combo_dashboard(): res = json.loads(r[0]) s = res.get("summary", {}) pf = s.get("portfolio_full", {}) + p5 = s.get("portfolio", {}) members[v] = { "role": "趋势市主战" if v == "v_next4" else "震荡/下跌市接管", "trades": s.get("total_trades"), @@ -129,6 +130,9 @@ def get_combo_dashboard(): "return_pct": pf.get("total_return_pct"), "max_dd_pct": pf.get("portfolio_max_dd_pct"), "universality": s.get("universality", {}), + # 组合模拟实际执行笔数(扣费后) + 年均(手工可行性参考) + "positions_taken_5slot": p5.get("positions_taken"), + "positions_taken_full": pf.get("positions_taken"), } conn.close() diff --git a/static/index.html b/static/index.html index 142f314e..b8a1ddaa 100644 --- a/static/index.html +++ b/static/index.html @@ -2084,20 +2084,28 @@ async function renderResearchCombo() { // ── 2. 组合成员策略指标 ── const members = d.members || {}; if (Object.keys(members).length) { - h += '
成员策略(10年回测)
' + + h += '
成员策略(10年回测,组合收益已扣费)
' + '
'; for (const [v, m] of Object.entries(members)) { const u = m.universality || {}; - h += '
' + - '
' + v + '' + + const yearly5 = m.positions_taken_5slot && m.positions_taken_5slot > 0 ? Math.round(m.positions_taken_5slot / 10) : '—'; + h += '
' + + '
' + v + '' + '' + (m.role || '') + '
' + - '
' + - '
年化
' + (m.cagr_pct != null ? m.cagr_pct + '%' : '—') + '
' + - '
胜率
' + (m.win_rate != null ? m.win_rate + '%' : '—') + '
' + - '
笔数
' + (m.trades != null ? (m.trades > 999 ? Math.round(m.trades/1000) + 'k' : m.trades) : '—') + '
' + - '
覆盖
' + (u.months || '—') + '月
' + + // 盈利率大字突出(用户关注的核心指标) + '
' + + '
单笔均收益(毛利)
' + (m.avg_profit_pct != null ? m.avg_profit_pct + '%' : '—') + '
' + + '
组合年化(扣费)
' + (m.cagr_pct != null ? m.cagr_pct + '%' : '—') + '
' + + '
组合10年收益
' + (m.return_pct != null ? m.return_pct + '%' : '—') + '
' + '
' + - '
均持' + (m.avg_hold_days != null ? m.avg_hold_days + '天' : '—') + ' · 均收益' + (m.avg_profit_pct != null ? m.avg_profit_pct + '%' : '—') + ' · 回撤' + (m.max_dd_pct != null ? m.max_dd_pct + '%' : '—') + '
' + + '
' + + '
胜率
' + (m.win_rate != null ? m.win_rate + '%' : '—') + '
' + + '
信号总数
' + (m.trades != null ? (m.trades > 999 ? Math.round(m.trades/1000) + 'k' : m.trades) : '—') + '
' + + '
组合执行
' + (m.positions_taken_5slot != null ? m.positions_taken_5slot + '笔' : '—') + '
' + + '
覆盖月
' + (u.months || '—') + '
' + + '
' + + '
均持' + (m.avg_hold_days != null ? m.avg_hold_days + '天' : '—') + ' · 回撤' + (m.max_dd_pct != null ? m.max_dd_pct + '%' : '—') + ' · 组合年均' + yearly5 + '笔(人工可操作)
' + + (v === 'v_mr' ? '
📋 实盘链路:22k信号 → 组合模拟只执行' + (m.positions_taken_5slot || 0) + '笔 → 每日扫描器只挑最超跌少数候选(2026-08-02首跑仅3只)→ 人工确认建仓。22k是候选池,不是操作量。
' : '') + '
'; } h += '
';