1
This commit is contained in:
parent
b4df926e93
commit
6b7011becb
@ -448,6 +448,74 @@ function fmtCompactNumber(v) {
|
|||||||
if (abs >= 1e3) return (v / 1e3).toFixed(1) + 'K';
|
if (abs >= 1e3) return (v / 1e3).toFixed(1) + 'K';
|
||||||
return v.toFixed(abs >= 100 ? 0 : abs >= 10 ? 1 : 2);
|
return v.toFixed(abs >= 100 ? 0 : abs >= 10 ? 1 : 2);
|
||||||
}
|
}
|
||||||
|
var MARKET_REGIME_LABELS = {
|
||||||
|
risk_off: '避险期',
|
||||||
|
btc_main_uptrend: 'BTC 主导上涨',
|
||||||
|
altcoin_rotation: '山寨轮动期',
|
||||||
|
sideways_chop: '震荡拉锯期',
|
||||||
|
meme_frenzy: 'Meme 过热期',
|
||||||
|
unknown: '市场环境待确认'
|
||||||
|
};
|
||||||
|
var MARKET_RISK_LABELS = {
|
||||||
|
low: '低风险',
|
||||||
|
medium: '中等风险',
|
||||||
|
high: '高风险',
|
||||||
|
critical: '极高风险'
|
||||||
|
};
|
||||||
|
var DECISION_LABELS = {
|
||||||
|
confirmed: '已确认',
|
||||||
|
rejected: '未通过',
|
||||||
|
observe: '观察中',
|
||||||
|
wait_pullback: '等待回踩',
|
||||||
|
buy_now: '入场窗口',
|
||||||
|
weak_observe: '弱观察',
|
||||||
|
invalid: '已失效'
|
||||||
|
};
|
||||||
|
var MODULE_LABELS = {
|
||||||
|
confirm_burst: '爆发确认',
|
||||||
|
confirm_static_accumulation: '蓄力确认',
|
||||||
|
confirm_event: '事件确认',
|
||||||
|
strategy: '策略判断',
|
||||||
|
screener: '初筛',
|
||||||
|
tracker: '跟踪',
|
||||||
|
paper_trader: '策略交易'
|
||||||
|
};
|
||||||
|
var FLAG_LABELS = {
|
||||||
|
market_regime: '市场环境',
|
||||||
|
market_risk: '市场风险',
|
||||||
|
global_risk: '全局风险',
|
||||||
|
risk_reward_bad: '盈亏比不足',
|
||||||
|
false_breakout: '假突破风险',
|
||||||
|
liquidity_risk: '流动性风险',
|
||||||
|
funding_overheat: '资金费率过热',
|
||||||
|
overextended: '短线涨幅过大',
|
||||||
|
entry_quality_low: '买点质量偏低'
|
||||||
|
};
|
||||||
|
function regimeLabel(v) {
|
||||||
|
v = String(v || '');
|
||||||
|
return MARKET_REGIME_LABELS[v] || cleanDisplayText(v).replace(/_/g, ' ');
|
||||||
|
}
|
||||||
|
function riskLabel(v) {
|
||||||
|
v = String(v || '');
|
||||||
|
return MARKET_RISK_LABELS[v] || cleanDisplayText(v).replace(/_/g, ' ');
|
||||||
|
}
|
||||||
|
function translateInternalToken(token) {
|
||||||
|
token = String(token == null ? '' : token).trim();
|
||||||
|
if (!token) return '';
|
||||||
|
if (DECISION_LABELS[token]) return DECISION_LABELS[token];
|
||||||
|
if (MODULE_LABELS[token]) return MODULE_LABELS[token];
|
||||||
|
if (MARKET_REGIME_LABELS[token]) return MARKET_REGIME_LABELS[token];
|
||||||
|
if (MARKET_RISK_LABELS[token]) return MARKET_RISK_LABELS[token];
|
||||||
|
var kv = token.match(/^([a-zA-Z0-9_]+):(.*)$/);
|
||||||
|
if (kv) {
|
||||||
|
var key = kv[1], value = kv[2];
|
||||||
|
if (key === 'market_regime') return '市场环境:' + regimeLabel(value);
|
||||||
|
if (key === 'market_risk') return '市场风险:' + riskLabel(value);
|
||||||
|
if (key === 'global_risk') return '全局风险:' + riskLabel(value);
|
||||||
|
return (FLAG_LABELS[key] || key.replace(/_/g, ' ')) + ':' + translateInternalToken(value);
|
||||||
|
}
|
||||||
|
return FLAG_LABELS[token] || cleanDisplayText(token).replace(/_/g, ' ');
|
||||||
|
}
|
||||||
function scoreComponentsFrom(r) {
|
function scoreComponentsFrom(r) {
|
||||||
var ep = (r && r.entry_plan) || {};
|
var ep = (r && r.entry_plan) || {};
|
||||||
var mc = (r && r.market_context) || {};
|
var mc = (r && r.market_context) || {};
|
||||||
@ -480,13 +548,15 @@ function renderRegimeBrief(r) {
|
|||||||
if (!rg || !rg.regime) return '';
|
if (!rg || !rg.regime) return '';
|
||||||
var reasons = Array.isArray(rg.reasons) ? rg.reasons : [];
|
var reasons = Array.isArray(rg.reasons) ? rg.reasons : [];
|
||||||
var cls = String(rg.regime || '') + ' ' + String(rg.risk_level || '');
|
var cls = String(rg.regime || '') + ' ' + String(rg.risk_level || '');
|
||||||
return '<div class="regime-brief '+esc(cls)+'"><span class="regime-name">'+esc(rg.label || rg.regime || '市场环境')+' · '+esc(rg.risk_level || 'medium')+'</span><span class="regime-reason">'+esc(reasons[0] || '市场环境已记录到策略上下文')+'</span></div>';
|
return '<div class="regime-brief '+esc(cls)+'"><span class="regime-name">'+esc(rg.label || regimeLabel(rg.regime) || '市场环境')+' · '+esc(riskLabel(rg.risk_level || 'medium'))+'</span><span class="regime-reason">'+esc(reasons[0] || '市场环境已记录到策略上下文')+'</span></div>';
|
||||||
}
|
}
|
||||||
function renderDecisionLogBrief(r) {
|
function renderDecisionLogBrief(r) {
|
||||||
var log = decisionLogFrom(r);
|
var log = decisionLogFrom(r);
|
||||||
if (!log || !log.decision) return '';
|
if (!log || !log.decision) return '';
|
||||||
var flags = Array.isArray(log.risk_flags) ? log.risk_flags.slice(0,2).join(' · ') : '';
|
var flags = Array.isArray(log.risk_flags)
|
||||||
return '<div class="decision-log-brief"><b>'+esc(log.decision)+'</b> · '+esc(log.module || 'strategy')+(flags ? ' · '+esc(flags) : '')+'</div>';
|
? log.risk_flags.slice(0,3).map(translateInternalToken).filter(Boolean).join(' · ')
|
||||||
|
: '';
|
||||||
|
return '<div class="decision-log-brief"><b>'+esc(translateInternalToken(log.decision))+'</b> · '+esc(translateInternalToken(log.module || 'strategy'))+(flags ? ' · '+esc(flags) : '')+'</div>';
|
||||||
}
|
}
|
||||||
function renderStrategyDiagnostics(r) {
|
function renderStrategyDiagnostics(r) {
|
||||||
var html = renderScoreComponents(r) + renderRegimeBrief(r) + renderDecisionLogBrief(r);
|
var html = renderScoreComponents(r) + renderRegimeBrief(r) + renderDecisionLogBrief(r);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user