Ⅰ · 概念地基 — 1.1

MT5 藏起来的运行回路

写 EA 时看得见的只有一个函数。理解自研平台,要先看清这个函数坐在什么东西中间。

一个 EA 的全部生命,在开发者视角里是这样的:报价来了,OnTick() 被调用,读指标、算条件、下单。终端负责其余一切,而“其余一切”从不需要命名,因为它不可替换、不可测试、也不出错——至少看起来如此。

把它画出来,被隐藏的部分就显形了:

MT5 —— 灰色部分由终端承担,无需命名经纪商连接报价接收历史存储指标重算图表渲染账户同步触发OnTick()开发者编写的全部内容OrderSend()订单状态跟踪重试与重连成交回报这八个灰格在自研平台里每一个都有名字、有归属、可以单独替换与测试——这既是自研的全部好处,也是它的全部成本。
被隐藏不等于不存在。连接管理、报价缓冲、历史落盘、指标重算、订单状态跟踪——这些环节在 MT5 中一直在运行,只是没有接口、不可替换、出错时也不会通知你。

为什么“有名字”是有价值的

把一个环节命名成独立组件,换来三件在 MT5 里做不到的事:

  1. **可替换。**行情来源从经纪商换成专业数据商,只换一个组件,策略代码不动。MT5 里行情就是经纪商给的那份,没有第二个选项。
  2. **可单独测试。**信号计算脱离终端就能跑——喂进一段历史,看输出。不需要编译 EA、不需要启动策略测试器、不需要撮合。
  3. **可放置横切逻辑。**风控要管住“所有策略的所有订单”,前提是存在一个所有订单都会经过的地方。MT5 中不存在这样一个点,所以风控只能写在每个 EA 内部。
代价同样真实。八个组件意味着八份配置、八个可能出故障的地方、八处需要监控。MT5 把它们焊死,换来的是零集成成本——这是一个真实的工程取舍,不是落后。

这条回路在两个框架里的样子

后面 Ⅱ 部分会分别展开,这里先给出对应关系,作为阅读时的坐标:

回路环节 Nautilus LEAN
连接与报价接收 DataClient(adapter) Data Feed / Brokerage
数据分发 DataEngine + 消息总线 Slice 装配
策略执行 Strategy QCAlgorithm / Alpha 模型
风控 RiskEngine(订单闸门) RiskManagementModel(意图改写)
下单与状态跟踪 ExecutionEngine + ExecutionClient ExecutionModel / Brokerage
持仓与账本 Portfolio + Cache Portfolio / Securities
渲染 两者都没有 —— 自研平台的前端是从零开始的部分