K线缓存与历史管线:缓存、覆盖、经纪商、实时
每张足迹图都通过同一个控制器加载 K 线:读取本地 SQLite 缓存,向缓存询问缺失的时间窗,只向经纪商取回这些窗口,然后合并实时批次。缓存以规范化合约键为索引,存储 1 分钟颗粒度,日内周期由它派生。
Senzoukria · 文档 · 更新于 2026 年 9 月
位置
- 阶段
- idle → cache → ensure → live,并附带一个在同一次运行中绝不回退的进度百分比
- 基准颗粒度
- 1 分钟。所有能整除的日内周期都在本地由缓存的 1 分钟 K 线汇总;1 日和计数型 K 线(100t,tick / 成交量 / 区间 / delta)按自身颗粒度缓存
- 历史范围
- 图表设置 → “历史范围”:24 小时(当日)、3 天、7 天。默认 24 小时(当日)。向经纪商请求的窗口为从当前时刻往回 范围 × 24 小时,与显示时区无关;日线周期保留 360 小时的下限
- 缓存在哪里管理
- 设置 → “缓存与经纪商”指向账户页面:“数据源、经纪商和本地缓存都在账户页面上。”图表中没有任何控件会删除缓存的 K 线
它做什么
历史控制器对所有数据源执行同一套流程。首先对请求的窗口分页读取缓存(cache_query_page,每页 1,000 行,最多 64 页)。然后向 cache_coverage 询问该窗口内部的缺口,只把这些缺口交给经纪商(rithmic_history_ensure,并带上合约的 tick size)。最后订阅实时批次,并把它们合并进同一个 store。
K 线按分桶时间戳存储,并带有来源标记:synthetic、ohlcv、cache、hist 或 live。合并规则决定哪份副本胜出:真实 K 线永远替换合成 K 线,实时 K 线替换正在形成的那个桶,OHLCV 绝不覆盖已有 K 线,其余情况保留成交量更大(其次是成交笔数更多)的那份。正是这一点让缓存 K 线、重新取回的 K 线和实时 K 线可以共存而不会让成交量翻倍。
非 Rithmic 代码会被规范化为诸如 ESZ6.CME 这样的键(根代码、月份代码、年份末位、交易所),这样来自桥接的“ES 12-26”和来自 Rithmic 的“ESZ6”就共用同一批缓存行。Rithmic 代码按发送时的原样存储,已知交易所时在后面追加交易所。
设置与上限
| 设置 | 默认值 | 它改变什么 |
|---|---|---|
| 历史范围(图表设置) | 24 小时(当日) | 向缓存和经纪商请求的窗口:从当前时刻往回 1、3 或 7 天 × 24 小时。显示时区决定坐标轴,而不决定数据量。离线时,缓存窗口以最新的缓存 K 线为锚点,而不是以时钟为准 |
| 各周期 K 线上限 | 15s/30s 200 · 1m 1,500 · 3m 1,200 · 5m 2,100 · 15m 3,000 · 1h 4,500 · 1d 400 · 100t 1,500 | 内存中保留的最大 K 线数;分钟级周期(1d 除外)的上限会乘以以天计的范围 |
| 自定义周期 | 120 至 1,500 根 K 线(25 小时),2h 及以上最多 4,500 根(190 天) | 当周期不在表中时,上限由周期长度计算得出 |
| Tick size | 来自合约目录 | 传给 ensure 步骤;缺少它时后端会按默认网格分桶,窗口将永远不会被标记为已覆盖 |
| 重新加载历史 | 按钮 | ⚙ → 交易设置 → 重新加载历史,会重新打开被经纪商返回零 tick 的窗口;它不清除任何内容 |
如何使用
- 在你需要的周期上打开图表;历史会自行填充并留在磁盘上,因此下次打开会先读缓存再问经纪商。
- 在 1m、5m、15m 和其他可派生周期之间随意切换:它们都由 1 分钟颗粒度在本地汇总,没有网络往返。
- 只在需要时才扩大历史范围:一周的 1 分钟足迹图是海量 tick,首次加载需要一些时间。
- 当提示说另一次历史加载正在运行或加载停滞时,请在图表设置中按“重新加载历史” —— 应用中没有别的功能会重新打开一个返回为空的窗口。
提示与陷阱
- “CME Globex 已休市”表示没有新数据可下载;缓存的 K 线仍留在图表上,已抽取完的时段照样可以回放。
- rp_code 13 的拒绝通常是间歇性的;图表会继续使用缓存和实时数据运行,并自行重试。
- “该合约的价格网格未知”表示 tick size 不在目录中,因此在补上之前每次加载都会重新下载历史。
- 返回为空的窗口绝不会被自动再次请求;只有“重新加载历史”能解除这一点。
- ensure 阶段有 120 秒的停滞看门狗,并在后端繁忙时 3 秒后重试;控制器绝不调用 cache_clear,也不触碰 localStorage。
- 设置中的历史范围提示说窗口从所选时区的午夜开始计算;而历史控制器实际请求的是从当前时刻往回 范围 × 24 小时,因此在一天较晚时打开的图表可能比一个自然日稍多一点。
相关页面
其他语言版本
常见问题
- 为什么进度条还在走,图表上就已经有 K 线了?
- 缓存阶段一读到页就发布 K 线(最多占进度的 25 %),随后 ensure 阶段再填上经纪商还需发送的缺口。
- 我能清空缓存来解决一次糟糕的加载吗?
- 历史控制器从不调用 cache_clear,图表也不提供清空功能。真正的开关是图表设置中的“重新加载历史”,它只重新打开返回零 tick 的窗口,不触碰缓存的 K 线和实时数据流。
- 桥接和 Rithmic 共用缓存吗?
- 数据行以规范化合约键为索引,因此只要代码能被解析,从桥接看到的 ES 12 月合约和从 Rithmic 看到的会映射到同一个键。