mcpField
T
tick-collection-ops

tick-collection-ops

github.com/terrylica数据与数据库165 次安装1 天前更新
代码仓库

关于 tick-collection-ops

用于监控和排查 MT5 Tick 采集的运维 Skill,涵盖数据缺口、恢复文件和服务状态。README 指出,文档中的 Linux/Wine 部署已被经纪商 VPS 设置取代。

主要功能

  1. 01Tick 采集健康检查
  2. 02使用 DuckDB 检测缺口
  3. 03崩溃恢复与水位线指引
  4. 04Parquet 文件轮转说明
  5. 05Wine 与 MT5 故障排查

适用场景

  1. 01调查 Tick 缺失或延迟
  2. 02重启后检查恢复分段文件
  3. 03检查 Tick 文件与数量
  4. 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 重启时:

  1. EA 调用 tw_get_last_time_msc,从上一个 Parquet 文件的页脚读取恢复水位标记
  2. 水位标记是最后写入的 tick 的时间戳——从该时间戳继续恢复
  3. 如果发现今天已有文件,新文件会添加 _1、_2 后缀(不会覆盖)
  4. 所有恢复片段都是有效、完整且带有页脚的 Parquet 文件
  5. 恢复水位标记可防止重启后出现重复 tick
  6. 关机和重启之间的缺口会通过从水位标记开始调用 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

执行后复盘

此技能完成后,在关闭前检查:

  1. 命令是否成功? — 如果没有,请修正导致失败的说明或错误表。
  2. 参数或输出是否发生变化? — 如果底层工具的接口发生了变化,请更新用法示例和参数表,使其保持一致。
  3. 是否需要变通处理? — 如果你不得不临时采用其他方法(不同的标志、额外步骤),请更新此 SKILL.md,避免下次调用时需要同样的变通方法。

仅在问题真实且可复现时进行更新,不要猜测。

评论

支持 Markdown