关于 tick-collection-ops
用于监控和排查 MT5 Tick 采集的运维 Skill,涵盖数据缺口、恢复文件和服务状态。README 指出,文档中的 Linux/Wine 部署已被经纪商 VPS 设置取代。
主要功能
- 01Tick 采集健康检查
- 02使用 DuckDB 检测缺口
- 03崩溃恢复与水位线指引
- 04Parquet 文件轮转说明
- 05Wine 与 MT5 故障排查
适用场景
- 01调查 Tick 缺失或延迟
- 02重启后检查恢复分段文件
- 03检查 Tick 文件与数量
- 04诊断 MT5 或 Wine 故障
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ terrylica/ cc-skills --skill tick-collection-ops安装后在 Claude Code 中输入/tick-collection-ops确认已加载。
详细介绍
MT5 Tick 收集运维
自我演进的技能:此技能会在使用过程中不断改进。如果说明有误、参数发生偏差,或需要采用变通方案,请立即修复此文件,不要拖延。仅针对真实且可复现的问题进行更新。
⚠️ 主机已弃用 — 2026-08-07
MetaTrader 5 已不再运行于 。 它目前仅运行在经纪商 VPS 上(Tailscale 主机
mt5-host,<tailscale-ip>,Windows),并使用模拟账户。Mac 本地 Wine 测试环境已于 2026-08-06 删除; 上的 Wine 终端及其xvfb/xfce/x11vnc桌面和fxview-sidecar正在停用。VPS 使用 Windows 计划任务,而非 Linux systemd:
关注项 (已退役) 经纪商 VPS(当前) 终端 Wine 下的 mt5.service,DISPLAY=:99terminal64.exe,原生 Windows,真实会话Tick 环形缓冲区 /dev/shm/tick_ring_<SYM>C:\odb-tickrings\tick_ring_<SYM>环形缓冲区 → 总线 — odb-tapegateway.exe→ 任务OdbTickRingToNatsTapeGateway总线 — nats-server.exe:4222→ 任务OdbTapeBusNatsJetStreamServer订单 — order-service :50060→ 任务ODB-MT5-OrderService品种 EUR/GBP/XAU/XAG 仅 EUR/GBP/XAU(根据 2026-05-26 指令排除白银) 服务控制 systemctlGet-ScheduledTask/Start-ScheduledTask使用
ssh <mt5-host>连接。通过 shell 引号传递时,PowerShell over SSH 会吞掉$_——请通过powershell -NoProfile -EncodedCommand <base64-utf16le>以 base64 编码方式传递命令。以下内容仍描述 Linux/Wine 部署。 保留这些内容是因为 EA、
tick_writer.dll环形缓冲区格式以及缺口检测原理均未改变,仍然具有权威性——只有主机和服务管理器发生了变化。请勿据此部署新的 Linux MT5。权威文档:
<research-repo>/docs/adr/<date>-retire-<host>-as-a-metatrader-host.md和docs/decision-register-<topic>.md。
运维、监控并排查通过 Wine 在 Linux 上运行的零缺口 Tick 收集系统。
何时使用此技能
在以下情况下使用此技能:
- 在 上部署或重启 Tick 收集
- 诊断 Tick 缺口或数据缺失
- 排查 Wine 或 MT5 问题
- 了解 systemd 服务拓扑
- 调查崩溃恢复文件
- 检查 Tick 收集状态
系统架构
TickCollector EA (MQL5) --> tick_writer.dll (Rust) --> Parquet files
OnTick() callback C-ABI FFI ZSTD compressed
CopyTicksRange() Buffered writes One file per day
Watermark dedup Row group flush
- TickCollector EA 通过 Wine 在无头 Linux()上的 MT5 运行
- EA 通过 OnTick() 回调和 OnTimer() 备用机制(间隔 1 秒)捕获每个 Tick
- Tick 在 EA 中缓冲,并通过 C-ABI FFI 刷新到 Rust DLL(tick_writer.dll)
- Rust DLL 使用 ZSTD 3 级压缩写入 Parquet 文件
- 每个图表、每个品种运行一个 EA 实例——这是关键限制(每个 EA 只能处理一个品种)
生产环境拓扑
| 资源 | 路径 |
|---|---|
| Git 仓库 | ~/eon/mql5/ |
| Wine 前缀 | ~/.mt5/ |
| MT5 安装目录 | ~/.mt5/drive_c/Program Files/MetaTrader 5/ |
| EA 源码 | {repo}/mql5_ea/TickCollector.mq5 |
| DLL(Windows) | {mt5}/MQL5/Libraries/tick_writer.dll |
| Tick 数据 | {mt5}/tick_data/(符号链接到 ODB 缓存) |
| Systemd 单元 | systemd 用户单元:xvfb、xfce、x11vnc、mt5 |
Systemd 服务链
xvfb (virtual framebuffer)
--> xfce (desktop environment)
--> x11vnc (VNC access)
--> mt5 (MetaTrader 5 via Wine)
这些都是用户级 systemd 单元。MT5 依赖显示栈。服务链必须按顺序启动——先启动 xvfb,最后启动 mt5。
每日文件轮换
- 每个交易日都会创建新的 Parquet 文件
- 文件名模式:
{SYMBOL}_{YYYYMMDD}.parquet - EA 检测到日期变化后,会调用
tw_close(完成当前文件)和tw_init(打开新文件) - 交易日从周日开盘到周一开盘(外汇交易时段)
崩溃恢复
EA 重启时:
- EA 调用
tw_get_last_time_msc,从上一个 Parquet 文件的页脚读取恢复水位标记 - 水位标记是最后写入的 tick 的时间戳——从该时间戳继续恢复
- 如果发现今天已有文件,新文件会添加
_1、_2后缀(不会覆盖) - 所有恢复片段都是有效、完整且带有页脚的 Parquet 文件
- 恢复水位标记可防止重启后出现重复 tick
- 关机和重启之间的缺口会通过从水位标记开始调用
CopyTicksRange回填
Rust DLL 会将损坏或不完整的文件重命名并添加 _partial 后缀,而不会尝试恢复。
缺口检测
使用 DuckDB 检查连续 tick 之间是否存在缺口:
WITH ticks AS (
SELECT time_msc,
lead(time_msc) OVER (ORDER BY time_msc) - time_msc AS gap_ms
FROM read_parquet('{base_path}/FXVIEW_{SYMBOL}/{YYYY}/{SYMBOL}_{YYYYMMDD}.parquet')
)
SELECT time_msc, gap_ms,
make_timestamp(time_msc * 1000) AS ts
FROM ticks
WHERE gap_ms > 60000 -- gaps > 1 minute
ORDER BY gap_ms DESC;
结果解读:
- 周末缺口属于正常情况(周五收盘到周日开盘)
- 盘中缺口表示采集过程曾中断
- 低活跃时段出现小于 1 分钟的缺口属于正常情况
- 检查 systemd 日志,查看是否有对应的重启事件
Wine 注意事项
以下是极其重要的反模式——违反这些规则会导致静默崩溃或数据丢失:
- 绝不要在 MQL5 中使用
%I64u或%I64d格式说明符——会导致 Wine 静默崩溃。请改用IntegerToString()。 - Wine 无法跟随符号链接访问文件——部署 EA 和 DLL 时请使用实际文件副本
- 无头 Linux 需要 Xvfb 虚拟帧缓冲——即使未连接显示器,MT5 GUI 也需要显示设备
- compile.sh 使用 Wine CLI 进行编译——无需 MetaEditor GUI
- 在 Wine 下,即使编译成功,MetaEditor 返回的退出代码也会是 1——请检查编译日志
- 编译日志为 UTF-16LE 编码——使用
iconv -f UTF-16LE -t UTF-8读取 - 必须设置
DISPLAY=:99(Xvfb 虚拟显示编号)
部署流水线
使用 /mql5:mql5-ship 斜杠命令完成完整部署:
- EA 源码变更时使用
--ea-only - Rust DLL 变更时使用
--dll-only - 完整流水线:提交 -> 推送 -> 在 上拉取 -> 编译 -> 验证
详细部署步骤(SSH 命令、文件复制、编译)见本地技能 headless-mt5-remote。为避免内容过时,此处不再重复。
监控命令
检查 MT5 服务状态
systemctl --user status mt5
检查今天的 tick 文件
ls -la ~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/$(date +%Y)/
统计最新文件中的 tick 数量
duckdb -c "SELECT count(*) FROM read_parquet('path/to/file.parquet')"
检查恢复片段
ls ~/.cache/opendeviationbar/ticks/FXVIEW_EURUSD/$(date +%Y)/*_[0-9].parquet 2>/dev/null
查看 systemd 服务链
systemctl --user list-units --type=service | grep -E "xvfb|xfce|x11vnc|mt5"
检查 MT5 日志中的错误
journalctl --user -u mt5 --since "1 hour ago" --no-pager
范围边界
- 本技能: 运维、监控、故障排查
- 本地技能
headless-mt5-remote: 部署步骤(SSH、文件复制、编译) - 技能
fxview-parquet-consumer: 数据使用模式(架构、DuckDB 查询)
故障排除
| 问题 | 原因 | 解决方案 |
|---|---|---|
| MT5 服务无法启动 | 显示堆栈未运行 | 先启动 xvfb,然后依次启动 xfce、x11vnc 和 mt5 |
| EA 未收集报价 | 品种未添加到 Market Watch | 在 MT5 中打开该品种的图表,然后重新附加 EA |
| Wine 在 PrintFormat 处崩溃 | 使用了 %I64u/%I64d 格式说明符 | 替换为 IntegerToString() |
| DLL 加载失败 | 缺少 tick_writer.dll | 将 DLL 复制到 MQL5/Libraries/(物理复制) |
| 报价数据存在缺口 | EA 重启或网络问题 | 检查 journalctl,确认恢复片段存在 |
| 恢复文件 _1_2 | 重启后正常 | 所有片段均有效,可在 DuckDB 中合并 |
| 编译日志无法读取 | UTF-16LE 编码 | 使用 iconv -f UTF-16LE -t UTF-8 |
| Xvfb 未运行 | 服务崩溃或未启用 | systemctl --user start xvfb |
执行后复盘
此技能完成后,在关闭前检查:
- 命令是否成功? — 如果没有,请修正导致失败的说明或错误表。
- 参数或输出是否发生变化? — 如果底层工具的接口发生了变化,请更新用法示例和参数表,使其保持一致。
- 是否需要变通处理? — 如果你不得不临时采用其他方法(不同的标志、额外步骤),请更新此 SKILL.md,避免下次调用时需要同样的变通方法。
仅在问题真实且可复现时进行更新,不要猜测。