Files
crypto_monitor/manual_trading_hub/static/index.html
T
dekun 9198aa0dcd Fix strategy checklist hidden class so tabs do not stack.
Generic .hidden was missing display:none, so 执行清单 stayed visible beside 策略正文.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-18 17:32:04 +08:00

1399 lines
79 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN" data-theme="dark">
<head>
<meta charset="utf-8" />
<script src="/assets/theme.js?v=20260604-hub-inst-theme"></script>
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover, interactive-widget=resizes-content" />
<meta name="theme-color" content="#0b0e18" />
<meta name="apple-mobile-web-app-title" content="中控" />
<link rel="icon" href="/assets/icons/favicon.ico" sizes="32x32" />
<link rel="icon" href="/assets/icons/icon.svg" type="image/svg+xml" />
<link rel="apple-touch-icon" href="/assets/icons/apple-touch-icon.png" />
<link rel="manifest" href="/assets/icons/manifest.webmanifest" />
<title>复盘系统中控</title>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Orbitron:wght@500;600;700&display=swap" rel="stylesheet" media="print" onload="this.media='all'" />
<noscript><link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&family=Orbitron:wght@500;600;700&display=swap" rel="stylesheet" /></noscript>
<link rel="stylesheet" href="/assets/app.css?v=20260718-strategy-toc2" />
<link rel="stylesheet" href="/assets/trade_stats_calendar.css?v=4" />
<link rel="stylesheet" href="/assets/account_risk_badge.css?v=4" />
<script src="/assets/account_risk_badge.js?v=4"></script>
<link rel="stylesheet" href="/assets/dashboard.css?v=20260717-dash-kpi-spread" />
</head>
<body>
<div class="app-bg" aria-hidden="true"></div>
<div class="app-shell">
<header class="app-header">
<div class="brand">
<span class="brand-mark" aria-hidden="true"></span>
<div>
<div class="brand-title">复盘系统中控</div>
<div class="brand-sub">MULTI-EXCHANGE · OPS</div>
</div>
</div>
<div class="header-right">
<div class="theme-toggle" role="group" aria-label="界面主题">
<button type="button" class="theme-toggle-btn is-active" data-theme-value="dark" aria-pressed="true" title="暗色主题">
<svg class="theme-icon" viewBox="0 0 24 24" width="18" height="18" aria-hidden="true">
<path fill="currentColor" d="M12.1 3a9 9 0 1 0 8.9 11 6.5 6.5 0 1 1-8.9-11z"/>
</svg>
</button>
<button type="button" class="theme-toggle-btn" data-theme-value="light" aria-pressed="false" title="亮色主题">
<svg class="theme-icon" viewBox="0 0 24 24" width="18" height="18" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round">
<circle cx="12" cy="12" r="4"/>
<path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41"/>
</svg>
</button>
</div>
<span id="sys-status" class="sys-pill" title="系统状态">SYNC</span>
<nav class="top-nav">
<a href="/funds" id="nav-funds">资金概况</a>
<a href="/plan" id="nav-plan">开仓计划</a>
<a href="/monitor" id="nav-monitor">监控区</a>
<a href="/strategy" id="nav-strategy">策略说明</a>
<a href="/help" id="nav-help">使用说明</a>
<a href="/market" id="nav-market">行情区</a>
<a href="/calculator" id="nav-calculator">计算器</a>
<a href="/archive" id="nav-archive">内照明心</a>
<a href="/quotes" id="nav-quotes">语录</a>
<a href="/dashboard" id="nav-dashboard">数据看板</a>
<a href="/ai" id="nav-ai">AI 教练</a>
<a href="/logs" id="nav-logs">系统日志</a>
<a href="/settings" id="nav-settings">系统设置</a>
</nav>
<button type="button" id="btn-logout" class="ghost" title="退出登录">退出</button>
</div>
</header>
<div id="page-plan" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">PLN</span> 开仓计划</h1>
<p class="page-desc">计划录入 · 进行中跟踪 · 历史归档与胜率统计</p>
</div>
<div class="toolbar">
<button type="button" id="plan-btn-refresh" class="primary">刷新</button>
<span id="plan-refresh-status" class="toolbar-meta"></span>
</div>
<div class="plan-layout">
<aside class="plan-left-panel">
<section class="plan-form-section card">
<div class="plan-panel-head">
<h2>新建计划</h2>
</div>
<form id="plan-create-form" class="plan-form">
<div class="plan-form-grid">
<label class="plan-field">
<span>日期</span>
<input id="plan-create-date" type="date" required />
</label>
<label class="plan-field">
<span>交易所</span>
<select id="plan-create-exchange" required></select>
</label>
<label class="plan-field">
<span>币种</span>
<input id="plan-create-symbol" type="text" placeholder="BTC 或 BTC/USDT" required autocomplete="off" />
</label>
<label class="plan-field">
<span>类型</span>
<select id="plan-create-type" required></select>
</label>
<label class="plan-field">
<span>趋势周期</span>
<select id="plan-create-trend-tf" required></select>
</label>
<label class="plan-field">
<span>入场周期</span>
<select id="plan-create-entry-tf" required></select>
</label>
<label class="plan-field plan-field-dir">
<span>方向</span>
<span class="plan-radio-row" id="plan-create-direction"></span>
</label>
<label class="plan-field">
<span>目标位</span>
<input id="plan-create-target" type="text" placeholder="如 68500" />
</label>
<label class="plan-field">
<span>当前区间</span>
<input id="plan-create-range" type="text" placeholder="如 67000-68000" />
</label>
<label class="plan-field plan-field-full">
<span>备注</span>
<textarea id="plan-create-note" rows="2" placeholder="计划说明…"></textarea>
</label>
</div>
<button type="submit" class="primary plan-submit-btn">保存并进入进行中</button>
</form>
</section>
<section class="plan-active-section card">
<div class="plan-panel-head">
<h2>进行中的计划</h2>
<span id="plan-active-count" class="plan-panel-meta"></span>
</div>
<div id="plan-active-list" class="plan-active-list"></div>
</section>
</aside>
<main class="plan-right-panel">
<section class="plan-history-section card">
<div class="plan-panel-head">
<h2>计划历史</h2>
<span id="plan-history-count" class="plan-panel-meta"></span>
</div>
<div id="plan-history-list" class="plan-history-list"></div>
</section>
<section class="plan-stats-section card">
<div class="plan-panel-head">
<h2>数据统计</h2>
<span id="plan-stats-label" class="plan-panel-meta"></span>
</div>
<div class="plan-stats-toolbar">
<div class="plan-period-tabs" id="plan-stats-period-tabs" role="tablist">
<button type="button" class="plan-period-btn is-active" data-period="all">全部</button>
<button type="button" class="plan-period-btn" data-period="week">本周</button>
<button type="button" class="plan-period-btn" data-period="month">本月</button>
<button type="button" class="plan-period-btn" data-period="range">区间</button>
</div>
<span id="plan-stats-range-wrap" class="plan-stats-range hidden">
<input id="plan-stats-date-from" type="date" title="起始日" />
<span class="plan-period-sep"></span>
<input id="plan-stats-date-to" type="date" title="结束日" />
</span>
<div class="plan-dim-tabs" id="plan-stats-dim-tabs" role="tablist">
<button type="button" class="plan-dim-btn is-active" data-dim="symbol">币种</button>
<button type="button" class="plan-dim-btn" data-dim="trend_tf">趋势周期</button>
<button type="button" class="plan-dim-btn" data-dim="entry_scheme">入场方案</button>
</div>
</div>
<div id="plan-stats-table" class="plan-stats-table-wrap"></div>
</section>
</main>
</div>
</div>
<div id="page-monitor" class="page">
<div class="page-head">
<h1><span class="head-tag">MON</span> 监控区</h1>
</div>
<details id="host-status-panel" class="host-status-panel" aria-label="服务器运行状态">
<summary class="host-status-summary">
<span class="host-status-dot ok" id="host-status-dot" aria-hidden="true"></span>
<span class="host-status-summary-title">服务器状态</span>
<span class="host-status-summary-text" id="host-status-summary-text">加载中…</span>
</summary>
<div id="host-status-bar" class="host-status-bar" aria-live="polite">
<div class="host-status-top">
<div class="host-status-head">
<span class="host-status-name" id="host-status-name" title="">服务器</span>
</div>
<div class="host-status-meta">
<span class="host-status-uptime" id="host-status-uptime"></span>
<span class="host-status-updated" id="host-status-updated"></span>
</div>
</div>
<div class="host-status-metrics">
<div class="host-metric-card" id="host-metric-cpu">
<div class="host-metric-head">
<span class="host-metric-label">CPU</span>
<span class="host-metric-val" id="host-cpu-val"></span>
</div>
<div class="host-metric-bar"><span class="host-metric-fill" id="host-cpu-fill"></span></div>
<span class="host-metric-sub" id="host-cpu-sub"></span>
</div>
<div class="host-metric-card" id="host-metric-mem">
<div class="host-metric-head">
<span class="host-metric-label">内存</span>
<span class="host-metric-val" id="host-mem-val"></span>
</div>
<div class="host-metric-bar"><span class="host-metric-fill" id="host-mem-fill"></span></div>
<span class="host-metric-sub" id="host-mem-sub"></span>
</div>
<div class="host-metric-card" id="host-metric-disk">
<div class="host-metric-head">
<span class="host-metric-label">硬盘</span>
<span class="host-metric-val" id="host-disk-val"></span>
</div>
<div class="host-metric-bar"><span class="host-metric-fill" id="host-disk-fill"></span></div>
<span class="host-metric-sub" id="host-disk-sub"></span>
</div>
<div class="host-metric-card host-metric-card-net" id="host-metric-net">
<div class="host-metric-head">
<span class="host-metric-label">网络</span>
<span class="host-metric-val host-metric-val-net" id="host-net-val">实时</span>
</div>
<div class="host-net-lines">
<span class="host-net-line" id="host-net-up">↑ —</span>
<span class="host-net-line" id="host-net-down">↓ —</span>
</div>
</div>
</div>
</details>
<div id="monitor-macro-banner" class="monitor-macro-banner hidden" aria-live="polite">
<div class="monitor-macro-banner-inner">
<span class="monitor-macro-badge">宏观风控</span>
<span id="monitor-macro-banner-text" class="monitor-macro-text"></span>
</div>
</div>
<div id="monitor-alert-summary" class="monitor-alert-summary hidden" aria-live="polite"></div>
<details id="monitor-ops-fold" class="hub-m-fold monitor-ops-fold">
<summary class="hub-m-fold-summary">
<span class="hub-m-fold-title">操作 · 刷新 / 紧急全平</span>
<span id="monitor-updated-summary" class="hub-m-fold-meta"></span>
</summary>
<div class="toolbar">
<button type="button" id="btn-monitor-refresh" class="primary">立即刷新</button>
<label class="chk-label">
<input type="checkbox" id="auto-monitor" checked /> 后台每 5 秒聚合 · SSE 自动更新
</label>
<button type="button" id="btn-close-all" class="danger">全局紧急全平</button>
<span class="toolbar-spacer"></span>
<span id="monitor-updated" class="toolbar-meta"></span>
</div>
</details>
<div id="monitor-grid" class="grid-monitor"></div>
</div>
<div id="page-market" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">MKT</span> 行情区</h1>
</div>
<details id="market-toolbar-fold" class="hub-m-fold market-toolbar-fold">
<summary class="hub-m-fold-summary">
<span class="hub-m-fold-title">选币 · 周期 · 加载</span>
<span id="market-fold-summary" class="hub-m-fold-meta">BTC/USDT · 1d</span>
</summary>
<div class="market-toolbar toolbar">
<label class="market-field">
<span>交易所</span>
<select id="market-exchange"></select>
</label>
<label class="market-field market-field-symbol">
<span>币种</span>
<div class="market-symbol-wrap">
<input id="market-symbol" type="text" value="BTC/USDT" placeholder="BTC/USDT" autocomplete="off" />
<div class="market-scan-tabs" role="tablist" aria-label="成交额与背离筛选">
<button type="button" class="market-scan-tab is-active" data-scan-tab="top20" aria-selected="true">Top20</button>
<button type="button" class="market-scan-tab" data-scan-tab="4h" aria-selected="false">4h背离</button>
<button type="button" class="market-scan-tab" data-scan-tab="1d" aria-selected="false">日线背离</button>
<button type="button" class="market-scan-tab" data-scan-tab="1w" aria-selected="false">周线背离</button>
</div>
</div>
</label>
<label class="market-field">
<span>周期</span>
<select id="market-timeframe">
<option value="1m">1m</option>
<option value="5m">5m</option>
<option value="15m">15m</option>
<option value="1h">1h</option>
<option value="2h">2h</option>
<option value="4h">4h</option>
<option value="1d" selected>1d</option>
<option value="1w">1w</option>
</select>
</label>
<button type="button" id="market-load" class="primary">加载</button>
<button type="button" id="market-refresh" class="ghost" title="清空该币种本周期 K 线缓存并从交易所重新拉取">清库重拉</button>
<span class="toolbar-spacer"></span>
<span id="market-bar-countdown" class="toolbar-meta market-countdown"></span>
<span id="market-updated" class="toolbar-meta"></span>
</div>
</details>
<div id="market-vol-rank-anchor" class="market-vol-rank-anchor">
<div id="market-vol-rank-sheet" class="market-vol-rank-sheet hidden" aria-hidden="true">
<div id="market-vol-rank-meta" class="market-vol-rank-meta">加载中…</div>
<ol id="market-vol-rank-list" class="market-vol-rank-list"></ol>
</div>
</div>
<p id="market-status" class="market-status"></p>
<div id="market-chart-wrap" class="market-chart-wrap">
<div class="market-ohlcv-bar" aria-label="K线详情">
<div class="market-ohlcv-title">
<span id="mkt-exchange-label" class="mkt-exchange-tag"></span>
<span id="mkt-symbol-label"></span>
<span id="mkt-tf-label">1d</span>
<div class="market-chart-actions">
<label class="market-day-split-opt" title="上一交易日收盘价水平线(北京切日)">
<input type="checkbox" id="market-prev-close-line" /> 昨日收盘价
</label>
<label class="market-day-split-opt" title="上一交易日最高/最低价水平线(北京切日)">
<input type="checkbox" id="market-prev-hl-lines" /> 昨日高低点
</label>
<label class="market-day-split-opt" title="北京时间 8:00 交易切日竖线">
<input type="checkbox" id="market-day-split" /> 交易间隔日
</label>
<details class="market-ind-menu">
<summary>技术指标</summary>
<div class="market-ind-options">
<label class="market-ind-opt"><input type="checkbox" id="market-ind-ema" value="ema" /> EMA交叉(21/55)</label>
<label class="market-ind-opt"><input type="checkbox" id="market-ind-ema144" value="ema144" /> EMA144</label>
<label class="market-ind-opt"><input type="checkbox" id="market-ind-macd" value="macd" /> MACD</label>
<label class="market-ind-opt"><input type="checkbox" id="market-ind-rsi" value="rsi" /> RSI</label>
</div>
</details>
<button type="button" id="market-chart-fullscreen" class="ghost market-fs-btn" title="K线全屏(按 F)">全屏</button>
</div>
</div>
<div class="market-ohlcv-row">
<span class="ohlcv-item"><span class="k"></span><span id="mkt-o"></span></span>
<span class="ohlcv-item"><span class="k"></span><span id="mkt-h"></span></span>
<span class="ohlcv-item"><span class="k"></span><span id="mkt-l"></span></span>
<span class="ohlcv-item"><span class="k"></span><span id="mkt-c"></span></span>
<span class="ohlcv-item market-vol"><span class="k"></span><span id="mkt-v"></span></span>
<span class="ohlcv-item"><span class="k">振幅</span><span id="mkt-amp"></span></span>
</div>
<div id="market-div-legend" class="market-div-legend hidden" aria-live="polite"></div>
<div id="market-fs-toolbar" class="market-fs-toolbar hidden" aria-label="全屏行情控制">
<label class="market-field market-fs-field">
<span>交易所</span>
<select id="market-fs-exchange"></select>
</label>
<label class="market-field market-fs-field market-field-symbol">
<span>币种</span>
<div class="market-symbol-wrap">
<input id="market-fs-symbol" type="text" placeholder="BTC/USDT" autocomplete="off" />
<div class="market-scan-tabs" role="tablist" aria-label="成交额与背离筛选">
<button type="button" class="market-scan-tab is-active" data-scan-tab="top20" aria-selected="true">Top20</button>
<button type="button" class="market-scan-tab" data-scan-tab="4h" aria-selected="false">4h背离</button>
<button type="button" class="market-scan-tab" data-scan-tab="1d" aria-selected="false">日线背离</button>
<button type="button" class="market-scan-tab" data-scan-tab="1w" aria-selected="false">周线背离</button>
</div>
</div>
</label>
<label class="market-field market-fs-field">
<span>周期</span>
<select id="market-fs-timeframe">
<option value="1m">1m</option>
<option value="5m">5m</option>
<option value="15m">15m</option>
<option value="1h">1h</option>
<option value="2h">2h</option>
<option value="4h">4h</option>
<option value="1d">1d</option>
<option value="1w">1w</option>
</select>
</label>
<button type="button" id="market-fs-load" class="primary">加载</button>
</div>
</div>
<div id="market-vol-rank-anchor-fs" class="market-vol-rank-anchor-fs" aria-hidden="true"></div>
<div id="market-pos-panel" class="market-pos-panel hidden" aria-label="持仓标记">
<div class="market-pos-row">
<span id="mkt-pos-side" class="market-pos-side"></span>
<span class="ohlcv-item"><span class="k">入场</span><span id="mkt-pos-entry"></span></span>
<span class="ohlcv-item"><span class="k">止损</span><span id="mkt-pos-sl"></span></span>
<span class="ohlcv-item"><span class="k">止盈</span><span id="mkt-pos-tp"></span></span>
<span class="ohlcv-item"><span class="k">张数</span><span id="mkt-pos-size"></span></span>
<span class="ohlcv-item"><span class="k">浮盈亏</span><span id="mkt-pos-pnl" class="market-pos-pnl"></span></span>
<button type="button" id="market-pos-clear" class="ghost market-pos-clear" title="清除 K 线上的持仓价格线">清除标记</button>
</div>
<div id="market-pos-orders" class="market-pos-orders"></div>
</div>
<div class="market-chart-body">
<aside id="market-draw-toolbar" class="market-draw-toolbar" aria-label="画线工具">
<button type="button" class="market-draw-btn is-active" data-tool="cursor" title="光标(点击选中,右键管理,Del 删除)">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M4 4l7 16 2.5-5.5L20 12z"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="hline" title="水平线">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" d="M4 12h16"/><circle cx="12" cy="12" r="2" fill="currentColor"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="rect" title="矩形">
<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="5" y="7" width="14" height="10" fill="none" stroke="currentColor" stroke-width="1.6"/><circle cx="5" cy="7" r="1.3" fill="currentColor"/><circle cx="19" cy="17" r="1.3" fill="currentColor"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="brush" title="画笔">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M4 18l8-2 2-8 6-2-2 6-8 2z"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="range" title="价格测距(按住拖动)">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.6" d="M12 5v14M8 8h8M8 16h8"/><path fill="currentColor" d="M11 4h2v3h-2zm0 13h2v3h-2z"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="fib" title="斐波那契(按住拖动)">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.4" d="M4 6h16M4 10h16M4 14h16M4 18h16"/><circle cx="20" cy="6" r="1.2" fill="currentColor"/><circle cx="20" cy="18" r="1.2" fill="currentColor"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="trend" title="趋势线(按住拖动)">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" d="M5 18L19 6"/><circle cx="5" cy="18" r="1.5" fill="currentColor"/><circle cx="19" cy="6" r="1.5" fill="currentColor"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="path" title="折线(连续点击,双击/右键/回车结束)">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.6" d="M5 16L10 12L14 15L19 7"/><path fill="currentColor" d="M17 5l3 3-3 1z"/></svg>
</button>
<span class="market-draw-sep" aria-hidden="true"></span>
<button type="button" class="market-draw-btn" data-tool="erase" title="删除选中">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="currentColor" d="M9 3h6l1 2h4v2H4V5h4zm1 6h2v9h-2zm4 0h2v9h-2zM7 7h10l-1 14H8z"/></svg>
</button>
<button type="button" class="market-draw-btn" data-tool="clear" title="清除全部画线">
<svg viewBox="0 0 24 24" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" d="M6 6l12 12M18 6L6 18"/></svg>
</button>
</aside>
<div class="market-chart-main">
<button type="button" id="market-chart-fs-exit" class="ghost market-fs-exit hidden" title="退出全屏 (Esc)">退出全屏</button>
<div id="market-exchange-badge" class="market-exchange-badge" aria-hidden="true"></div>
<div id="market-chart" class="market-chart-host"></div>
<canvas id="market-draw-canvas" class="market-draw-canvas" aria-hidden="true"></canvas>
<div id="market-price-tag" class="market-price-tag hidden" aria-hidden="true">
<div class="market-price-tag-head">
<span class="market-price-tag-label">现价</span>
<span id="market-price-tag-value" class="market-price-tag-value"></span>
</div>
<div id="market-price-tag-time" class="market-price-tag-time"></div>
</div>
<button type="button" id="market-price-auto" class="market-price-auto is-on" title="开启:价格轴与视口随刷新自动调整;关闭:后台静默更新,保留当前缩放">自动</button>
</div>
</div>
</div>
</div>
<div id="page-archive" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">IN</span> 内照明心</h1>
<p class="page-desc">交易记录 · 交易日历 · 图表概览 · 复盘语录</p>
</div>
<div class="archive-toolbar toolbar">
<label class="chk-label archive-toolbar-desktop"><input type="checkbox" id="archive-filter-profit" /> 盈利单</label>
<label class="chk-label archive-toolbar-desktop"><input type="checkbox" id="archive-filter-loss" /> 亏损单</label>
<label class="chk-label archive-toolbar-desktop"><input type="checkbox" id="archive-filter-sick" /> 犯病</label>
<div class="archive-period-bar archive-field">
<span>日期</span>
<div class="archive-period-tabs" id="archive-period-tabs" role="tablist">
<button type="button" class="archive-period-btn is-active" data-period="today">本日</button>
<button type="button" class="archive-period-btn" data-period="week">本周</button>
<button type="button" class="archive-period-btn" data-period="month">本月</button>
<button type="button" class="archive-period-btn" data-period="range">区间</button>
</div>
<input id="archive-trading-day" type="date" class="archive-period-day-input" title="本日交易日" />
<span id="archive-period-range-wrap" class="archive-period-range hidden">
<input id="archive-date-from" type="date" title="起始日" />
<span class="archive-period-sep"></span>
<input id="archive-date-to" type="date" title="结束日" />
</span>
</div>
<button type="button" id="archive-btn-chart-toggle" class="ghost archive-toolbar-desktop">图表</button>
<label class="archive-field archive-search-field archive-toolbar-desktop">
<span>搜索</span>
<input id="archive-search" type="search" placeholder="合约 / 交易所 / 备注" autocomplete="off" />
</label>
<label class="archive-field archive-toolbar-desktop">
<span>交易所</span>
<select id="archive-exchange"><option value="">全部</option></select>
</label>
<button type="button" id="archive-btn-refresh" class="primary">刷新</button>
<button type="button" id="archive-btn-sync" class="ghost">同步</button>
<span id="archive-status" class="toolbar-meta"></span>
</div>
<section class="archive-stats-card card">
<div class="archive-stats-card-head">
<h2>统计分析</h2>
</div>
<div id="archive-stats" class="archive-stats-bar"></div>
</section>
<div class="archive-layout">
<div class="archive-content-tabs" id="archive-content-tabs" role="tablist" aria-label="内照明心分区">
<button type="button" class="archive-content-tab is-active" role="tab" aria-selected="true" data-archive-tab="trades" id="archive-tab-trades">交易记录</button>
<button type="button" class="archive-content-tab" role="tab" aria-selected="false" data-archive-tab="calendar" id="archive-tab-calendar">交易日历</button>
<button type="button" class="archive-content-tab" role="tab" aria-selected="false" data-archive-tab="viz" id="archive-tab-viz">图表概览</button>
<button type="button" class="archive-content-tab" role="tab" aria-selected="false" data-archive-tab="quotes" id="archive-tab-quotes">复盘语录</button>
</div>
<main class="archive-main-panel archive-tab-panel is-active" id="archive-panel-trades" role="tabpanel" aria-labelledby="archive-tab-trades">
<div id="archive-chart-section" class="archive-acc-section archive-chart-section" hidden>
<div class="archive-chart-toolbar toolbar">
<div class="archive-tf-tabs" id="archive-tf-tabs" role="tablist">
<button type="button" class="archive-tf-btn" data-tf="5m">5m</button>
<button type="button" class="archive-tf-btn is-active" data-tf="15m">15m</button>
<button type="button" class="archive-tf-btn" data-tf="1h">1h</button>
<button type="button" class="archive-tf-btn" data-tf="4h">4h</button>
</div>
<label class="archive-field">
<span>视窗</span>
<select id="archive-view-mode">
<option value="hold">持仓过程(锚平仓)</option>
<option value="entry">进场决策(锚开仓)</option>
</select>
</label>
<label class="archive-field">
<span>跳转时间</span>
<input id="archive-jump-at" type="text" placeholder="2026-06-07 14:30" autocomplete="off" />
</label>
<button type="button" id="archive-btn-jump" class="ghost">跳转</button>
<button type="button" id="archive-btn-reload-chart" class="primary">重载图表</button>
<button type="button" id="archive-btn-chart-close" class="ghost">关闭图表</button>
</div>
<div class="archive-chart-wrap">
<div id="archive-chart" class="archive-chart-host"></div>
<button type="button" id="archive-mark-auto" class="archive-mark-auto is-on" title="开启:该币种全部交易均标注开/平;关闭:仅当前选中一笔">自动</button>
</div>
<div class="archive-chart-title-row">
<span id="archive-chart-title" class="archive-acc-sub"></span>
</div>
</div>
<div id="archive-trades-section" class="archive-acc-section archive-trades-section">
<div class="archive-panel-head">
<h2>交易记录</h2>
</div>
<div id="archive-trades" class="archive-trades"></div>
<div class="archive-trades-pager" id="archive-trades-pager" hidden>
<button type="button" class="ghost" id="archive-trades-prev">上一页</button>
<span class="muted" id="archive-trades-page-label">第 1 / 1 页</span>
<button type="button" class="ghost" id="archive-trades-next">下一页</button>
</div>
</div>
</main>
<section class="archive-calendar-panel archive-tab-panel" id="archive-panel-calendar" role="tabpanel" aria-labelledby="archive-tab-calendar" hidden>
<div class="archive-panel-head">
<h2>交易日历</h2>
<span id="archive-cal-summary-sub" class="archive-panel-meta"></span>
</div>
<div id="archive-calendar-wrap" class="trade-cal-wrap">
<div class="trade-cal-head">
<button type="button" id="archive-cal-prev" class="ghost" title="上一月"></button>
<span id="archive-cal-title" class="trade-cal-title"></span>
<button type="button" id="archive-cal-next" class="ghost" title="下一月"></button>
</div>
<div id="archive-calendar" class="trade-cal-grid-host" role="grid" aria-label="交易日历"></div>
</div>
<div class="archive-calendar-day-trades" id="archive-calendar-day-trades">
<div class="archive-panel-head">
<h3>当日交易</h3>
<span id="archive-calendar-day-trades-meta" class="archive-panel-meta"></span>
</div>
<div id="archive-calendar-day-trades-body" class="archive-calendar-day-trades-body">
<p class="archive-empty">点击日历中的日期,在下方查看当日交易记录.</p>
</div>
</div>
</section>
<section class="archive-viz-panel archive-tab-panel" id="archive-panel-viz" role="tabpanel" aria-labelledby="archive-tab-viz" hidden>
<div class="archive-panel-head">
<h2>图表概览</h2>
<span id="archive-stats-viz-sub" class="archive-panel-meta"></span>
</div>
<div id="archive-stats-charts" class="archive-stats-charts"></div>
</section>
<aside class="archive-quotes-panel archive-tab-panel" id="archive-panel-quotes" role="tabpanel" aria-labelledby="archive-tab-quotes" hidden>
<div class="archive-panel-head">
<h2>复盘语录</h2>
<span id="archive-quotes-count" class="archive-panel-meta"></span>
</div>
<form id="archive-quote-form" class="archive-quote-form">
<input id="archive-quote-date" type="date" required />
<textarea id="archive-quote-content" rows="5" placeholder="今日复盘心得…" required></textarea>
<button type="submit" id="archive-quote-submit" class="primary">添加语录</button>
</form>
<div class="archive-quote-day-trades" id="archive-quote-day-trades">
<div class="archive-quote-day-trades-head">
<h3>当日已平仓</h3>
<span id="archive-quote-day-trades-meta" class="archive-panel-meta"></span>
</div>
<div id="archive-quote-day-trades-body" class="archive-quote-day-trades-body">
<p class="archive-empty">选择日期后自动带上该日已平仓记录.</p>
</div>
</div>
<div id="archive-quotes-list" class="archive-quotes-list"></div>
</aside>
</div>
</div>
<div id="page-quotes" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">QT</span> 语录</h1>
<p class="page-desc">复盘语录博客流 · 按交易日分组 · 可展开全文</p>
</div>
<div class="quotes-toolbar toolbar">
<button type="button" id="quotes-btn-refresh" class="primary">刷新</button>
<a href="/archive" class="ghost quotes-link-archive" id="quotes-link-archive">去内照明心写语录</a>
<span id="quotes-status" class="toolbar-meta"></span>
</div>
<div id="quotes-feed" class="quotes-feed" aria-live="polite"></div>
</div>
<div id="page-dashboard" class="page hidden">
<div class="dash-bg-grid" aria-hidden="true"></div>
<div class="dash-wrap">
<div class="dash-head">
<div>
<h1><span class="dash-head-tag">DASH</span>数据看板</h1>
<p class="page-desc">三户当日总览 · 有仓持仓表 · 平仓流水 · SSE 推送更新</p>
</div>
<div class="dash-head-meta">
<div><span class="dash-pulse-dot" aria-hidden="true"></span><strong>LIVE</strong> · 交易日 <span id="dash-trading-day"></span></div>
<div>更新 <span id="dash-updated-at"></span></div>
<button type="button" id="dash-btn-refresh" class="ghost" style="margin-top:8px">立即刷新</button>
</div>
</div>
<div id="dash-alert-banner" class="dash-alert-banner" role="alert">
<strong>⚠ 风险预警</strong>
<span id="dash-alert-banner-text"></span>
</div>
<div id="dash-kpi-row" class="dash-kpi-row"></div>
<section class="dash-section">
<div class="dash-section-head">持仓明细 · POSITIONS</div>
<div class="dash-section-body"><div id="dash-accounts" class="dash-ac-grid"></div></div>
</section>
<section class="dash-section">
<div class="dash-section-head">平仓明细 · CLOSED TRADES</div>
<div class="dash-section-body" id="dash-trades-body"></div>
</section>
<p id="dash-status" class="dash-status"></p>
</div>
</div>
<div id="instance-frame-shell" class="instance-frame-shell hidden" aria-hidden="true">
<div class="instance-frame-toolbar">
<button type="button" id="instance-frame-back" class="ghost">← 返回监控</button>
<span id="instance-frame-title" class="instance-frame-title"></span>
<div class="instance-frame-actions">
<button type="button" id="instance-frame-refresh" class="ghost">刷新</button>
<button type="button" id="instance-frame-newtab" class="ghost">新标签打开</button>
</div>
</div>
<div id="instance-frame-loading" class="instance-frame-loading" aria-hidden="true">
<div class="instance-frame-loading-inner">
<span class="instance-frame-spinner" aria-hidden="true"></span>
<span>加载中…</span>
</div>
</div>
<iframe id="instance-frame" class="instance-frame" title="交易所实例"></iframe>
</div>
<div id="exchange-fullscreen" class="exchange-fullscreen hidden" aria-hidden="true">
<button type="button" id="exchange-fullscreen-backdrop" class="exchange-fullscreen-backdrop" aria-label="关闭全屏"></button>
<div class="exchange-fullscreen-panel">
<div id="exchange-fullscreen-inner"></div>
</div>
</div>
<div id="page-funds" class="page hidden">
<div class="funds-stage">
<div class="funds-stage-grid" aria-hidden="true"></div>
<div class="funds-stage-glow" aria-hidden="true"></div>
<div class="funds-stage-inner">
<div class="page-head funds-head">
<div class="funds-head-main">
<h1><span class="head-tag funds-tag">CAP</span> 资金概况</h1>
<details class="funds-desc-fold">
<summary class="funds-desc-toggle">统计说明</summary>
<p id="funds-desc-body" class="page-desc funds-desc">加载配置中…</p>
</details>
</div>
<div class="funds-live-pill" aria-hidden="true">
<span class="funds-live-dot"></span>
<span>EQUITY FEED</span>
</div>
</div>
<div class="funds-toolbar toolbar">
<button type="button" id="funds-btn-refresh" class="primary funds-btn-refresh">同步快照</button>
<span id="funds-status" class="toolbar-meta funds-status"></span>
</div>
<section class="funds-summary">
<div class="funds-stat-card funds-stat-card-primary">
<div class="funds-stat-label">总资金 · TOTAL</div>
<div id="funds-total-usdt" class="funds-stat-value"></div>
</div>
<div class="funds-stat-card funds-stat-card-pnl">
<div class="funds-stat-label">累计盈亏 · SINCE START</div>
<div id="funds-total-period" class="funds-stat-val"></div>
<div id="funds-total-period-sub" class="funds-stat-sub">相对统计起点</div>
</div>
<div class="funds-stat-card">
<div class="funds-stat-label">较昨日 · Δ24H</div>
<div id="funds-total-delta" class="funds-stat-val"></div>
</div>
<div class="funds-stat-card">
<div class="funds-stat-label">最大回撤 · MDD</div>
<div class="funds-stat-value"><span id="funds-total-dd-u"></span> <small id="funds-total-dd-pct" class="funds-dd-pct"></small></div>
</div>
</section>
<p id="funds-meta" class="funds-meta"></p>
<div class="funds-chart-panel">
<div class="funds-chart-head">
<span class="funds-chart-tag">EQUITY CURVE</span>
<span id="funds-chart-sub" class="funds-chart-sub">— TRADING DAYS</span>
</div>
<div id="funds-chart-total" class="funds-chart-host"></div>
</div>
<div class="funds-section-head">
<h2 class="funds-section-title"><span class="funds-section-mark">//</span> 分户资金</h2>
<p class="funds-section-hint">点击卡片放大查看资金曲线与回撤</p>
</div>
<div id="funds-accounts" class="funds-accounts"></div>
</div>
</div>
</div>
<div id="funds-fullscreen" class="funds-fullscreen hidden" aria-hidden="true">
<button type="button" id="funds-fs-backdrop" class="funds-fs-backdrop" aria-label="关闭全屏"></button>
<div class="funds-fs-panel">
<div class="funds-fs-head">
<div>
<h2 id="funds-fs-title" class="funds-fs-title"></h2>
<p id="funds-fs-sub" class="funds-fs-sub"></p>
</div>
<button type="button" id="funds-fs-close" class="ghost">关闭</button>
</div>
<section class="funds-fs-summary">
<div class="funds-fs-stat"><span class="k">总资金</span><span id="funds-fs-total" class="v"></span></div>
<div class="funds-fs-stat"><span class="k">资金户</span><span id="funds-fs-funding" class="v"></span></div>
<div class="funds-fs-stat"><span class="k">交易户</span><span id="funds-fs-trading" class="v"></span></div>
<div class="funds-fs-stat"><span class="k">较昨日</span><span id="funds-fs-delta" class="v"></span></div>
<div class="funds-fs-stat"><span class="k">最大回撤</span><span id="funds-fs-dd" class="v"></span></div>
</section>
<div id="funds-fs-chart" class="funds-fs-chart-host"></div>
</div>
</div>
<div id="page-ai" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">AI</span> 教练</h1>
<p class="page-desc">交易教练 / 普通聊天 / 交易监管 · 右侧可回看历史会话</p>
</div>
<div class="ai-mobile-tabs" role="tablist" aria-label="AI 教练视图">
<button type="button" class="ai-mobile-tab is-active" data-ai-tab="trading" role="tab" aria-selected="true">交易教练</button>
<button type="button" class="ai-mobile-tab" data-ai-tab="general" role="tab" aria-selected="false">普通聊天</button>
<button type="button" class="ai-mobile-tab" data-ai-tab="supervisor" role="tab" aria-selected="false">交易监管</button>
<button type="button" class="ai-mobile-tab" data-ai-tab="history" role="tab" aria-selected="false">历史</button>
<button type="button" class="ai-mobile-tab ai-mobile-tab-action" data-ai-tab="new" role="tab" aria-selected="false" title="新开对话">新开</button>
</div>
<div class="ai-layout" data-ai-mobile-tab="trading">
<section class="ai-panel ai-chat-panel" data-ai-panel="chat">
<div class="ai-chat-topbar">
<div class="ai-bot-bar" role="tablist" aria-label="聊天机器人">
<button type="button" class="ai-bot-tab is-active" data-bot="trading" role="tab" aria-selected="true">交易教练</button>
<button type="button" class="ai-bot-tab" data-bot="general" role="tab" aria-selected="false">普通聊天</button>
<button type="button" class="ai-bot-tab" data-bot="supervisor" role="tab" aria-selected="false">交易监管</button>
</div>
<button type="button" id="btn-ai-chat-new" class="primary ai-chat-new-btn">新开对话</button>
</div>
<div class="ai-chat-split">
<div class="ai-chat-main">
<div class="ai-panel-head ai-chat-session-head">
<h2 id="ai-chat-title">聊天</h2>
</div>
<div id="ai-chat-messages" class="ai-panel-scroll ai-chat-messages" aria-live="polite"></div>
<form id="ai-chat-form" class="ai-chat-form">
<div class="ai-chat-compose">
<textarea id="ai-chat-input" rows="2" placeholder="聊聊行情,心态,纪律,执行…;可直接 Ctrl+V 粘贴截图" autocomplete="off"></textarea>
<div id="ai-chat-pending" class="ai-chat-pending-list" aria-live="polite"></div>
<div class="ai-chat-compose-actions">
<label class="ai-chat-upload-btn" title="上传图片或 txt/md/json 文档">
<input type="file" id="ai-chat-files" accept="image/*,.txt,.md,.markdown,.json" multiple hidden />
附件
</label>
<button type="submit" id="btn-ai-chat-send" class="primary">发送</button>
</div>
</div>
</form>
</div>
<aside class="ai-chat-history-panel" aria-label="聊天历史">
<div class="ai-chat-history-head">
<h3>聊天历史</h3>
</div>
<div id="ai-chat-history-list" class="ai-panel-scroll ai-chat-history-list" role="list"></div>
</aside>
</div>
</section>
</div>
</div>
<div id="page-calculator" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">CAL</span> 策略计算器</h1>
<p class="page-desc">历史行情测算 · 以损定仓 · 价格均为手动输入</p>
</div>
<div class="toolbar">
<button type="button" id="calc-btn-refresh" class="primary">刷新</button>
<span id="calc-refresh-status" class="toolbar-meta"></span>
</div>
<div class="calc-workspace">
<div class="calc-mobile-tabs" role="tablist" aria-label="计算器切换">
<button type="button" class="calc-m-tab is-active" data-calc-tab="trend" role="tab" aria-selected="true">
<span class="calc-tab-label-mobile">趋势回调</span><span class="calc-tab-label-desktop">趋势回调计算器</span>
</button>
<button type="button" class="calc-m-tab" data-calc-tab="roll" role="tab" aria-selected="false">
<span class="calc-tab-label-mobile">滚仓</span><span class="calc-tab-label-desktop">滚仓计算器</span>
</button>
</div>
<div class="calc-layout" data-calc-tab="trend">
<section class="calc-card card" data-calc-pane="trend">
<h2>趋势回调计算器</h2>
<p class="calc-hint">逻辑与实例策略页一致:首仓 50% + 补仓网格;止损金额 = 资金 × 风险%.</p>
<form id="calc-trend-form" class="calc-form">
<div class="calc-form-grid">
<label class="calc-field">
<span>交易所</span>
<select id="calc-trend-exchange" required></select>
</label>
<label class="calc-field">
<span>币种</span>
<input id="calc-trend-base" type="text" value="ETH" placeholder="如 ETH" required autocomplete="off" />
</label>
<div class="calc-field calc-field-span2">
<div id="calc-trend-market-info" class="calc-market-info">ETH/USDT · 加载合约信息…</div>
</div>
<label class="calc-field">
<span>交易资金 (U)</span>
<input id="calc-trend-capital" type="number" min="0.01" step="any" value="1000" required />
</label>
<label class="calc-field">
<span>风险 %</span>
<input id="calc-trend-risk" type="number" min="0.1" step="0.1" value="5" required />
</label>
<label class="calc-field">
<span>杠杆</span>
<input id="calc-trend-leverage" type="number" min="1" step="1" value="5" required />
</label>
<label class="calc-field">
<span>方向</span>
<select id="calc-trend-direction">
<option value="long">做多</option>
<option value="short">做空</option>
</select>
</label>
<label class="calc-field">
<span>首仓入场价</span>
<input id="calc-trend-entry" type="number" min="0" step="any" placeholder="手动输入" required />
</label>
<label class="calc-field">
<span>止损价</span>
<input id="calc-trend-sl" type="number" min="0" step="any" required />
</label>
<label class="calc-field">
<span id="calc-trend-add-label">补仓上沿价</span>
<input id="calc-trend-add-upper" type="number" min="0" step="any" required />
</label>
<label class="calc-field">
<span>止盈价</span>
<input id="calc-trend-tp" type="number" min="0" step="any" required />
</label>
<label class="calc-field">
<span>补仓档数</span>
<input id="calc-trend-dca-legs" type="number" min="1" max="20" step="1" value="5" />
</label>
</div>
<div class="calc-actions">
<button type="submit" class="primary">计算</button>
</div>
</form>
<div id="calc-trend-result" class="calc-result hidden"></div>
</section>
<section class="calc-card card" data-calc-pane="roll">
<h2>滚仓计算器</h2>
<p class="calc-hint">首仓按「单次风险」以损定仓;每次滚仓后合并持仓打到新止损 ≈ 单次风险;止盈锁定首仓价不变.最多 3 次滚仓.</p>
<form id="calc-roll-form" class="calc-form">
<div class="calc-form-grid">
<label class="calc-field">
<span>交易所</span>
<select id="calc-roll-exchange" required></select>
</label>
<label class="calc-field">
<span>币种</span>
<input id="calc-roll-base" type="text" value="ETH" placeholder="如 ETH" required autocomplete="off" />
</label>
<div class="calc-field calc-field-span2">
<div id="calc-roll-market-info" class="calc-market-info">ETH/USDT · 加载合约信息…</div>
</div>
<label class="calc-field">
<span>交易资金 (U)</span>
<input id="calc-roll-capital" type="number" min="0.01" step="any" value="1000" required />
</label>
<label class="calc-field">
<span>单次风险 %</span>
<input id="calc-roll-risk" type="number" min="0.1" step="0.1" value="5" required />
</label>
<label class="calc-field">
<span>方向</span>
<select id="calc-roll-direction">
<option value="long">做多</option>
<option value="short">做空</option>
</select>
</label>
<label class="calc-field">
<span>首仓入场价</span>
<input id="calc-roll-entry" type="number" min="0" step="any" placeholder="手动输入" required />
</label>
<label class="calc-field">
<span>首仓止损价</span>
<input id="calc-roll-sl" type="number" min="0" step="any" required />
</label>
<label class="calc-field">
<span>止盈价(锁定)</span>
<input id="calc-roll-tp" type="number" min="0" step="any" required />
</label>
<label class="calc-field">
<span>已完成滚仓次数</span>
<input id="calc-roll-legs-done" type="number" min="0" max="3" step="1" value="0" />
</label>
</div>
<div class="calc-roll-legs-head">
<strong>滚仓加仓(最多 3 次)</strong>
<button type="button" id="calc-roll-add-leg" class="ghost">+ 添加滚仓</button>
</div>
<div id="calc-roll-legs-list" class="calc-roll-legs-list"></div>
<div class="calc-actions">
<button type="submit" class="primary">计算</button>
</div>
</form>
<div id="calc-roll-result" class="calc-result hidden"></div>
</section>
</div>
</div>
</div>
<div id="page-strategy" class="page hidden">
<div class="page-head strategy-page-head">
<div>
<h1><span class="head-tag">STR</span> 策略说明</h1>
<p class="page-desc">策略正文(带目录) · 执行清单(打印对照) · 三所切换</p>
</div>
<div class="strategy-page-actions no-print">
<button type="button" id="strategy-btn-download" class="ghost">下载 HTML</button>
<button type="button" id="strategy-btn-print-doc" class="ghost">打印正文</button>
<button type="button" id="strategy-btn-print-checklist" class="primary">打印清单</button>
</div>
</div>
<div class="strategy-toolbar no-print">
<div id="strategy-tabs" class="strategy-tabs" role="tablist" aria-label="交易所策略"></div>
<div id="strategy-view-tabs" class="strategy-view-tabs" role="tablist" aria-label="策略视图">
<button type="button" class="strategy-view-tab is-active" data-view="doc" role="tab" aria-selected="true">策略正文</button>
<button type="button" class="strategy-view-tab" data-view="checklist" role="tab" aria-selected="false">执行清单</button>
</div>
<span id="strategy-load-status" class="toolbar-meta"></span>
</div>
<div id="strategy-print-root" class="strategy-print-root">
<section id="strategy-panel-doc" class="card strategy-doc-panel" data-strategy-view="doc">
<div class="strategy-blog-layout">
<div class="strategy-blog-main">
<div class="strategy-col-head">
<h3 class="strategy-col-title">策略正文</h3>
</div>
<div id="strategy-doc-body" class="strategy-doc-body prose"></div>
<p id="strategy-doc-source" class="strategy-doc-source"></p>
</div>
<aside class="strategy-blog-toc card strategy-toc-card no-print">
<h3 class="strategy-toc-title">目录</h3>
<nav id="strategy-doc-toc" class="strategy-toc-nav" aria-label="策略目录"></nav>
</aside>
</div>
</section>
<section id="strategy-panel-checklist" class="card strategy-checklist-card hidden" data-strategy-view="checklist">
<div class="strategy-col-head">
<h3 id="strategy-checklist-title" class="strategy-col-title">开仓检查清单</h3>
<button type="button" id="strategy-btn-print-checklist-inline" class="ghost strategy-col-print">打印</button>
</div>
<div id="strategy-checklist-body" class="strategy-checklist-body"></div>
<ul id="strategy-checklist-footnotes" class="strategy-checklist-footnotes"></ul>
</section>
</div>
</div>
<div id="page-help" class="page hidden">
<div class="page-head">
<div>
<h1><span class="head-tag">HLP</span> 使用说明</h1>
<p class="page-desc">中控与实例 · 日常操作指南(不含部署说明)</p>
</div>
</div>
<div class="help-toolbar">
<span id="help-load-status" class="toolbar-meta"></span>
</div>
<div class="help-layout">
<aside class="card help-toc-card">
<h3 class="help-toc-title">目录</h3>
<nav id="help-toc-nav" class="help-toc-nav" aria-label="使用说明目录"></nav>
</aside>
<section class="card help-doc-card">
<div id="help-doc-body" class="strategy-doc-body prose"></div>
<p id="help-doc-source" class="strategy-doc-source"></p>
</section>
</div>
</div>
<div id="page-logs" class="page hidden">
<div class="page-head hub-logs-page-head">
<div>
<h1><span class="head-tag">LOG</span> 系统日志</h1>
<p class="page-desc">三所实例与中控 PM2 进程日志 · 实时输出与报错分离展示</p>
</div>
<div class="hub-logs-page-actions">
<button type="button" id="hub-logs-btn-refresh" class="ghost">立即刷新</button>
<button type="button" id="hub-logs-btn-pause" class="ghost">暂停刷新</button>
</div>
</div>
<div class="hub-logs-toolbar">
<div id="hub-logs-tabs" class="hub-logs-tabs" role="tablist" aria-label="日志来源"></div>
<span id="hub-logs-status" class="toolbar-meta"></span>
</div>
<div class="hub-logs-layout">
<section class="card hub-logs-card">
<div class="hub-logs-card-head">
<h3 class="hub-logs-card-title">实时日志</h3>
<span class="hub-logs-card-hint">stdout</span>
</div>
<pre id="hub-logs-out" class="hub-logs-pre">加载中…</pre>
</section>
<section class="card hub-logs-card">
<div class="hub-logs-card-head">
<h3 class="hub-logs-card-title">报错日志</h3>
<span class="hub-logs-card-hint">stderr</span>
</div>
<pre id="hub-logs-err" class="hub-logs-pre">加载中…</pre>
</section>
</div>
</div>
<div id="page-settings" class="page hidden">
<div class="page-head">
<h1><span class="head-tag">CFG</span> 系统设置</h1>
<p class="page-desc">登录账号,导航显示,交易所地址与监控能力</p>
</div>
<details class="hint-box">
<summary>配置说明</summary>
<div class="hint-body">
交易所等配置保存后写入 <code>hub_settings.json</code>;登录账号密码写入 <code>manual_trading_hub/.env</code>.<br />
Flask / Agent 填本机地址即可;复盘链接可留空(由 Flask 地址自动生成).<br />
<code>HUB_DISABLED_IDS</code> 可强制关闭账户;<code>HUB_BRIDGE_TOKEN</code> 与实例一致,或实例 <code>APP_AUTH_DISABLED=true</code>.
</div>
</details>
<p id="settings-meta-line" class="settings-meta-line"></p>
<div class="hub-config-body card">
<input type="radio" name="hub-settings-section" id="hub-sec-0" class="hub-tab-radio" checked>
<input type="radio" name="hub-settings-section" id="hub-sec-1" class="hub-tab-radio">
<input type="radio" name="hub-settings-section" id="hub-sec-2" class="hub-tab-radio">
<input type="radio" name="hub-settings-section" id="hub-sec-3" class="hub-tab-radio">
<input type="radio" name="hub-settings-section" id="hub-sec-4" class="hub-tab-radio">
<input type="radio" name="hub-settings-section" id="hub-sec-5" class="hub-tab-radio">
<input type="radio" name="hub-settings-section" id="hub-sec-6" class="hub-tab-radio">
<div class="hub-config-tabs" role="tablist" aria-label="系统设置分类">
<label for="hub-sec-0" class="hub-tab-btn" role="tab">账户密码</label>
<label for="hub-sec-1" class="hub-tab-btn" role="tab">显示与导航</label>
<label for="hub-sec-2" class="hub-tab-btn" role="tab">宏观数据</label>
<label for="hub-sec-3" class="hub-tab-btn" role="tab">交易监管</label>
<label for="hub-sec-4" class="hub-tab-btn" role="tab">备份恢复</label>
<label for="hub-sec-5" class="hub-tab-btn" role="tab">交易所账户</label>
<label for="hub-sec-6" class="hub-tab-btn" role="tab">AI 配置</label>
</div>
<div class="hub-config-panels">
<section class="hub-panel hub-panel--0 hub-settings-tab-panel" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">账户密码</h3>
</div>
<p class="settings-display-hint">修改中控网页登录账号密码,写入 <code>manual_trading_hub/.env</code> 后需重启中控生效.当前用户:<code id="hub-pwd-current-user"></code></p>
<div class="settings-grid hub-password-grid">
<div class="field"><label>当前密码</label><input type="password" id="hub-pwd-old" autocomplete="current-password"></div>
<div class="field"><label>新用户名(可选)</label><input type="text" id="hub-pwd-new-username" autocomplete="username"></div>
<div class="field"><label>新密码</label><input type="password" id="hub-pwd-new" autocomplete="new-password"></div>
<div class="field"><label>确认新密码</label><input type="password" id="hub-pwd-confirm" autocomplete="new-password"></div>
</div>
<div class="hub-settings-tab-actions">
<button type="button" class="primary" id="hub-pwd-save-btn">保存密码</button>
<span id="hub-pwd-save-status" class="settings-status-line"></span>
</div>
</section>
<section class="hub-panel hub-panel--1 hub-settings-tab-panel settings-display-panel" data-settings-section="display" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">显示与导航</h3>
<button type="button" class="primary settings-section-save" data-settings-section="display">保存</button>
</div>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-account-pnl" checked />
监控区显示资金账户,交易账户与浮动盈亏
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-funds" checked />
顶栏显示「资金概况」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-dashboard" checked />
顶栏显示「数据看板」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-plan" checked />
顶栏显示「开仓计划」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-archive" checked />
顶栏显示「内照明心」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-quotes" checked />
顶栏显示「语录」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-ai" checked />
顶栏显示「AI 教练」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-calculator" checked />
顶栏显示「计算器」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-strategy" checked />
顶栏显示「策略说明」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-help" checked />
顶栏显示「使用说明」
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="pref-show-nav-logs" checked />
顶栏显示「系统日志」
</label>
<p class="settings-display-hint">保存至 hub_settings.json,换浏览器同样生效.关闭导航后对应页面将不可从顶栏进入,直接访问 URL 会跳回监控区.</p>
</section>
<section class="hub-panel hub-panel--2 hub-settings-tab-panel settings-macro-panel" data-settings-section="macro" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">宏观关键数据(风控前置)</h3>
<button type="button" class="ghost settings-section-save" data-settings-section="macro">保存表单</button>
</div>
<p class="settings-display-hint">
手动录入 FOMC / CPI / 就业数据发布时间(北京时间).监控区在发布前后各 1 小时提示风险:有仓注意仓位,无仓建议等待.仅提醒,不拦截下单.
</p>
<form id="macro-event-form" class="macro-event-form">
<label class="macro-event-field">
<span>数据名称</span>
<select id="macro-event-type" required>
<option value="fomc">FOMC 联邦基金利率</option>
<option value="cpi">美国 CPI 通胀</option>
<option value="employment">就业与劳工数据</option>
</select>
</label>
<label class="macro-event-field">
<span>发布时间(北京)</span>
<input id="macro-event-at" type="datetime-local" required />
</label>
<label class="macro-event-field macro-event-field-wide">
<span>备注(可选)</span>
<input id="macro-event-note" type="text" maxlength="500" placeholder="如:仅关注核心 CPI" autocomplete="off" />
</label>
<div class="macro-event-actions">
<button type="submit" id="macro-event-submit" class="primary">添加</button>
<button type="button" id="macro-event-cancel" class="ghost hidden">取消编辑</button>
</div>
</form>
<div id="macro-event-list" class="macro-event-list"></div>
</section>
<section class="hub-panel hub-panel--3 hub-settings-tab-panel settings-supervisor-panel" data-settings-section="supervisor" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">交易监管 · 企业微信</h3>
<button type="button" class="primary settings-section-save" data-settings-section="supervisor">保存</button>
</div>
<p class="settings-display-hint">
与三所实例策略通知独立;手动/中控开平仓与新开仓会推送至此 Webhook.链接可在下方单独修改.
</p>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="supervisor-enabled" checked />
启用交易监管推送
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="supervisor-wechat-program" checked />
程序止盈/止损也发微信(鼓励向)
</label>
<div class="settings-grid supervisor-settings-grid">
<div class="field field-wide">
<label>企业微信 Webhook</label>
<input id="supervisor-wechat-webhook" type="text" placeholder="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..." autocomplete="off" />
</div>
<div class="field field-wide">
<label>微信消息跳转链接(可改)</label>
<input id="supervisor-wechat-link" type="text" placeholder="https://你的域名/ai?mode=supervisor" autocomplete="off" />
</div>
<div class="field">
<label>消息前缀</label>
<input id="supervisor-wechat-prefix" type="text" value="【交易监管】" autocomplete="off" />
</div>
<div class="field">
<label>日手动平警告阈值</label>
<input id="supervisor-daily-warn" type="number" min="1" step="1" value="2" />
</div>
<div class="field">
<label>最短两笔间隔(分钟)</label>
<input id="supervisor-interval-warn" type="number" min="1" step="1" value="15" />
</div>
<div class="field">
<label>30 分钟内笔数阈值</label>
<input id="supervisor-freq-30m" type="number" min="1" step="1" value="2" />
</div>
<div class="field">
<label>平仓后再开仓(分钟)</label>
<input id="supervisor-reopen-min" type="number" min="1" step="1" value="30" />
</div>
</div>
</section>
<section class="hub-panel hub-panel--4 hub-settings-tab-panel settings-backup-panel" data-settings-section="backup" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">备份与恢复</h3>
<button type="button" class="primary settings-section-save" data-settings-section="backup">保存</button>
</div>
<p class="settings-display-hint">
打包三所 <code>crypto.db</code>,中控 K 线/归档等 SQLite,<code>hub_settings.json</code><code>.env</code>(可选).
恢复前会自动做一次 pre-restore 快照,并尝试 <code>pm2 restart all</code>.
</p>
<div class="settings-grid backup-settings-grid">
<label class="chk-label settings-display-chk">
<input type="checkbox" id="backup-auto-enabled" checked />
每日自动备份(北京时间)
</label>
<div class="field">
<label>自动备份时刻(时,023)</label>
<input id="backup-auto-hour" type="number" min="0" max="23" step="1" value="0" />
</div>
<div class="field">
<label>保留天数</label>
<input id="backup-retention-days" type="number" min="1" max="365" step="1" value="30" />
</div>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="backup-include-env" checked />
包含 .env 配置文件
</label>
<label class="chk-label settings-display-chk">
<input type="checkbox" id="backup-include-images" />
包含三所 static/images 截图
</label>
<div class="field field-wide">
<label>备份目录(留空默认 /root/backups/crypto_monitor_portal)</label>
<input id="backup-root" type="text" placeholder="/root/backups/crypto_monitor_portal" autocomplete="off" />
</div>
</div>
<div class="backup-actions">
<button type="button" id="backup-run-now" class="primary">立即备份</button>
<span id="backup-status-line" class="backup-status-line"></span>
</div>
<div class="backup-restore-upload">
<label class="backup-upload-label">
<span>上传备份包恢复(.zip)</span>
<input id="backup-restore-file" type="file" accept=".zip,application/zip" />
</label>
<button type="button" id="backup-restore-upload-btn" class="danger">上传并恢复</button>
</div>
<div id="backup-list" class="backup-list"></div>
</section>
<section class="hub-panel hub-panel--5 hub-settings-tab-panel" data-settings-section="exchanges" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">交易所账户</h3>
<div class="hub-settings-tab-head-actions">
<button type="button" id="btn-settings-add" class="ghost">添加交易所</button>
<button type="button" class="primary settings-section-save" data-settings-section="exchanges">全部保存</button>
</div>
</div>
<div id="settings-list" class="settings-grid-wrap"></div>
</section>
<section class="hub-panel hub-panel--6 hub-settings-tab-panel settings-ai-env-panel" data-settings-section="ai-env" role="tabpanel">
<div class="hub-settings-tab-head">
<h3 class="hub-settings-tab-title">AI 复盘(统一配置)</h3>
<button type="button" class="primary" id="hub-ai-env-save-btn">保存并同步</button>
</div>
<p class="settings-display-hint">
保存后写入 <code>manual_trading_hub/.env</code>,并<strong>强制同步</strong>至三所实例 <code>.env</code>(OKX / Binance / Gate).
实例 env 配置页已不再提供 AI 项,请仅在此修改.密钥留空表示不修改原值.
</p>
<p id="hub-ai-sync-status" class="settings-meta-line"></p>
<div id="hub-ai-env-fields" class="settings-grid hub-ai-env-grid"></div>
<div class="hub-settings-tab-actions">
<span id="hub-ai-env-save-status" class="settings-status-line"></span>
</div>
</section>
</div>
</div>
</div>
</div>
<!-- 手机端主导航(≤720px);桌面/平板不显示 -->
<nav id="hub-mobile-tabbar" class="hub-mobile-tabbar" aria-label="手机主导航">
<a href="/monitor" class="hub-m-tab" data-hub-tab="monitor" id="m-tab-monitor">监控</a>
<a href="/market" class="hub-m-tab" data-hub-tab="market" id="m-tab-market">行情</a>
<a href="/calculator" class="hub-m-tab" data-hub-tab="calculator" id="m-tab-calculator">计算</a>
<a href="/ai" class="hub-m-tab" data-hub-tab="ai" id="m-tab-ai">AI</a>
<button type="button" class="hub-m-tab" data-hub-tab="more" id="m-tab-more" aria-haspopup="dialog" aria-expanded="false">更多</button>
</nav>
<div id="hub-mobile-more" class="hub-mobile-more" aria-hidden="true">
<div class="hub-mobile-more-backdrop" id="hub-mobile-more-backdrop"></div>
<div class="hub-mobile-more-sheet" role="dialog" aria-modal="true" aria-labelledby="hub-mobile-more-title">
<div class="hub-mobile-more-handle" aria-hidden="true"></div>
<h2 id="hub-mobile-more-title" class="hub-mobile-more-title">更多</h2>
<p class="hub-mobile-more-hint">次要功能 · 完整界面请用电脑/平板</p>
<nav class="hub-mobile-more-nav" aria-label="更多页面">
<a href="/funds" id="m-nav-funds">资金概况</a>
<a href="/plan" id="m-nav-plan">开仓计划</a>
<a href="/archive" id="m-nav-archive">内照明心</a>
<a href="/quotes" id="m-nav-quotes">语录</a>
<a href="/dashboard" id="m-nav-dashboard">数据看板</a>
<a href="/strategy" id="m-nav-strategy">策略说明</a>
<a href="/help" id="m-nav-help">使用说明</a>
<a href="/logs" id="m-nav-logs">系统日志</a>
<a href="/settings" id="m-nav-settings">系统设置</a>
</nav>
<button type="button" class="ghost hub-mobile-more-close" id="hub-mobile-more-close">关闭</button>
</div>
</div>
<div id="tpsl-modal" class="modal hidden" aria-hidden="true">
<div class="modal-backdrop" id="tpsl-modal-backdrop"></div>
<div class="modal-panel" role="dialog" aria-labelledby="tpsl-modal-title">
<h3 id="tpsl-modal-title">挂止盈 / 止损</h3>
<p id="tpsl-modal-meta" class="modal-meta"></p>
<div class="modal-field">
<label for="tpsl-sl">止损价</label>
<input id="tpsl-sl" type="number" step="any" autocomplete="off" />
</div>
<div class="modal-field">
<label for="tpsl-tp">止盈价</label>
<input id="tpsl-tp" type="number" step="any" autocomplete="off" />
</div>
<p class="modal-hint">先撤销该合约全部条件单,再挂新止盈与止损(三所统一).</p>
<div class="modal-actions">
<button type="button" id="tpsl-cancel" class="ghost">取消</button>
<button type="button" id="tpsl-submit" class="primary">确认挂单</button>
</div>
</div>
</div>
<div id="plan-detail-modal" class="modal hidden" aria-hidden="true">
<div class="modal-backdrop" data-plan-modal-close></div>
<div class="modal-card plan-detail-card">
<div class="modal-head">
<h3 id="plan-detail-title">计划详情</h3>
<button type="button" class="ghost plan-modal-close" data-plan-modal-close aria-label="关闭">×</button>
</div>
<div id="plan-detail-body" class="plan-detail-body"></div>
</div>
</div>
<div id="plan-edit-modal" class="modal hidden" aria-hidden="true">
<div class="modal-backdrop" data-plan-edit-close></div>
<div class="modal-card plan-edit-card">
<div class="modal-head">
<h3>修改计划</h3>
<button type="button" class="ghost plan-modal-close" data-plan-edit-close aria-label="关闭">×</button>
</div>
<form id="plan-edit-form" class="plan-form plan-edit-form"></form>
</div>
</div>
<div id="toast"></div>
<script src="https://unpkg.com/lightweight-charts@4.2.0/dist/lightweight-charts.standalone.production.js"></script>
<script src="/assets/chart_draw.js?v=20260609-market-day-split"></script>
<script src="/assets/chart.js?v=20260715-fs-landscape"></script>
<script src="/assets/plan.js?v=20260614-plan-refresh"></script>
<script src="/assets/calculator.js?v=20260715-calc-tabs"></script>
<script src="/assets/trade_stats_calendar.js?v=3"></script>
<script src="/assets/archive.js?v=20260717-archive-cal-chart"></script>
<script src="/assets/quotes.js?v=20260717-quotes-feed"></script>
<script src="/assets/funds.js?v=20260717-funds-scroll-fix"></script>
<script src="/assets/dashboard.js?v=20260717-dash-kpi-merge"></script>
<script src="/assets/strategy.js?v=6"></script>
<script src="/assets/help.js?v=1"></script>
<script src="/assets/logs.js?v=1"></script>
<script src="/assets/ai_review_render.js?v=3"></script>
<script src="/assets/time_close_ui.js?v=3"></script>
<script src="/assets/options_expiry_countdown.js?v=1"></script>
<script src="/assets/options_position_cards.js?v=1"></script>
<script src="/assets/backup.js?v=1"></script>
<script src="/assets/app.js?v=20260717-quotes-feed"></script>
</body>
</html>