feat: 前端方案A——策略只在适应温区(best_regime)表显示一行,所有列对应适应温区数据

This commit is contained in:
xxm
2026-08-15 23:47:35 +08:00
parent b1ede2747e
commit 5b0e67ad2b
+3 -3
View File
@@ -2479,9 +2479,9 @@ function renderStrategyTable(strategies) {
'<td class="text-center px-2 py-1.5" onclick="event.stopPropagation()"><button onclick="runStrategyBacktest(\'' + s.version + '\')" class="px-2 py-0.5 bg-blue-600/60 hover:bg-blue-500 rounded text-xs">▶回测</button></td></tr>';
};
const renderRegimeTable = (strats, rg, isCur, marketLabel, tempHtml) => {
// 2026-08-15 单温区表格:该市场在该温区有数据的所有可用策略(按该温区胜率降序),激活策略高亮
// 2026-08-15 方案A:策略只在适应温区(best_regime)表显示一行——所有列都是该策略在适应温区的数据
const metas = strats
.filter(s => (s.regime_winrates || {})[rg] && (s.regime_winrates || {})[rg].trades != null)
.filter(s => s.best_regime === rg && (s.regime_winrates || {})[rg] && (s.regime_winrates || {})[rg].trades != null)
.sort((x, y) => ((y.regime_winrates || {})[rg].win_rate || -1) - ((x.regime_winrates || {})[rg].win_rate || -1));
if (!metas.length) return '';
const meta = REGIME_META[rg] || {icon: '🌐', name: rg};
@@ -2489,7 +2489,7 @@ function renderStrategyTable(strategies) {
'<div class="flex items-center gap-2 px-3 py-1.5 text-sm ' + (isCur ? 'text-emerald-300' : 'text-slate-400') + '">' +
marketLabel + ' · ' + meta.icon + ' ' + meta.name + (isCur ? ' <span class="text-[10px] bg-emerald-500/20 text-emerald-300 px-1 rounded">当前温区</span>' : '') + (tempHtml || '') +
'<span class="text-xs text-slate-500">(' + metas.length + '个策略)</span>' +
'<span class="text-[10px] text-slate-600">' + (isCur ? '当前温区匹配即激活' : '该温区下有数据(参考') + '</span></div>' +
'<span class="text-[10px] text-slate-600">' + (isCur ? '当前温区匹配即激活' : '策略适应温区(best_regime') + '</span></div>' +
'<div class="overflow-x-auto"><table class="w-full text-xs whitespace-nowrap"><thead><tr class="text-slate-500 border-b border-slate-700">' +
th('version', '版本', 'text-left') + th('name', '名称', 'text-left') +
th('win_rate', '胜率', 'text-right') + th('avg_profit', '平均收益', 'text-right') + th('trades', '笔数', 'text-right') +