feat: 界面AB融合按钮——B组verified候选可一键融合到A组(带确认+API调用)

This commit is contained in:
xxm
2026-08-16 15:17:24 +08:00
parent b462ef9281
commit 020e7ef31e
+15 -2
View File
@@ -2279,10 +2279,12 @@ async function loadEvolutionBox() {
h += '<div class="text-sm text-slate-300 mb-1 bg-slate-900/40 rounded px-2 py-1">' +
'<div><span class="text-emerald-400 font-bold">[B组 '+b.regime.replace('trend_','')+']</span> ' + b.hypothesis +
' <span class="text-slate-500 text-xs">' + (b.trades_est||'?') + '样本 好果率' + (b.good_rate || b.ok_rate || b.big_rate || '?') + '%</span></div>' +
'<div class="text-[10px] text-slate-500">对照A组(' + b.regime.replace('trend_','') + '): ' + (aNames.join(', ') || '—') + '</div></div>';
'<div class="text-[10px] text-slate-500">对照A组(' + b.regime.replace('trend_','') + '): ' + (aNames.join(', ') || '—') + '</div>' +
(b.status === 'verified' ? '<button onclick="mergeBGroup()" class="text-[10px] px-1.5 py-0.5 bg-emerald-500/20 text-emerald-300 rounded hover:bg-emerald-500/30 mt-1">⬇️融合到A组</button>' : '') +
'</div>';
}
} else {
h += '<div class="text-sm text-slate-600 mb-1">暂无B组候选(由果及因扫描中,数据事实:震荡/下跌市因子区分度不足</div>';
h += '<div class="text-sm text-slate-600 mb-1">暂无B组候选(挖掘中;通过模拟验证的候选可融合到A组</div>';
}
// ── 2026-08-16 策略资格概览(温区适应评估)──
@@ -2358,6 +2360,17 @@ async function toggleAvail(version, checked) {
loadStrategyList(); // 刷新(state 可能变化)
} catch(e) { console.error('toggleAvail failed', e); }
}
// 2026-08-16 AB融合:B组verified候选 → A组实施(需老莫确认)
async function mergeBGroup() {
if (!confirm('确认将B组候选融合到A组实施?融合后可手动启用/停用。')) return;
try {
const r = await fetch('/api/evolution/merge_b_group', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{}'});
const d = await r.json();
alert('融合结果: ' + JSON.stringify(d.merged || d.error || d));
loadEvolutionBox();
loadStrategyList();
} catch(e) { alert('融合失败: ' + e.message); }
}
async function batchAvail(rg, available) {
const list = (window._strats || [])
.filter(s => s.qualification && s.qualification[rg] && (s.market || 'all') !== 'hk')