新增 signal-optimizer.html: - 英雄区:展示真实 BTC/SOL EWO 转换通知对比 - 5大问题诊断卡片(含代码片段) - EWO 幅度对比图表(Chart.js) - 实时信号模拟器(调整 EWO 值/周期/品种,即时对比原版 vs 优化版评分) - 周期分层策略矩阵表 - 优化效果预期图(假信号减少 & 胜率提升) - MTF 三层架构可视化图 - 优化路线图(短/中/长期)
1033 行
42 KiB
HTML
1033 行
42 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>信号系统优化建议 | QuantKnowledge</title>
|
||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
|
||
<style>
|
||
:root {
|
||
--bg: #0a0e17;
|
||
--surface: #111827;
|
||
--surface2: #1a2235;
|
||
--surface3: #1f2d42;
|
||
--border: #2d3748;
|
||
--gold: #f0b90b;
|
||
--green: #0ecb81;
|
||
--red: #f6465d;
|
||
--blue: #1890ff;
|
||
--purple: #a78bfa;
|
||
--orange: #fb923c;
|
||
--text: #e2e8f0;
|
||
--text2: #64748b;
|
||
--text3: #94a3b8;
|
||
}
|
||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||
body {
|
||
background: var(--bg);
|
||
color: var(--text);
|
||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', sans-serif;
|
||
line-height: 1.6;
|
||
}
|
||
|
||
/* ── 顶部 ── */
|
||
header {
|
||
background: var(--surface);
|
||
border-bottom: 1px solid var(--border);
|
||
padding: 0 2rem;
|
||
height: 56px;
|
||
display: flex; align-items: center; justify-content: space-between;
|
||
position: sticky; top: 0; z-index: 100;
|
||
}
|
||
.logo { font-size: 1rem; font-weight: 700; color: var(--gold); display: flex; align-items: center; gap: 0.5rem; }
|
||
.logo-dot { width: 8px; height: 8px; background: var(--green); border-radius: 50%; animation: pulse 2s infinite; }
|
||
@keyframes pulse { 0%,100%{opacity:1;transform:scale(1)} 50%{opacity:0.5;transform:scale(1.3)} }
|
||
.header-right { display: flex; gap: 1rem; align-items: center; }
|
||
.badge-pill {
|
||
background: var(--surface2); border: 1px solid var(--border);
|
||
border-radius: 20px; padding: 0.25rem 0.75rem; font-size: 0.75rem; color: var(--text3);
|
||
}
|
||
nav a { color: var(--text2); text-decoration: none; font-size: 0.85rem; transition: color 0.2s; }
|
||
nav a:hover { color: var(--gold); }
|
||
|
||
/* ── 英雄区 ── */
|
||
.hero {
|
||
background: linear-gradient(135deg, #0a0e17 0%, #111827 40%, #0f1e2e 100%);
|
||
padding: 4rem 2rem 3rem;
|
||
text-align: center;
|
||
border-bottom: 1px solid var(--border);
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
.hero::before {
|
||
content: '';
|
||
position: absolute; top: 0; left: 0; right: 0; bottom: 0;
|
||
background: radial-gradient(ellipse at 50% 0%, rgba(240,185,11,0.06) 0%, transparent 70%);
|
||
pointer-events: none;
|
||
}
|
||
.hero-tag {
|
||
display: inline-flex; align-items: center; gap: 0.4rem;
|
||
background: rgba(240,185,11,0.1); border: 1px solid rgba(240,185,11,0.3);
|
||
border-radius: 20px; padding: 0.3rem 1rem; font-size: 0.8rem; color: var(--gold);
|
||
margin-bottom: 1.2rem;
|
||
}
|
||
.hero h1 { font-size: 2.4rem; font-weight: 800; margin-bottom: 0.8rem; }
|
||
.hero h1 .accent { color: var(--gold); }
|
||
.hero p { color: var(--text3); font-size: 1rem; max-width: 600px; margin: 0 auto 1.5rem; }
|
||
.ewo-alert-box {
|
||
display: inline-flex; gap: 2rem; flex-wrap: wrap; justify-content: center;
|
||
background: var(--surface); border: 1px solid var(--border);
|
||
border-radius: 12px; padding: 1rem 2rem; margin-top: 1rem;
|
||
font-family: 'JetBrains Mono', 'Courier New', monospace; font-size: 0.85rem;
|
||
}
|
||
.ewo-item { text-align: left; }
|
||
.ewo-item .sym { color: var(--gold); font-weight: 700; font-size: 0.9rem; }
|
||
.ewo-item .val { color: var(--green); }
|
||
.ewo-item .val.weak { color: var(--orange); }
|
||
.ewo-item .meta { color: var(--text2); font-size: 0.75rem; }
|
||
|
||
/* ── 布局 ── */
|
||
.container { max-width: 1280px; margin: 0 auto; padding: 2rem; }
|
||
section { margin-bottom: 3rem; }
|
||
.section-header {
|
||
display: flex; align-items: center; gap: 0.8rem; margin-bottom: 1.5rem;
|
||
}
|
||
.section-header h2 { font-size: 1.25rem; font-weight: 700; }
|
||
.section-num {
|
||
background: var(--gold); color: #000; width: 28px; height: 28px;
|
||
border-radius: 50%; display: flex; align-items: center; justify-content: center;
|
||
font-size: 0.8rem; font-weight: 800; flex-shrink: 0;
|
||
}
|
||
|
||
/* ── 问题诊断卡片 ── */
|
||
.problem-grid {
|
||
display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 1rem;
|
||
}
|
||
.problem-card {
|
||
background: var(--surface); border: 1px solid var(--border);
|
||
border-radius: 12px; padding: 1.4rem; transition: border-color 0.2s, transform 0.2s;
|
||
}
|
||
.problem-card:hover { border-color: var(--gold); transform: translateY(-2px); }
|
||
.problem-card .p-header { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.8rem; }
|
||
.priority-badge {
|
||
padding: 0.2rem 0.6rem; border-radius: 4px; font-size: 0.72rem; font-weight: 700;
|
||
}
|
||
.priority-badge.p1 { background: rgba(246,70,93,0.2); color: var(--red); border: 1px solid var(--red); }
|
||
.priority-badge.p2 { background: rgba(240,185,11,0.2); color: var(--gold); border: 1px solid var(--gold); }
|
||
.priority-badge.p3 { background: rgba(14,203,129,0.2); color: var(--green); border: 1px solid var(--green); }
|
||
.problem-card h3 { font-size: 0.95rem; font-weight: 600; }
|
||
.problem-card p { color: var(--text3); font-size: 0.85rem; line-height: 1.6; }
|
||
.code-snippet {
|
||
background: var(--surface2); border: 1px solid var(--border);
|
||
border-radius: 6px; padding: 0.6rem 0.8rem; margin-top: 0.8rem;
|
||
font-family: 'JetBrains Mono', monospace; font-size: 0.78rem; color: var(--purple);
|
||
overflow-x: auto;
|
||
}
|
||
|
||
/* ── EWO 幅度对比 ── */
|
||
.ewo-compare {
|
||
display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem;
|
||
}
|
||
@media (max-width: 768px) { .ewo-compare { grid-template-columns: 1fr; } }
|
||
.compare-card {
|
||
background: var(--surface); border: 1px solid var(--border);
|
||
border-radius: 12px; padding: 1.5rem;
|
||
}
|
||
.compare-card h3 { font-size: 0.95rem; font-weight: 600; margin-bottom: 1rem; color: var(--text3); }
|
||
.chart-wrap { position: relative; height: 260px; }
|
||
|
||
/* ── 周期矩阵表 ── */
|
||
.matrix-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }
|
||
.matrix-table th {
|
||
background: var(--surface2); color: var(--text2);
|
||
padding: 0.7rem 0.9rem; text-align: left; border-bottom: 1px solid var(--border);
|
||
font-weight: 600;
|
||
}
|
||
.matrix-table td {
|
||
padding: 0.7rem 0.9rem; border-bottom: 1px solid var(--border); color: var(--text3);
|
||
}
|
||
.matrix-table tr:hover td { background: var(--surface2); }
|
||
.interval-badge {
|
||
display: inline-block; padding: 0.15rem 0.5rem; border-radius: 4px;
|
||
font-size: 0.75rem; font-weight: 600; font-family: monospace;
|
||
}
|
||
.ib-short { background: rgba(246,70,93,0.15); color: var(--red); }
|
||
.ib-mid { background: rgba(240,185,11,0.15); color: var(--gold); }
|
||
.ib-long { background: rgba(14,203,129,0.15); color: var(--green); }
|
||
|
||
/* ── 信号模拟器 ── */
|
||
.simulator {
|
||
background: var(--surface); border: 1px solid var(--border);
|
||
border-radius: 12px; padding: 1.5rem;
|
||
}
|
||
.sim-grid {
|
||
display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-bottom: 1.5rem;
|
||
}
|
||
@media (max-width: 768px) { .sim-grid { grid-template-columns: 1fr; } }
|
||
.sim-group { display: flex; flex-direction: column; gap: 0.8rem; }
|
||
.sim-group label { font-size: 0.85rem; color: var(--text3); }
|
||
.sim-control {
|
||
display: flex; align-items: center; gap: 0.8rem;
|
||
}
|
||
.sim-control input[type=range] { flex: 1; accent-color: var(--gold); }
|
||
.sim-control .val-display {
|
||
background: var(--surface2); border: 1px solid var(--border);
|
||
border-radius: 6px; padding: 0.2rem 0.6rem; font-size: 0.85rem;
|
||
font-family: monospace; color: var(--gold); min-width: 80px; text-align: center;
|
||
}
|
||
select.sim-select {
|
||
background: var(--surface2); color: var(--text); border: 1px solid var(--border);
|
||
border-radius: 6px; padding: 0.4rem 0.8rem; font-size: 0.85rem; width: 100%;
|
||
}
|
||
.checkbox-row { display: flex; flex-wrap: wrap; gap: 0.8rem; }
|
||
.checkbox-item {
|
||
display: flex; align-items: center; gap: 0.4rem;
|
||
font-size: 0.85rem; color: var(--text3); cursor: pointer;
|
||
}
|
||
.checkbox-item input { accent-color: var(--gold); }
|
||
|
||
/* 信号结果 */
|
||
.signal-output {
|
||
background: var(--surface2); border: 1px solid var(--border);
|
||
border-radius: 10px; padding: 1.2rem; margin-top: 1rem;
|
||
}
|
||
.signal-row { display: flex; gap: 1.5rem; flex-wrap: wrap; align-items: center; }
|
||
.signal-main-badge {
|
||
padding: 0.7rem 2rem; border-radius: 8px; font-size: 1.3rem; font-weight: 800;
|
||
letter-spacing: 2px; font-family: monospace;
|
||
}
|
||
.smb-buy { background: rgba(14,203,129,0.15); color: var(--green); border: 2px solid var(--green); }
|
||
.smb-sell { background: rgba(246,70,93,0.15); color: var(--red); border: 2px solid var(--red); }
|
||
.smb-neutral { background: rgba(100,116,139,0.15); color: var(--text2); border: 2px solid var(--border); }
|
||
.score-section { flex: 1; min-width: 200px; }
|
||
.score-row { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.5rem; }
|
||
.score-label { width: 70px; font-size: 0.82rem; color: var(--text2); }
|
||
.score-track { flex: 1; height: 8px; background: var(--surface); border-radius: 4px; overflow: hidden; }
|
||
.score-fill { height: 100%; border-radius: 4px; transition: width 0.4s ease; }
|
||
.sf-bull { background: var(--green); }
|
||
.sf-bear { background: var(--red); }
|
||
.score-num { width: 24px; font-size: 0.82rem; color: var(--text3); text-align: right; font-family: monospace; }
|
||
.ewo-quality {
|
||
padding: 0.3rem 0.8rem; border-radius: 6px; font-size: 0.8rem; font-weight: 600;
|
||
font-family: monospace;
|
||
}
|
||
.eq-strong { background: rgba(14,203,129,0.15); color: var(--green); border: 1px solid var(--green); }
|
||
.eq-weak { background: rgba(251,146,60,0.15); color: var(--orange); border: 1px solid var(--orange); }
|
||
.reasons-list { margin-top: 0.8rem; }
|
||
.reason-item {
|
||
font-size: 0.82rem; color: var(--text3); padding: 0.2rem 0;
|
||
border-left: 2px solid var(--border); padding-left: 0.6rem; margin-bottom: 0.3rem;
|
||
}
|
||
.reason-item.positive { border-color: var(--green); color: var(--green); }
|
||
.reason-item.negative { border-color: var(--red); color: var(--red); }
|
||
.reason-item.warning { border-color: var(--orange); color: var(--orange); }
|
||
|
||
/* ── 优化效果预期图 ── */
|
||
.effect-grid {
|
||
display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem;
|
||
}
|
||
@media (max-width: 768px) { .effect-grid { grid-template-columns: 1fr; } }
|
||
.effect-card {
|
||
background: var(--surface); border: 1px solid var(--border);
|
||
border-radius: 12px; padding: 1.5rem;
|
||
}
|
||
.effect-card h3 { font-size: 0.95rem; font-weight: 600; margin-bottom: 1rem; color: var(--text3); }
|
||
|
||
/* ── 路线图时间线 ── */
|
||
.roadmap { display: flex; flex-direction: column; gap: 0; }
|
||
.roadmap-phase {
|
||
display: flex; gap: 1.2rem; padding: 1.2rem 0;
|
||
border-bottom: 1px solid var(--border);
|
||
}
|
||
.roadmap-phase:last-child { border-bottom: none; }
|
||
.phase-dot-col { display: flex; flex-direction: column; align-items: center; }
|
||
.phase-dot {
|
||
width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center;
|
||
justify-content: center; font-size: 0.8rem; font-weight: 700; flex-shrink: 0;
|
||
}
|
||
.pd-short { background: rgba(14,203,129,0.2); color: var(--green); border: 2px solid var(--green); }
|
||
.pd-mid { background: rgba(240,185,11,0.2); color: var(--gold); border: 2px solid var(--gold); }
|
||
.pd-long { background: rgba(168,139,250,0.2); color: var(--purple); border: 2px solid var(--purple); }
|
||
.phase-line { flex: 1; width: 2px; background: var(--border); margin-top: 4px; }
|
||
.phase-content { flex: 1; }
|
||
.phase-title { font-weight: 600; font-size: 0.95rem; margin-bottom: 0.5rem; }
|
||
.phase-items { display: flex; flex-direction: column; gap: 0.4rem; }
|
||
.phase-item {
|
||
display: flex; align-items: flex-start; gap: 0.5rem;
|
||
font-size: 0.85rem; color: var(--text3);
|
||
}
|
||
.phase-item::before { content: '→'; color: var(--text2); flex-shrink: 0; }
|
||
|
||
/* ── MTF 架构图 ── */
|
||
.mtf-diagram {
|
||
background: var(--surface); border: 1px solid var(--border);
|
||
border-radius: 12px; padding: 1.5rem;
|
||
}
|
||
.mtf-layers { display: flex; flex-direction: column; gap: 0; }
|
||
.mtf-layer {
|
||
display: flex; align-items: center; gap: 1rem; padding: 1rem;
|
||
border-radius: 8px; margin-bottom: 0.5rem; position: relative;
|
||
}
|
||
.mtf-layer.confirm { background: rgba(14,203,129,0.08); border: 1px solid rgba(14,203,129,0.3); }
|
||
.mtf-layer.filter { background: rgba(240,185,11,0.08); border: 1px solid rgba(240,185,11,0.3); }
|
||
.mtf-layer.execute { background: rgba(24,144,255,0.08); border: 1px solid rgba(24,144,255,0.3); }
|
||
.mtf-layer-num {
|
||
width: 40px; height: 40px; border-radius: 8px; display: flex; align-items: center;
|
||
justify-content: center; font-size: 0.85rem; font-weight: 700; flex-shrink: 0;
|
||
}
|
||
.ln-confirm { background: rgba(14,203,129,0.2); color: var(--green); }
|
||
.ln-filter { background: rgba(240,185,11,0.2); color: var(--gold); }
|
||
.ln-execute { background: rgba(24,144,255,0.2); color: var(--blue); }
|
||
.mtf-layer-info { flex: 1; }
|
||
.mtf-layer-title { font-weight: 600; font-size: 0.95rem; }
|
||
.mtf-layer-desc { color: var(--text3); font-size: 0.82rem; margin-top: 0.2rem; }
|
||
.mtf-arrow {
|
||
text-align: center; color: var(--text2); font-size: 1.2rem; padding: 0.2rem 0;
|
||
}
|
||
.mtf-tags { display: flex; gap: 0.4rem; flex-wrap: wrap; margin-top: 0.4rem; }
|
||
.mtf-tag {
|
||
background: var(--surface2); border: 1px solid var(--border);
|
||
border-radius: 4px; padding: 0.15rem 0.5rem; font-size: 0.72rem; color: var(--text2);
|
||
font-family: monospace;
|
||
}
|
||
|
||
footer {
|
||
background: var(--surface); border-top: 1px solid var(--border);
|
||
padding: 1.5rem 2rem; text-align: center; color: var(--text2); font-size: 0.82rem;
|
||
}
|
||
footer a { color: var(--gold); text-decoration: none; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<header>
|
||
<div class="logo">
|
||
<div class="logo-dot"></div>
|
||
QuantKnowledge · 信号系统优化
|
||
</div>
|
||
<div class="header-right">
|
||
<nav style="display:flex;gap:1.2rem;">
|
||
<a href="#problems">问题诊断</a>
|
||
<a href="#simulator">信号模拟</a>
|
||
<a href="#matrix">周期矩阵</a>
|
||
<a href="#mtf">MTF架构</a>
|
||
<a href="#roadmap">路线图</a>
|
||
</nav>
|
||
<span class="badge-pill">tradehk 源码分析</span>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- 英雄区 -->
|
||
<div class="hero">
|
||
<div class="hero-tag">⚡ 基于真实 EWO 通知案例的深度分析</div>
|
||
<h1>信号系统 <span class="accent">深度优化</span> 建议</h1>
|
||
<p>基于 tradehk 源码(indicators.ts / types.ts)与真实 EWO 转换通知,识别 5 大核心问题并提出可落地的优化方案</p>
|
||
|
||
<!-- 真实通知展示 -->
|
||
<div class="ewo-alert-box">
|
||
<div class="ewo-item">
|
||
<div class="sym">BTC/10m · EWO 红→绿</div>
|
||
<div class="val">-29.048617 → +33.320837</div>
|
||
<div class="meta">前空头持续 27根K线 (4h30m) · 2026/03/06 10:10</div>
|
||
<div style="margin-top:0.3rem;font-size:0.72rem;color:#0ecb81;">✅ 强力穿越(|EWO|=33.32 > 阈值15.0)</div>
|
||
</div>
|
||
<div class="ewo-item">
|
||
<div class="sym">SOL/10m · EWO 红→绿</div>
|
||
<div class="val weak">-0.037316 → +0.006745</div>
|
||
<div class="meta">前空头持续 24根K线 (4h) · 2026/03/06 10:10</div>
|
||
<div style="margin-top:0.3rem;font-size:0.72rem;color:#fb923c;">⚠️ 微弱穿越(|EWO|=0.007 < 阈值0.5)</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="container">
|
||
|
||
<!-- 问题诊断 -->
|
||
<section id="problems">
|
||
<div class="section-header">
|
||
<div class="section-num">1</div>
|
||
<h2>5 大核心问题诊断</h2>
|
||
</div>
|
||
<div class="problem-grid">
|
||
<div class="problem-card">
|
||
<div class="p-header">
|
||
<span class="priority-badge p1">P1 最高优先级</span>
|
||
<h3>EWO 零轴穿越缺乏幅度过滤</h3>
|
||
</div>
|
||
<p>SOL 的 EWO 从 -0.037 变为 +0.007,与 BTC 的 -29→+33 获得完全相同的 +2 评分。微弱穿越极易产生假信号,是系统最大噪声来源。</p>
|
||
<div class="code-snippet">
|
||
// 现有代码(第 481 行)<br>
|
||
if (ewoNow > 0 && ewoPrev <= 0) {<br>
|
||
bullishCount += 2; // ← 无论幅度大小<br>
|
||
}
|
||
</div>
|
||
</div>
|
||
<div class="problem-card">
|
||
<div class="p-header">
|
||
<span class="priority-badge p1">P1 最高优先级</span>
|
||
<h3>信号强度阈值与周期不匹配</h3>
|
||
</div>
|
||
<p>10m 周期噪声远高于 4h/1d,但 strongThreshold 计算公式未区分周期,导致短周期产生大量低质量 STRONG 信号。</p>
|
||
<div class="code-snippet">
|
||
// 建议:引入周期乘数<br>
|
||
const mult = intervalMultiplier[interval];<br>
|
||
// 10m: ×1.2 | 4h: ×0.8 | 1d: ×0.6
|
||
</div>
|
||
</div>
|
||
<div class="problem-card">
|
||
<div class="p-header">
|
||
<span class="priority-badge p2">P2 高优先级</span>
|
||
<h3>未利用 EWO 阶段持续时间</h3>
|
||
</div>
|
||
<p>通知中包含"前空头持续 27根K线"这一关键信息,但信号引擎完全未使用。持续时间越长的阶段,其反转信号越可靠。</p>
|
||
<div class="code-snippet">
|
||
// 建议:持续时间奖励<br>
|
||
if (prevPhaseDuration >= 20) {<br>
|
||
bullishCount += 1; // 额外 +1<br>
|
||
}
|
||
</div>
|
||
</div>
|
||
<div class="problem-card">
|
||
<div class="p-header">
|
||
<span class="priority-badge p2">P2 高优先级</span>
|
||
<h3>大周期偏向缺乏粘性机制</h3>
|
||
</div>
|
||
<p>assessBigTimeframeBias 在震荡期(EWO 在零轴附近反复横跳)会频繁切换 BULLISH/BEARISH,导致小周期信号被错误过滤。</p>
|
||
<div class="code-snippet">
|
||
// 建议:连续 N 次确认才切换<br>
|
||
if (consecutiveConfirms < minConfirms) {<br>
|
||
return prevState; // 保持原方向<br>
|
||
}
|
||
</div>
|
||
</div>
|
||
<div class="problem-card">
|
||
<div class="p-header">
|
||
<span class="priority-badge p3">P3 中优先级</span>
|
||
<h3>缺少放量突破确认</h3>
|
||
</div>
|
||
<p>现有系统仅有缩量检测(detectVolumeContraction),缺少放量确认。EWO 转换时若伴随放量,信号可靠性显著提升。</p>
|
||
<div class="code-snippet">
|
||
// 建议:放量时信号加权<br>
|
||
if (isVolumeExpanding) {<br>
|
||
bullishCount += 1; // 放量确认<br>
|
||
}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- EWO 幅度对比 -->
|
||
<section>
|
||
<div class="section-header">
|
||
<div class="section-num">2</div>
|
||
<h2>EWO 幅度过滤效果对比</h2>
|
||
</div>
|
||
<div class="ewo-compare">
|
||
<div class="compare-card">
|
||
<h3>各品种 EWO 阈值配置(10m 周期)</h3>
|
||
<div class="chart-wrap">
|
||
<canvas id="ewoThresholdChart"></canvas>
|
||
</div>
|
||
</div>
|
||
<div class="compare-card">
|
||
<h3>BTC vs SOL EWO 穿越强度对比</h3>
|
||
<div class="chart-wrap">
|
||
<canvas id="ewoCompareChart"></canvas>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 信号模拟器 -->
|
||
<section id="simulator">
|
||
<div class="section-header">
|
||
<div class="section-num">3</div>
|
||
<h2>优化版信号模拟器</h2>
|
||
</div>
|
||
<div class="simulator">
|
||
<p style="color:var(--text3);font-size:0.85rem;margin-bottom:1.2rem;">
|
||
调整参数,实时对比原版评分与优化版评分的差异(特别是 EWO 幅度过滤的效果)
|
||
</p>
|
||
<div class="sim-grid">
|
||
<div class="sim-group">
|
||
<label>品种选择</label>
|
||
<select class="sim-select" id="symbolSelect">
|
||
<option value="BTC">BTC(阈值 15.0)</option>
|
||
<option value="ETH">ETH(阈值 5.0)</option>
|
||
<option value="SOL" selected>SOL(阈值 0.5)</option>
|
||
<option value="DOGE">DOGE(阈值 0.001)</option>
|
||
<option value="XAUT">XAUT 黄金(阈值 3.0)</option>
|
||
</select>
|
||
<label>交易周期</label>
|
||
<select class="sim-select" id="intervalSelect">
|
||
<option value="1m">1m(乘数 ×1.5)</option>
|
||
<option value="5m">5m(乘数 ×1.3)</option>
|
||
<option value="10m" selected>10m(乘数 ×1.2)</option>
|
||
<option value="30m">30m(乘数 ×1.0)</option>
|
||
<option value="1h">1h(乘数 ×0.9)</option>
|
||
<option value="4h">4h(乘数 ×0.8)</option>
|
||
</select>
|
||
<label>大周期偏向</label>
|
||
<select class="sim-select" id="bigBiasSelect">
|
||
<option value="NEUTRAL">NEUTRAL(不过滤)</option>
|
||
<option value="BULLISH" selected>BULLISH(允许做多)</option>
|
||
<option value="BEARISH">BEARISH(允许做空)</option>
|
||
</select>
|
||
</div>
|
||
<div class="sim-group">
|
||
<label>EWO 当前值(穿越后)</label>
|
||
<div class="sim-control">
|
||
<input type="range" id="ewoSlider" min="-50" max="50" step="0.1" value="0.007" />
|
||
<div class="val-display" id="ewoDisplay">0.007</div>
|
||
</div>
|
||
<label>EWO 前值(穿越前)</label>
|
||
<div class="sim-control">
|
||
<input type="range" id="ewoPrevSlider" min="-50" max="0" step="0.1" value="-0.037" />
|
||
<div class="val-display" id="ewoPrevDisplay">-0.037</div>
|
||
</div>
|
||
<label>前阶段持续 K 线数</label>
|
||
<div class="sim-control">
|
||
<input type="range" id="durationSlider" min="1" max="60" value="24" />
|
||
<div class="val-display" id="durationDisplay">24</div>
|
||
</div>
|
||
<label>附加信号</label>
|
||
<div class="checkbox-row">
|
||
<label class="checkbox-item"><input type="checkbox" id="macdCheck" checked /> MACD 金叉</label>
|
||
<label class="checkbox-item"><input type="checkbox" id="aoCheck" /> AO 穿零</label>
|
||
<label class="checkbox-item"><input type="checkbox" id="kdjCheck" /> KDJ 低位金叉</label>
|
||
<label class="checkbox-item"><input type="checkbox" id="volCheck" /> 放量确认</label>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="signal-output" id="signalOutput">
|
||
<!-- 动态渲染 -->
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 周期矩阵 -->
|
||
<section id="matrix">
|
||
<div class="section-header">
|
||
<div class="section-num">4</div>
|
||
<h2>周期分层策略矩阵</h2>
|
||
</div>
|
||
<div style="overflow-x:auto;">
|
||
<table class="matrix-table">
|
||
<thead>
|
||
<tr>
|
||
<th>周期</th>
|
||
<th>信号频率</th>
|
||
<th>噪声水平</th>
|
||
<th>推荐核心指标</th>
|
||
<th>推荐可选指标</th>
|
||
<th>强度阈值乘数</th>
|
||
<th>ATR止损倍数</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><span class="interval-badge ib-short">1m~3m</span></td>
|
||
<td>极高</td>
|
||
<td style="color:var(--red)">极高</td>
|
||
<td>EWO + MACD</td>
|
||
<td>—</td>
|
||
<td style="color:var(--red)">×1.4~1.5</td>
|
||
<td>1.5x</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="interval-badge ib-short">5m~10m</span></td>
|
||
<td>高</td>
|
||
<td style="color:var(--orange)">高</td>
|
||
<td>EWO + MACD + AO</td>
|
||
<td>KDJ</td>
|
||
<td style="color:var(--orange)">×1.2~1.3</td>
|
||
<td>2.0x</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="interval-badge ib-mid">15m~30m</span></td>
|
||
<td>中高</td>
|
||
<td style="color:var(--gold)">中</td>
|
||
<td>EWO + MACD + AO + MA</td>
|
||
<td>KDJ + RSI</td>
|
||
<td style="color:var(--gold)">×1.0~1.1</td>
|
||
<td>2.5x</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="interval-badge ib-mid">1h</span></td>
|
||
<td>中</td>
|
||
<td style="color:var(--text3)">中低</td>
|
||
<td>全核心</td>
|
||
<td>KDJ + RSI + SuperTrend</td>
|
||
<td style="color:var(--text3)">×0.9</td>
|
||
<td>3.0x</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="interval-badge ib-long">4h</span></td>
|
||
<td>低</td>
|
||
<td style="color:var(--green)">低</td>
|
||
<td>全核心</td>
|
||
<td>全部可选</td>
|
||
<td style="color:var(--green)">×0.8</td>
|
||
<td>3.5x</td>
|
||
</tr>
|
||
<tr>
|
||
<td><span class="interval-badge ib-long">1d</span></td>
|
||
<td>极低</td>
|
||
<td style="color:var(--green)">极低</td>
|
||
<td>全核心</td>
|
||
<td>全部可选 + DMI</td>
|
||
<td style="color:var(--green)">×0.6</td>
|
||
<td>4.0x</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 优化效果预期 -->
|
||
<section>
|
||
<div class="section-header">
|
||
<div class="section-num">5</div>
|
||
<h2>优化效果预期(理论估算)</h2>
|
||
</div>
|
||
<div class="effect-grid">
|
||
<div class="effect-card">
|
||
<h3>各优化项假信号减少预期 (%)</h3>
|
||
<div class="chart-wrap">
|
||
<canvas id="falseSignalChart"></canvas>
|
||
</div>
|
||
</div>
|
||
<div class="effect-card">
|
||
<h3>各优化项胜率提升预期 (%)</h3>
|
||
<div class="chart-wrap">
|
||
<canvas id="winRateChart"></canvas>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- MTF 架构 -->
|
||
<section id="mtf">
|
||
<div class="section-header">
|
||
<div class="section-num">6</div>
|
||
<h2>MTF 三层周期联动架构</h2>
|
||
</div>
|
||
<div class="mtf-diagram">
|
||
<div class="mtf-layers">
|
||
<div class="mtf-layer confirm">
|
||
<div class="mtf-layer-num ln-confirm">4h</div>
|
||
<div class="mtf-layer-info">
|
||
<div class="mtf-layer-title" style="color:var(--green)">确认层(大周期方向)</div>
|
||
<div class="mtf-layer-desc">assessBigTimeframeBias → BULLISH / BEARISH / NEUTRAL</div>
|
||
<div class="mtf-tags">
|
||
<span class="mtf-tag">EWO 权重×2</span>
|
||
<span class="mtf-tag">MACD 方向×1</span>
|
||
<span class="mtf-tag">MACD 柱×1</span>
|
||
<span class="mtf-tag">AO×1</span>
|
||
<span class="mtf-tag">粘性确认 ≥3次</span>
|
||
</div>
|
||
</div>
|
||
<div style="text-align:right;color:var(--text2);font-size:0.8rem;">
|
||
仅 BULLISH 时允许做多<br>仅 BEARISH 时允许做空
|
||
</div>
|
||
</div>
|
||
<div class="mtf-arrow">↓ 方向过滤</div>
|
||
<div class="mtf-layer filter">
|
||
<div class="mtf-layer-num ln-filter">1h</div>
|
||
<div class="mtf-layer-info">
|
||
<div class="mtf-layer-title" style="color:var(--gold)">过滤层(中周期确认)</div>
|
||
<div class="mtf-layer-desc">EWO 方向 + MACD 方向 → 中周期偏向确认</div>
|
||
<div class="mtf-tags">
|
||
<span class="mtf-tag">EWO 正负</span>
|
||
<span class="mtf-tag">MACD 方向</span>
|
||
<span class="mtf-tag">与大周期对齐 → 加权 +1</span>
|
||
</div>
|
||
</div>
|
||
<div style="text-align:right;color:var(--text2);font-size:0.8rem;">
|
||
对齐时信号强度提升<br>不对齐时降权处理
|
||
</div>
|
||
</div>
|
||
<div class="mtf-arrow">↓ 信号加权</div>
|
||
<div class="mtf-layer execute">
|
||
<div class="mtf-layer-num ln-execute">10m</div>
|
||
<div class="mtf-layer-info">
|
||
<div class="mtf-layer-title" style="color:var(--blue)">执行层(信号触发)</div>
|
||
<div class="mtf-layer-desc">完整信号引擎(优化版)→ 触发实际交易信号</div>
|
||
<div class="mtf-tags">
|
||
<span class="mtf-tag">EWO 幅度过滤</span>
|
||
<span class="mtf-tag">持续时间奖励</span>
|
||
<span class="mtf-tag">周期自适应阈值</span>
|
||
<span class="mtf-tag">放量确认</span>
|
||
<span class="mtf-tag">ATR 动态止损</span>
|
||
</div>
|
||
</div>
|
||
<div style="text-align:right;color:var(--text2);font-size:0.8rem;">
|
||
STRONG/MODERATE/WEAK<br>三级信号强度
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 路线图 -->
|
||
<section id="roadmap">
|
||
<div class="section-header">
|
||
<div class="section-num">7</div>
|
||
<h2>优化路线图</h2>
|
||
</div>
|
||
<div class="roadmap">
|
||
<div class="roadmap-phase">
|
||
<div class="phase-dot-col">
|
||
<div class="phase-dot pd-short">S</div>
|
||
<div class="phase-line"></div>
|
||
</div>
|
||
<div class="phase-content">
|
||
<div class="phase-title" style="color:var(--green)">短期(1-2 周内)</div>
|
||
<div class="phase-items">
|
||
<div class="phase-item">EWO 幅度过滤:在 generateSignal 中加入 minEwoAbsValue 参数,按品种配置阈值(BTC>15, SOL>0.5)</div>
|
||
<div class="phase-item">周期自适应阈值:修改 strongThreshold 计算,引入 intervalMultiplier(10m×1.2, 4h×0.8)</div>
|
||
<div class="phase-item">EWO 通知增强:在飞书通知中增加穿越强度、MACD 确认状态、大周期偏向字段</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="roadmap-phase">
|
||
<div class="phase-dot-col">
|
||
<div class="phase-dot pd-mid">M</div>
|
||
<div class="phase-line"></div>
|
||
</div>
|
||
<div class="phase-content">
|
||
<div class="phase-title" style="color:var(--gold)">中期(1 个月内)</div>
|
||
<div class="phase-items">
|
||
<div class="phase-item">EWO 阶段持续时间奖励:实现 countEwoPhaseDuration,前阶段 ≥20 根K线时额外 +1 分</div>
|
||
<div class="phase-item">放量确认机制:实现 detectVolumeExpansion,放量时信号加权 +1</div>
|
||
<div class="phase-item">粘性大周期偏向:实现 StickyBiasState,需连续 3 次确认才切换方向</div>
|
||
<div class="phase-item">XAUT 专项配置:针对黄金代币低波动特性,优化 MFI 权重和 EWO 阈值</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="roadmap-phase">
|
||
<div class="phase-dot-col">
|
||
<div class="phase-dot pd-long">L</div>
|
||
</div>
|
||
<div class="phase-content">
|
||
<div class="phase-title" style="color:var(--purple)">长期(3 个月内)</div>
|
||
<div class="phase-items">
|
||
<div class="phase-item">MTF 三层信号架构:实现完整的多周期联动系统,支持 4h→1h→10m 三层过滤</div>
|
||
<div class="phase-item">品种自适应参数:基于历史回测自动优化各品种的 EWO 阈值、MACD 参数</div>
|
||
<div class="phase-item">AI 辅助信号过滤:使用 LightGBM 训练过滤模型,自动识别高质量信号(参考 arXiv 2511.00665)</div>
|
||
<div class="phase-item">链上数据融合:将 SOPR、交易所净流入等链上指标融入 BTC/ETH 信号评分</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
</div>
|
||
|
||
<footer>
|
||
<p>量化交易知识库 v1.1 | 信号系统优化建议 | 基于 tradehk 源码分析 | 2026-03-06</p>
|
||
<p style="margin-top:0.4rem;">⚠️ 仅供学习研究,不构成投资建议。量化交易存在亏损风险。</p>
|
||
</footer>
|
||
|
||
<script>
|
||
// ============================================================
|
||
// EWO 阈值配置
|
||
// ============================================================
|
||
const EWO_THRESHOLDS = {
|
||
BTC: 15.0, ETH: 5.0, SOL: 0.5, DOGE: 0.001, XAUT: 3.0
|
||
};
|
||
|
||
const INTERVAL_MULT = {
|
||
'1m':1.5,'3m':1.4,'5m':1.3,'10m':1.2,'15m':1.1,'30m':1.0,'1h':0.9,'4h':0.8,'12h':0.7,'1d':0.6,'1w':0.5
|
||
};
|
||
|
||
// ============================================================
|
||
// 信号模拟器
|
||
// ============================================================
|
||
|
||
function calcOptimizedSignal() {
|
||
const symbol = document.getElementById('symbolSelect').value;
|
||
const interval = document.getElementById('intervalSelect').value;
|
||
const bigBias = document.getElementById('bigBiasSelect').value;
|
||
const ewoNow = parseFloat(document.getElementById('ewoSlider').value);
|
||
const ewoPrev = parseFloat(document.getElementById('ewoPrevSlider').value);
|
||
const duration = parseInt(document.getElementById('durationSlider').value);
|
||
const macdCross = document.getElementById('macdCheck').checked;
|
||
const aoCross = document.getElementById('aoCheck').checked;
|
||
const kdjCross = document.getElementById('kdjCheck').checked;
|
||
const volExpand = document.getElementById('volCheck').checked;
|
||
|
||
document.getElementById('ewoDisplay').textContent = ewoNow.toFixed(4);
|
||
document.getElementById('ewoPrevDisplay').textContent = ewoPrev.toFixed(4);
|
||
document.getElementById('durationDisplay').textContent = duration;
|
||
|
||
const threshold = EWO_THRESHOLDS[symbol] || 1.0;
|
||
const mult = INTERVAL_MULT[interval] || 1.0;
|
||
|
||
let bull = 0, bear = 0;
|
||
const reasons = [];
|
||
let ewoStrength = 'NONE';
|
||
|
||
// ── EWO(优化版幅度过滤)──
|
||
if (ewoNow > 0 && ewoPrev <= 0) {
|
||
if (Math.abs(ewoNow) >= threshold) {
|
||
bull += 2;
|
||
ewoStrength = 'STRONG';
|
||
reasons.push({ text: `EWO 强力上穿零轴 (${ewoNow.toFixed(4)} ≥ 阈值${threshold}) +2`, type: 'positive' });
|
||
} else {
|
||
bull += 1;
|
||
ewoStrength = 'WEAK';
|
||
reasons.push({ text: `EWO 微弱上穿零轴 (${ewoNow.toFixed(4)} < 阈值${threshold}) +1 ⚠️ 注意假突破`, type: 'warning' });
|
||
}
|
||
// 持续时间奖励
|
||
if (duration >= 20) {
|
||
bull += 1;
|
||
reasons.push({ text: `前空头阶段持续 ${duration} 根K线 ≥ 20,反转可信度高 +1`, type: 'positive' });
|
||
}
|
||
} else if (ewoNow < 0 && ewoPrev >= 0) {
|
||
if (Math.abs(ewoNow) >= threshold) {
|
||
bear += 2; ewoStrength = 'STRONG';
|
||
reasons.push({ text: `EWO 强力下穿零轴 (${Math.abs(ewoNow).toFixed(4)} ≥ 阈值${threshold}) +2`, type: 'negative' });
|
||
} else {
|
||
bear += 1; ewoStrength = 'WEAK';
|
||
reasons.push({ text: `EWO 微弱下穿零轴 ⚠️ +1`, type: 'warning' });
|
||
}
|
||
} else if (ewoNow > 0) {
|
||
bull += 1;
|
||
reasons.push({ text: `EWO 在零轴上方 (${ewoNow.toFixed(4)}) +1`, type: 'positive' });
|
||
} else if (ewoNow < 0) {
|
||
bear += 1;
|
||
reasons.push({ text: `EWO 在零轴下方 (${ewoNow.toFixed(4)}) +1`, type: 'negative' });
|
||
}
|
||
|
||
// ── MACD ──
|
||
if (macdCross) {
|
||
bull += 2;
|
||
reasons.push({ text: 'MACD 金叉 +2', type: 'positive' });
|
||
}
|
||
|
||
// ── AO ──
|
||
if (aoCross) {
|
||
bull += 1;
|
||
reasons.push({ text: 'AO 上穿零轴 +1', type: 'positive' });
|
||
}
|
||
|
||
// ── KDJ ──
|
||
if (kdjCross) {
|
||
bull += 2;
|
||
reasons.push({ text: 'KDJ 低位金叉 +2', type: 'positive' });
|
||
}
|
||
|
||
// ── 放量确认 ──
|
||
if (volExpand && bull > 0) {
|
||
bull += 1;
|
||
reasons.push({ text: '✅ 放量确认多头信号 +1', type: 'positive' });
|
||
}
|
||
|
||
// ── 大周期过滤 ──
|
||
let filtered = false;
|
||
if (bigBias === 'BEARISH' && bull > bear) {
|
||
filtered = true;
|
||
reasons.push({ text: `⚠️ 大周期偏向 BEARISH,多头信号被过滤`, type: 'warning' });
|
||
} else if (bigBias === 'BULLISH' && bear > bull) {
|
||
filtered = true;
|
||
reasons.push({ text: `⚠️ 大周期偏向 BULLISH,空头信号被过滤`, type: 'warning' });
|
||
} else if (bigBias !== 'NEUTRAL' && bull > bear) {
|
||
bull += 1;
|
||
reasons.push({ text: `✅ 大周期 ${bigBias} 对齐,加权 +1`, type: 'positive' });
|
||
}
|
||
|
||
// ── 原版评分(无幅度过滤)──
|
||
let origBull = 0;
|
||
if (ewoNow > 0 && ewoPrev <= 0) origBull += 2;
|
||
else if (ewoNow > 0) origBull += 1;
|
||
if (macdCross) origBull += 2;
|
||
if (aoCross) origBull += 1;
|
||
if (kdjCross) origBull += 2;
|
||
if (volExpand) origBull += 1;
|
||
|
||
// ── 周期自适应阈值 ──
|
||
const activeOpt = [kdjCross ? 1 : 0].reduce((a,b) => a+b, 0);
|
||
const strongThreshold = Math.ceil((5 + activeOpt * 0.5) * mult);
|
||
const moderateThreshold = Math.ceil((3 + activeOpt * 0.3) * mult);
|
||
|
||
let sigType = bull > bear ? 'BUY' : bear > bull ? 'SELL' : 'NEUTRAL';
|
||
let score = Math.max(bull, bear);
|
||
let strength = score >= strongThreshold ? 'STRONG' : score >= moderateThreshold ? 'MODERATE' : 'WEAK';
|
||
if (filtered || sigType === 'NEUTRAL') { sigType = 'NEUTRAL'; strength = 'WEAK'; }
|
||
|
||
// 原版强度(固定阈值 5/3)
|
||
const origStrong = origBull >= 5 ? 'STRONG' : origBull >= 3 ? 'MODERATE' : 'WEAK';
|
||
|
||
const maxScore = 12;
|
||
const bullPct = Math.min(100, (bull / maxScore) * 100);
|
||
const bearPct = Math.min(100, (bear / maxScore) * 100);
|
||
|
||
const typeLabel = { BUY:'买入', SELL:'卖出', NEUTRAL:'中性/过滤' }[sigType];
|
||
const strengthLabel = { STRONG:'强', MODERATE:'中', WEAK:'弱' }[strength];
|
||
const origStrengthLabel = { STRONG:'强', MODERATE:'中', WEAK:'弱' }[origStrong];
|
||
const badgeClass = { BUY:'smb-buy', SELL:'smb-sell', NEUTRAL:'smb-neutral' }[sigType];
|
||
const eqClass = ewoStrength === 'STRONG' ? 'eq-strong' : 'eq-weak';
|
||
|
||
const reasonsHtml = reasons.map(r =>
|
||
`<div class="reason-item ${r.type}">${r.text}</div>`
|
||
).join('');
|
||
|
||
document.getElementById('signalOutput').innerHTML = `
|
||
<div class="signal-row">
|
||
<div class="signal-main-badge ${badgeClass}">${typeLabel} · ${strengthLabel}</div>
|
||
<div>
|
||
<div style="font-size:0.8rem;color:var(--text2);margin-bottom:0.4rem;">EWO 穿越质量</div>
|
||
<span class="ewo-quality ${eqClass}">${ewoStrength === 'STRONG' ? '强力穿越' : ewoStrength === 'WEAK' ? '微弱穿越 ⚠️' : '未穿越'}</span>
|
||
</div>
|
||
<div style="font-size:0.82rem;color:var(--text2);">
|
||
<div>原版评分:<span style="color:var(--gold)">${origBull}</span> → <span style="color:var(--gold)">${origStrengthLabel}</span></div>
|
||
<div>优化版评分:<span style="color:var(--green)">${bull}</span> → <span style="color:var(--green)">${strengthLabel}</span></div>
|
||
<div>强度阈值:STRONG≥<span style="color:var(--gold)">${strongThreshold}</span> MODERATE≥<span style="color:var(--gold)">${moderateThreshold}</span></div>
|
||
</div>
|
||
<div class="score-section">
|
||
<div class="score-row">
|
||
<span class="score-label">多头评分</span>
|
||
<div class="score-track"><div class="score-fill sf-bull" style="width:${bullPct}%"></div></div>
|
||
<span class="score-num">${bull}</span>
|
||
</div>
|
||
<div class="score-row">
|
||
<span class="score-label">空头评分</span>
|
||
<div class="score-track"><div class="score-fill sf-bear" style="width:${bearPct}%"></div></div>
|
||
<span class="score-num">${bear}</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="reasons-list">${reasonsHtml}</div>
|
||
`;
|
||
}
|
||
|
||
// 绑定事件
|
||
['ewoSlider','ewoPrevSlider','durationSlider'].forEach(id =>
|
||
document.getElementById(id).addEventListener('input', calcOptimizedSignal)
|
||
);
|
||
['symbolSelect','intervalSelect','bigBiasSelect','macdCheck','aoCheck','kdjCheck','volCheck'].forEach(id =>
|
||
document.getElementById(id).addEventListener('change', calcOptimizedSignal)
|
||
);
|
||
calcOptimizedSignal();
|
||
|
||
// ============================================================
|
||
// Chart.js 图表
|
||
// ============================================================
|
||
Chart.defaults.color = '#64748b';
|
||
Chart.defaults.borderColor = '#2d3748';
|
||
|
||
// 1. EWO 阈值对比
|
||
new Chart(document.getElementById('ewoThresholdChart'), {
|
||
type: 'bar',
|
||
data: {
|
||
labels: ['BTC', 'ETH', 'SOL', 'DOGE', 'XAUT'],
|
||
datasets: [{
|
||
label: 'EWO 强力穿越阈值(10m)',
|
||
data: [15.0, 5.0, 0.5, 0.001, 3.0],
|
||
backgroundColor: ['#f0b90b88','#1890ff88','#0ecb8188','#a78bfa88','#fb923c88'],
|
||
borderColor: ['#f0b90b','#1890ff','#0ecb81','#a78bfa','#fb923c'],
|
||
borderWidth: 2,
|
||
}]
|
||
},
|
||
options: {
|
||
responsive: true, maintainAspectRatio: false,
|
||
plugins: { legend: { display: false } },
|
||
scales: {
|
||
x: { grid: { color: '#2d3748' } },
|
||
y: {
|
||
grid: { color: '#2d3748' },
|
||
type: 'logarithmic',
|
||
title: { display: true, text: 'EWO 阈值(对数刻度)' }
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
// 2. BTC vs SOL EWO 对比
|
||
new Chart(document.getElementById('ewoCompareChart'), {
|
||
type: 'bar',
|
||
data: {
|
||
labels: ['BTC 穿越前', 'BTC 穿越后', 'SOL 穿越前', 'SOL 穿越后'],
|
||
datasets: [
|
||
{
|
||
label: 'EWO 值',
|
||
data: [-29.048617, 33.320837, -0.037316, 0.006745],
|
||
backgroundColor: ['#f6465d88','#0ecb8188','#f6465d88','#0ecb8188'],
|
||
borderColor: ['#f6465d','#0ecb81','#f6465d','#0ecb81'],
|
||
borderWidth: 2,
|
||
}
|
||
]
|
||
},
|
||
options: {
|
||
responsive: true, maintainAspectRatio: false,
|
||
plugins: {
|
||
legend: { display: false },
|
||
tooltip: {
|
||
callbacks: {
|
||
afterLabel: (ctx) => {
|
||
const labels = ['空头阶段','强力穿越 ✅','空头阶段','微弱穿越 ⚠️'];
|
||
return labels[ctx.dataIndex];
|
||
}
|
||
}
|
||
}
|
||
},
|
||
scales: {
|
||
x: { grid: { color: '#2d3748' } },
|
||
y: { grid: { color: '#2d3748' }, title: { display: true, text: 'EWO 值' } }
|
||
}
|
||
}
|
||
});
|
||
|
||
// 3. 假信号减少预期
|
||
new Chart(document.getElementById('falseSignalChart'), {
|
||
type: 'horizontalBar',
|
||
type: 'bar',
|
||
data: {
|
||
labels: ['EWO幅度过滤','放量确认','周期自适应阈值','EWO持续时间奖励','粘性大周期偏向','MTF三层架构','AI辅助过滤'],
|
||
datasets: [{
|
||
label: '假信号减少 (%)',
|
||
data: [35, 25, 20, 12, 15, 45, 55],
|
||
backgroundColor: '#0ecb8155',
|
||
borderColor: '#0ecb81',
|
||
borderWidth: 1,
|
||
}]
|
||
},
|
||
options: {
|
||
responsive: true, maintainAspectRatio: false,
|
||
indexAxis: 'y',
|
||
plugins: { legend: { display: false } },
|
||
scales: {
|
||
x: { grid: { color: '#2d3748' }, max: 70, title: { display: true, text: '减少比例 (%)' } },
|
||
y: { grid: { color: '#2d3748' } }
|
||
}
|
||
}
|
||
});
|
||
|
||
// 4. 胜率提升预期
|
||
new Chart(document.getElementById('winRateChart'), {
|
||
type: 'bar',
|
||
data: {
|
||
labels: ['EWO幅度过滤','放量确认','周期自适应阈值','EWO持续时间奖励','粘性大周期偏向','MTF三层架构','AI辅助过滤'],
|
||
datasets: [{
|
||
label: '胜率提升 (%)',
|
||
data: [4, 3.5, 2.5, 1.5, 1.5, 6.5, 10],
|
||
backgroundColor: '#f0b90b55',
|
||
borderColor: '#f0b90b',
|
||
borderWidth: 1,
|
||
}]
|
||
},
|
||
options: {
|
||
responsive: true, maintainAspectRatio: false,
|
||
indexAxis: 'y',
|
||
plugins: { legend: { display: false } },
|
||
scales: {
|
||
x: { grid: { color: '#2d3748' }, max: 15, title: { display: true, text: '胜率提升 (%)' } },
|
||
y: { grid: { color: '#2d3748' } }
|
||
}
|
||
}
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|