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 || {};