feat: 仓位⚡改可点击按钮,弹出信念分级仓位规则模态框(因子明细+叠乘规则)
This commit is contained in:
+40
-1
@@ -1993,6 +1993,45 @@ function showDesc(version) {
|
||||
</div>`;
|
||||
document.body.appendChild(modal);
|
||||
}
|
||||
function showConviction(version) {
|
||||
const s = (window._strats || []).find(x => x.version === version);
|
||||
const st = (s && s.summary_stats) || {};
|
||||
const model = st.conviction_model;
|
||||
if (!model) { showToast('该策略无信念分级仓位'); return; }
|
||||
const slots = st.sizing_slots || 10;
|
||||
const isStack = model.includes('叠乘');
|
||||
// boost分布(从trades统计在前端没有, 用summary里的说明)
|
||||
const rules = isStack ? [
|
||||
['动量基因 DNA', '收缩突破形态(ATR处20日最低1/4位+破20日新高+量比>1.2)', '×2'],
|
||||
['行业确认牛', '行业板块ADX>25(行业级趋势强化)', '×2'],
|
||||
['资金加速度', 'flow_delta>0(主力资金净流入在加速)', '×2'],
|
||||
] : [
|
||||
['动量基因 DNA', '收缩突破形态(ATR处20日最低1/4位+破20日新高+量比>1.2)', '任一命中 ×2'],
|
||||
['行业趋势强', '行业板块ADX≥20', '任一命中 ×2'],
|
||||
['资金加速度', 'flow_delta>0(主力资金净流入在加速)', '任一命中 ×2'],
|
||||
];
|
||||
const modal = document.createElement('div');
|
||||
modal.className = 'fixed inset-0 z-50 flex items-center justify-center bg-black/70 backdrop-blur-sm';
|
||||
modal.onclick = () => modal.remove();
|
||||
modal.innerHTML = `
|
||||
<div class="bg-slate-900 border border-slate-700 rounded-xl max-w-lg w-full mx-4 p-6 shadow-2xl" onclick="event.stopPropagation()">
|
||||
<div class="flex items-start justify-between mb-4">
|
||||
<h3 class="text-lg font-bold text-amber-300">⚡ 信念分级仓位</h3>
|
||||
<button onclick="this.closest('.fixed').remove()" class="text-slate-500 hover:text-white text-xl leading-none">×</button>
|
||||
</div>
|
||||
<div class="space-y-3 text-sm text-slate-300">
|
||||
<div class="bg-slate-800/60 rounded-lg px-3 py-2 font-mono text-xs text-amber-200">${model}</div>
|
||||
<div class="text-xs text-slate-400">基准 ${slots} 仓(总资金分${slots}份,每份一票)。命中信念因子的票按规则放大单票仓位:</div>
|
||||
${rules.map(r => `<div class="flex items-start gap-2 border-b border-slate-800 pb-2">
|
||||
<div class="text-amber-400 font-semibold whitespace-nowrap w-28">${r[0]}</div>
|
||||
<div class="flex-1 text-xs text-slate-400">${r[1]}</div>
|
||||
<div class="text-emerald-400 font-mono font-bold">${r[2]}</div>
|
||||
</div>`).join('')}
|
||||
<div class="text-xs text-slate-500">${isStack ? '多个因子同时命中则叠乘(如 DNA+行业牛 = ×4),封顶 ×4;均不命中 ×1(基准仓)。' : '多个因子同时命中不叠乘,统一 ×2;均不命中 ×1(基准仓)。'}</div>
|
||||
</div>
|
||||
</div>`;
|
||||
document.body.appendChild(modal);
|
||||
}
|
||||
function showToast(msg) {
|
||||
const t = document.createElement('div');
|
||||
t.className = 'fixed top-4 right-4 z-50 bg-slate-800 border border-slate-600 rounded-lg px-4 py-2 text-sm text-slate-200 shadow-lg';
|
||||
@@ -2153,7 +2192,7 @@ function renderStrategyTable(strategies) {
|
||||
html += '<tr class="' + rowCls + '" onclick="showStrategyDetail(\'' + s.version + '\')">' +
|
||||
'<td class="px-2 py-1.5 font-mono font-bold ' + (isCurrent ? 'text-emerald-400' : 'text-blue-400') + '">' + s.version + (isCurrent ? ' <span class="text-[10px] bg-emerald-500/20 text-emerald-300 px-1 rounded">当前</span>' : '') + ((s.market && s.market !== 'all') ? ' <span class="text-[10px] bg-cyan-500/20 text-cyan-300 px-1 rounded">' + (s.market === 'hk' ? '港' : 'A') + '</span>' : '') + '</td>' +
|
||||
'<td class="px-2 py-1.5" title="' + (s.hypothesis || s.summary || '').replace(/"/g, '"') + '">' + (s.name || '') + (smallSample ? ' <span class="text-amber-500" title="样本<40笔">⚠️</span>' : '') + '</td>' +
|
||||
'<td class="text-center px-2 py-1.5 font-mono text-cyan-300"' + (st.conviction_model ? ' title="信念分级仓位: ' + st.conviction_model.replace(/"/g, '"') + '(基准' + (st.sizing_slots||10) + '仓, 单票按信念因子放大)"' : '') + '>' + (st.sizing_slots ? st.sizing_slots + '仓' : '10仓') + (st.conviction_model ? '<span class="text-amber-400" style="cursor:help">⚡</span>' : '') + '</td>' +
|
||||
'<td class="text-center px-2 py-1.5 font-mono text-cyan-300">' + (st.sizing_slots ? st.sizing_slots + '仓' : '10仓') + (st.conviction_model ? '<button onclick="event.stopPropagation();showConviction(\'' + s.version + '\')" class="text-amber-400 hover:text-amber-300" title="查看信念分级仓位规则">⚡</button>' : '') + '</td>' +
|
||||
'<td class="text-center px-2 py-1.5">' + ((s.description && s.description.title) ? '<button onclick="event.stopPropagation();showDesc(\'' + s.version + '\')" class="text-blue-400 hover:text-blue-300" title="查看策略说明">📖</button>' : '<span class="text-slate-700">—</span>') + '</td>' +
|
||||
cell('composite', s._composite, v => v + (s._confidence != null && s._confidence < 1 ? '<span class="text-slate-500 text-[10px]">×' + s._confidence.toFixed(2) + '</span>' : ''), 'font-bold text-amber-300') +
|
||||
cell('universality_score', (st.universality || {}).score, v => v + '<span class="text-slate-500">/' + (st.universality || {}).months + '月</span>') +
|
||||
|
||||
Reference in New Issue
Block a user