diff --git a/static/index.html b/static/index.html
index 9041dc0e..d13e942d 100644
--- a/static/index.html
+++ b/static/index.html
@@ -2443,8 +2443,13 @@ function renderStrategyTable(strategies) {
const n = st.total_trades || 0;
const months = (st.universality || {}).months || 0;
const conf = Math.min(1, n / 40) * (months > 0 ? Math.min(1, months / 6) : 1);
+ // 2026-08-17 老莫:效率惩罚(信号/成交比过高=大量信号未成交)
+ const _posN = (st.portfolio || {}).positions_taken || 0;
+ const _sigN = n;
+ const _ratioN = _posN > 0 ? _sigN / _posN : 99;
+ const _effN = _ratioN <= 2 ? 1.0 : _ratioN <= 5 ? 0.9 : _ratioN <= 10 ? 0.75 : 0.5;
s._confidence = conf;
- s._composite = Math.round((ret + wr + sh + pfc + dd) * conf);
+ s._composite = Math.round((ret + wr + sh + pfc + dd) * conf * _effN);
}
// 保存数据用于列排序
window._strats = strategies;
@@ -2638,7 +2643,11 @@ function renderStrategyTable(strategies) {
const rn = tr || 0;
const rm = rw.universality ? (rw.universality.months || 0) : 0;
const rconf = Math.min(1, rn / 40) * (rm > 0 ? Math.min(1, rm / 6) : 1);
- comp = Math.round((ret + w + sh + pfc + dd) * rconf);
+ // 2026-08-17 老莫:效率惩罚——信号/成交比过高(大量信号未成交=质量差)综合分打折
+ const _sig = tr != null ? tr : 0, _pos = (rw && rw.positions_taken) || 0;
+ const _ratio = _pos > 0 ? _sig / _pos : 99;
+ const _eff = _ratio <= 2 ? 1.0 : _ratio <= 5 ? 0.9 : _ratio <= 10 ? 0.75 : 0.5;
+ comp = Math.round((ret + w + sh + pfc + dd) * rconf * _eff);
}
const cagr = rwPf ? rwPf.cagr_pct : null;
const ddV = rwPf ? rwPf.portfolio_max_dd_pct : null;
@@ -2653,7 +2662,7 @@ function renderStrategyTable(strategies) {
const rManual = s.manual_available !== false;
let rState, rStateCls, rStateBadge, rRowBg;
if (!rManual) { rState = 'manual_off'; rStateCls = 'text-slate-500'; rStateBadge = '手动停用'; rRowBg = 'opacity-50'; }
- else if (r3) { rState = 'ok3'; rStateCls = 'text-emerald-400'; rStateBadge = '可激活'; rRowBg = 'bg-emerald-900/10'; }
+ else if (r3) { rState = 'ok3'; rStateCls = 'text-emerald-400'; rStateBadge = (s.current === true) ? '已激活' : '可激活'; rRowBg = 'bg-emerald-900/10'; }
else if (rNearOk) { rState = 'ok2'; rStateCls = 'text-blue-400'; rStateBadge = '可用'; rRowBg = ''; }
else { rState = 'bad'; rStateCls = 'text-red-400/80'; rStateBadge = '不合格'; rRowBg = 'opacity-60'; }
const isActive = rState === 'ok3';