为回测补齐长历史:足迹抽取还是服务器 K 线
自动回测面板会读取所选合约、颗粒度和周期的缓存覆盖情况,然后针对缺失的时段提供两种下载:足迹抽取(每一笔成交及其主动方,重建为 bid × ask)或不含价位明细但更快的服务器 K 线。覆盖情况按每 7 天 5 个交易时段折算。
Senzoukria · 文档 · 更新于 2026 年 9 月
位置
- 位置
- 回放 → 自动回测 → 周期与颗粒度下方的覆盖卡片
- 周期
- 1 周、1 个月(默认)、3 个月、6 个月、1 年、2 年、5 年;颗粒度为 1 分钟、5 分钟、15 分钟(默认)、1 小时
- 两个按钮
- “下载足迹历史({dur})”(主按钮)与“下载缺失的历史({dur})”(次按钮,服务器 K 线)
- 覆盖文案
- “请求的 {n} 个时段中已缓存 {n} 个 —— 缺少 {n} 个。回测可以立刻在已有数据上运行,但结果只覆盖那个窗口。”
它做什么
更改合约、颗粒度或周期都会重新读取缓存(cache_coverage),不发起任何经纪商调用。请求的天数按 5/7 折算为时段数,已覆盖的纳秒换算为已覆盖时段,二者之差就是缺失数量。当完全没有缓存时,卡片会显示“{symbol} 在 {tf} 上没有任何缓存。请在图表中以该颗粒度打开此合约:历史会自行填充,此后一直可用。”
足迹抽取以 28 天为一个窗口调用 rithmic_history_ensure,最旧的窗口放在最后,并带上合约的 tick size。它的估算是每个缺失时段 107 秒,显示在按钮上。每个窗口会报告取得的 K 线数、被拒而跳过的区间数和失败的区间数;后端繁忙时会跳过该窗口而不计为失败。这条路径带有每个价位的 bid × ask,是读取逐档失衡的策略所必需的。
服务器 K 线路径调用 rithmic_fetch_history_batch,按每块 9,000 根 K 线规划(每时段 23 小时,每天 5/7 个时段),每批发送 8 个窗口,同时在途 2 批。它更快,但这些 K 线只带有 OHLC、成交量和 delta:“服务器 K 线包含 OHLC、成交量和 delta,但不含足迹价位明细。”
设置与估算
| 设置 | 默认值 | 它改变什么 |
|---|---|---|
| 周期 | 1 个月(30 天) | 请求的天数:7、30、90、180、365、730 或 1,825 |
| 颗粒度 | 15 分钟 | 为回测读取的缓存 K 线周期:1m、5m、15m、1h |
| 足迹抽取窗口 | 28 天 | 每次 rithmic_history_ensure 请求的大小 |
| 足迹估算 | 每个缺失时段 107 秒 | 主按钮上显示的时长 |
| 服务器 K 线分块 | 9,000 根 K 线 | 每个历史窗口的大小;估算为每块 150 秒 |
| 截断标记 | < 请求天数的 90 % | 当 K 线跨度不足周期的 90 % 时,coveredSpan 会把结果标记为已截断 |
如何使用
- 先选定合约、颗粒度和周期,启动前先读覆盖那一行:回测可以在已有数据上运行,但其结果只覆盖那个窗口。
- 当策略读取失衡或逐档成交量时,优先选择足迹抽取;接受它所公布的耗时。
- 用“取消”可以中止任一种下载;已经到达的数据会保留,再跑一次会补齐其余部分。
- 留意状态行:“正在逐笔抽取 —— 第 {done}/{total} 个窗口,已获得 {bars} 根 K 线”或“正在下载 —— 第 {done}/{total} 块,已获得 {bars} 根 K 线”。
结论与陷阱
- denied:经纪商返回 rp_code 13(“permission denied”)。历史 K 线是经纪商的权限,而不是应用设置;历史逐笔数据可能仍然可用,手动回放正是使用它。
- silent:登录被接受,但每个窗口都没有发送任何内容。要么档案没有回溯到那么早,要么历史服务节点故障;请在开市时重试。
- empty:经纪商有应答但没有为此窗口提供 K 线;它的档案对这个合约可能没有回溯到那么早。
- 带代码的逐笔抽取:“经纪商未返回任何成交,并回复:{codes}。此账户可能未开通历史逐笔回放。”
- 历史数据由你的经纪商或数据提供商按你的账户提供并计费;应用无法扩展任何权限。
相关页面
其他语言版本
常见问题
- 为什么提供两种下载,我该选哪一种?
- 它们携带的数据并不相同。足迹抽取从每一笔成交重建每个价位的 bid × ask,逐档策略必须用它;服务器 K 线更快,但没有价位明细。正因如此,足迹抽取才是主按钮。
- 为什么估算时间是以小时计的?
- 每个缺失时段 107 秒是有意为之:把时间说得太短,用户会中断本来就快完成的下载。
- 下载完成了,覆盖情况却没变?
- 每次运行后都会重新读取覆盖情况。如果它没有变化,请读按钮下方的消息:分块不完整、一个拒绝代码或一份空档案,都能解释这一点。