交易机器人原型架构:基类与模块化
用三大支柱与基类封装,把 EA 开发缩到几小时
任何交易系统都能简化成开仓与平仓。把系统抽象成环境→决策→动作的循环,EA 不必知道状态怎么来的,只看当前参数决定现在要做什么。
一、任何交易系统都能简化成两件事
开仓与平仓。围绕这两件事组织代码,比堆满 if-else 的分支清晰得多。
二、三大设计原则
- 服务于条件(事件驱动):按环境决定动作,不用 while 等待;
- 尽可能抽象:用宏函数取代类型/品种依赖,做到独立于交易;
- 逻辑细分:开仓/追踪/平仓拆成独立模块,互不耦合。
三、CExpertAdvisor 基类框架
工作循环:报价/定时器进入 → 过滤 → 处理持仓模块 → 调事件块。分宏函数(BaseType/ReversType 等自动转类型)、服务函数(算手数/改止损)、事件处理模块(OnTick/OnTrade/OnTimer 等)。
四、EA 的事件源
- 指标(均线交叉、时间、网络数据);
- 现有订单/持仓及状态(盈亏、是否存在);
- 外部事件(按钮、图表对象、交易错误);
- 对应 OnTick/OnTrade/OnChartEvent/OnTimer/OnBookEvent/OnTester。
五、两个可运行范例
- 指标型 MA EA:上穿 MA 开、反向穿平、限交易时段、TS 追踪;
- 鞅型 EA:首单买初始手,盈则同向往、亏则反向×系数,用 OnTrade 接单提效。
六、用三层分离搭原型
可复用的 EA 原型通常拆三层:CSignal 只负责出 1/-1/0 信号、CStrategy 把信号翻译成下单意图、CTrade 执行。信号层不碰下单、执行层不判方向,单测和替换策略都轻松。原型阶段先打通这一条流水线,再往里塞具体指标。
七、信号/风控/执行三层模块
任何交易系统都能拆成三层:信号层出方向、风控层定仓位与止损、执行层负责下单与对账。三层解耦后,换信号不影响风控,改手数算法不动信号,维护成本骤降。 反过来说风控层也独立演进:你今天用手数百分比、明天换成波动率目标,信号层完全无感。这种「各自演进不互相污染」正是分层架构最大的长期价值。
新手常把所有逻辑塞进 OnTick 一个函数,几百行纠缠在一起,出 bug 无从下手。分层是 EA 能不能长期迭代的分水岭。 一旦分层后,你会发现「加一个新信号」「换一种平仓逻辑」都变成改一个独立文件,而不用通读几百行纠缠代码,迭代速度天差地别。
八、基类接口设计
用 CExpertAdvisor 这类基类定义虚函数 OnTick / OnTrade / OnInit,子类只填策略。基类管生命周期与公共工具(日志、手数),子类管个性。继承让多个 EA 共享同一套健壮骨架。
九、用组合而非继承扩展信号
信号多的时候,与其为每种组合写新子类,不如把信号做成可插拔组件,EA 在配置里选哪几个、怎么融合。组合比继承更灵活,新增信号不必动旧代码结构。
工程上推荐「基类管框架 + 组件做策略」:框架稳定不变,策略像积木一样替换。这也是专业 EA 开发商的通用做法。 组件还能热插拔:同一框架挂不同信号组件,A/B 对照跑回测,哪个真有效一目了然,决策从「我觉得」变成「数据说」。