From eaab1fc25847f2f5c7e15378b09caf13617d29ed Mon Sep 17 00:00:00 2001 From: xxm Date: Sun, 16 Aug 2026 08:51:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=89=8D=E7=AB=AF=E6=B8=A9=E5=8C=BA?= =?UTF-8?q?=E8=A1=A8=E8=BF=87=E6=BB=A4=E6=94=B9qualification[rg]=E2=80=94?= =?UTF-8?q?=E2=80=94=E7=AD=96=E7=95=A5=E5=9C=A8=E5=AE=83=E8=BE=BE=E6=A0=87?= =?UTF-8?q?=E7=9A=84=E6=AF=8F=E4=B8=AA=E6=B8=A9=E5=8C=BA=E8=A1=A8=E6=98=BE?= =?UTF-8?q?=E7=A4=BA(=E5=A4=9A=E6=B8=A9=E5=8C=BA=E9=80=82=E5=BA=94),?= =?UTF-8?q?=E8=B5=84=E6=A0=BC=E5=BE=BD=E7=AB=A0/=E5=9F=BA=E5=87=86?= =?UTF-8?q?=E9=80=82=E9=85=8Dper-regime?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/index.html | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/static/index.html b/static/index.html index 3f88f6fb..db4ff580 100644 --- a/static/index.html +++ b/static/index.html @@ -2195,11 +2195,14 @@ async function loadStrategyList() { else if (mkt === 'a') strats = strats.filter(s => (s.market || 'all') !== 'hk'); // 2026-08-16 大盘基准(从任一策略 qualification 提取,供温区表头显示) for (const s of strats) { - if (s.qualification && s.qualification.bench_1y != null) { - window._bench1y = s.qualification.bench_1y; - window._bench2y = s.qualification.bench_2y; - window._bench10y = s.qualification.bench_10y; - break; + if (s.qualification) { + const anyQ = Object.values(s.qualification)[0]; + if (anyQ && anyQ.bench_1y != null) { + window._bench1y = anyQ.bench_1y; + window._bench2y = anyQ.bench_2y; + window._bench10y = anyQ.bench_10y; + break; + } } } renderStrategyTable(strats); @@ -2314,7 +2317,7 @@ async function toggleAvail(version, checked) { } async function batchAvail(rg, available) { const list = (window._strats || []) - .filter(s => s.best_regime === rg && (s.market || 'all') !== 'hk') + .filter(s => s.qualification && s.qualification[rg] && (s.market || 'all') !== 'hk') .map(s => s.version); if (!list.length) return; try { @@ -2543,10 +2546,10 @@ function renderStrategyTable(strategies) { '' + s.version + (isActive ? ' 激活' : '') + ((s.market && s.market !== 'all') ? ' ' + (s.market === 'hk' ? '港' : 'A') + '' : '') + '' + '' + (s.name || '') + (smallSample ? ' ⚠️' : '') + '' + // 2026-08-16 资格列:长期/近期/当下 三项达标徽章 - '' + (s.qualification ? ( - '' + (s.qualification.long_ok ? '✅' : '❌') + '' + - '' + (s.qualification.mid_ok ? '✅' : '❌') + '' + - '' + (s.qualification.short_ok ? '✅' : '❌') + '' + '' + (s.qualification && s.qualification[rg] ? ( + '' + (s.qualification[rg].long_ok ? '✅' : '❌') + '' + + '' + (s.qualification[rg].mid_ok ? '✅' : '❌') + '' + + '' + (s.qualification[rg].short_ok ? '✅' : '❌') + '' ) : '') + (s.qual_warning ? '
' + s.qual_warning + '
' : '') + '' + @@ -2568,10 +2571,10 @@ function renderStrategyTable(strategies) { ''; }; const renderRegimeTable = (strats, rg, isCur, marketLabel, tempHtml) => { - // 2026-08-15 方案A:策略只在适应温区(best_regime)表显示一行——所有列都是该策略在适应温区的数据 - // 2026-08-16 温区感知排序:尊重 window._sortKey(点列头排序),字段从 regime_winrates[rg] 取 + // 2026-08-16 温区表显示该温区下【资格达标】的策略(qualification[rg] 存在 = 有10y数据+长期合格) + // 策略可适应多个温区:在它达标的每个温区表都显示一行(不再局限单个 best_regime) const metas = strats - .filter(s => s.best_regime === rg && (s.regime_winrates || {})[rg] && (s.regime_winrates || {})[rg].trades != null); + .filter(s => s.qualification && s.qualification[rg] && (s.regime_winrates || {})[rg] && (s.regime_winrates || {})[rg].trades != null); const regimeGet = (s, key) => { const rw = (s.regime_winrates || {})[rg] || {}; const pf = rw.portfolio || {};