在图上 滚轮 缩放(以光标位置为中心)、按住拖动 平移看历史、双击 复位到最新。
平移后右上角会出现「回到最新」,点一下回来;新数据到达时视图不会跳动。
币安现货只支持 1m 3m 5m 15m 30m 1h 2h 4h 6h 8h 12h 1d 3d 1w 1M,没有 10m,直接请求会报错。这里按 UTC 整十分对齐,用两根 5m 合并。
直接双击 kline.html 就能用,不需要启动服务。文件里内置了一份真实行情快照(约 300 根 1m + 300 根 5m),所以断网、甚至完全离线状态下打开也有图;一联网就会自动拉币安最新数据覆盖。
页面每 60 秒 自动把三个周期的全部K线写成一份 JSON,存在哪取决于打开方式:
· 双击 kline.html:写进浏览器本地 localStorage(1m 最多 6000 根、5m 最多 3000 根)。想直接存成磁盘文件,点顶栏「存储」那一格 选一次 保存位置,之后每分钟自动覆盖写那个 .json。
· 用 start.bat 启动服务:服务端常驻后台,浏览器关掉也照跑——每分钟只补本地没有的K线,然后把 1m / 5m / 10m 一起覆盖写入 F:\xiangmu\klines-btcusdt.json。
· 快照文件只保留最近 30 天(每月自动滚动覆盖:新的一天进来,最早的一天被丢掉);合并只取并集,绝不会用旧数据覆盖掉新的历史。
向后:只从「本地最后一根K线的时间」往后拉。如果本地已经覆盖到现在(最后一根还在走),一个上游请求都不发,当前这根交给 WebSocket 更新。
向前:每 60 秒 额外要 200 根更早的历史,endTime 指向本地最早那根之前,所以只要「本地没有的」。1m + 5m 合计攒到 10 万根、或已回溯到 30 天前,就停止补历史。
磁盘 / 绑定文件存完整历史;浏览器 localStorage 只留最近约 6000 根用于秒开,重开时从磁盘把历史整份取回,不会重复下载。
所以关掉重开、刷新多少次,都不会把同样的历史重复下载一遍;顶栏 K线 后面的 +N、历史1m +200 就是本次实际补到的根数。
三张K线下方是订单簿面板:左边红色 10 档卖盘、右边绿色 10 档买盘,每档显示价格、挂单数量(BTC)与金额(USDT),背景条长度是该档金额在 20 档里的占比。中间显示中间价与价差。数据来自 WebSocket depth10 快照流,每秒一帧,不占 REST 权重。
面板下方是「分析最近 1 分钟成交」按钮。点击后向币安按毫秒时间窗(过去 60 秒)精确拉取每笔成交(aggTrades,权重 4/页,一页 1000 笔,超了自动翻页、按成交 ID 去重),统计:
· 主动买入(吃卖单)与主动卖出的笔数和金额(万为单位);
· 净流入 = 买入额 − 卖出额,正数偏多方;
· 最大单笔:这一分钟金额最大的一笔成交的方向、时间、价格、数量、金额;
· 占比 = 最大单笔金额 ÷ 该分钟总成交额 × 100%,用横条直观展示。这个值越高,说明这分钟的行情越是被一两笔大单主导。
判断标准很简单:相邻两根K线的时间戳应该正好差一个周期(1m 就差 60000 毫秒)。如果差值是周期的两倍以上,说明中间断了,缺了几根就记几根。
· 顶栏「断连」那一格就是实时状态:绿色 完整 ✓ 表示一根不缺;红色 N 处 · 缺M根 表示发现断连,点一下立刻修复。
· 自动检查时机:打开页面 8 秒后查一次,之后每 5 分钟 查一次;服务端在 每分钟 的后台任务里也查一次。两边都查,谁先发现谁补。
· 修复方式是按缺口区间精确要:用 startTime 指向缺口第一根、endTime 指向缺口最后一根,只请求这几根。缺 6 根就只发 1 个请求、权重 1,不会把周围已有的K线重新下载一遍。
· 安全保护:只要数据里还存在断连,快照的 30 天滚动裁剪会自动暂停。否则窗口一往前滑,缺失那一段就永远滑出保留期、再也补不回来了。补齐后裁剪自动恢复。
· 双击打开(没有服务)时也能用:页面会直连币安补齐,每个缺口一个请求,同样只补缺的那几根。
· 断线重连、浏览器关了一晚上、服务被杀掉,第二天打开留下的空洞,都会在第一次检查时被发现并补上。
首屏只发 2 个请求(1h 内重复打开直接用缓存,不发请求);实时数据靠 1 条 WebSocket 组合流,不轮询。
每分钟固定 2 个补历史请求(1m / 5m 各 1 个,权重各 1~2),加首屏合计约 6 权重/分钟,只占币安 IP 上限(6000/分钟)的千分之一。
断线重连是指数退避 + 随机抖动(上限 30 秒),避开「每 IP 每 5 分钟 300 次连接」与 429 / 418。断线期间漏掉的K线会在重连后补拉一次,不留空洞。