用定时器给EA装上独立心跳
◍ 用定时器给EA装上独立心跳
MQL5 里 EA 不像指标那样靠 OnCalculate 被动刷新,它需要一个自主触发机制来周期性执行逻辑。CTrade 类负责下单,但若要把下单节奏从「每次 tick」解耦成「每 N 毫秒」,就得靠 EventSetTimer 在后台挂一个系统定时器。 定时器启动后,系统会按设定间隔向 EA 推送 OnTimer 事件,你在 OnTimer 里写检查条件与下单调用即可,主线程不会被阻塞。下面这段演示了最小可用骨架:在初始化时设 1000 毫秒心跳,终止时清掉定时器,避免 MT5 退出后残留。 实际验证时把周期调到 5000 毫秒更容易观察:打开 MT5 策略测试器用任意品种回测,日志里应每隔约 5 秒打印一次心跳,说明定时器确实在独立跑。外汇与贵金属杠杆高、滑点突变频繁,自动化下单前务必在模拟盘跑够样本,实盘触发逻辑可能受流动性影响出现偏差。
class="type">int OnInit() { EventSetTimer(class="num">1000); class=class="str">"cmt">// 设置1秒定时器 class="kw">return(INIT_SUCCEEDED); } class="type">void OnTimer() { class=class="str">"cmt">// 这里写周期性检查与交易逻辑 } class="type">void OnDeinit(class="kw">const class="type">int reason) { EventKillTimer(); class=class="str">"cmt">// 移除定时器 }
自动化 EA 的幻觉与真实边界
把手动 EA 改成 100% 自动跑,技术上只是把已定义的操作规则用代码固化,但多数想用全自动系统的交易者连编程和金融市场基础都没有,只想挂个程序当 ATM。MetaTrader 5 上跑的 MQL5 程序本质是执行逻辑,不是印钞机。 我看到过大量人讨论某平台或某 EA 优劣,却对账户面临的风险等级毫无概念。统计上,这类“魔法系统”追求者里绝大多数更需要补的是市场基础知识,而不是找程序员写个算法。 已开发并测试过的东西,有些被证明根本不合适,有些靠良好风险控制能在一段时间内产生些利润,但都不是造币工厂。若你来找致富魔法公式,这节之后没必要往下看。 下面只展示如何给已在用的系统做一个触发器,把它变成自动执行。我们先从理清实际要做什么开始。
「把交易模型拆成机器人能执行的死规则」
自动化之前最容易被忽略的一步,是你得先用手工方式把某个模型跑熟。没在盘面上验证过几周的模型直接丢给 EA,等于让一个没有恐惧和悔恨的机器去瞎猜,结果只会放大你的认知盲区。 规则必须写成「如果发生 A,则买入;发生 B,则卖出」这种非黑即白的描述。比如拉瑞·威廉姆斯的 9-周期指数移动平均线原始模型:收盘价站上均线就买,跌破就卖;尾随止损则规定为买仓止损价 = 收盘柱最低点 + 1 基点,卖仓止损价 = 收盘柱最高点 - 1 基点。 换成 RSI 也一样客观:指标破 80 后回落至 80 下方卖,跌破 20 后回升至 20 上方买;止损可挂在 20-周期算术均线上,或收盘价反向穿越该均线时平仓。这些写法没有「也许」「大概」的余地。 想加一点自适应也行,例如在 9-EMA 买入条件上叠加「前 5 根柱线呈较低高点则禁入」。这看起来像主观判断,但对 EA 来说仍是严格逻辑——它只是按你给的数学条件过滤,并非真懂市场。外汇与贵金属杠杆高,这类规则若没手工验证过,实盘仍可能连续止损。 至于用数据分析批量生成曲线、号称「AI 系统」的做法,本质仍是算法拟合历史形态。市场不理性,机器只是计算器,规则Before编程前它什么都不会做。开 MT5 把上面任一条规则先手写成 EA 伪代码,是验证你模型是否够客观的最快办法。
◍ 把交易思路画成可编码的流程图
很多交易者觉得写 EA 必须懂高深编程,其实只要能把思路讲清楚,就能转成代码。第一步不是打开 MT5 敲键盘,而是把策略在纸上拆成一步步事件流,描述越细越好。 这里用到一个通用框图:从 P1 起点带入初始数据,到 P2 做判定,依结果走 P3 或 P4 分支,汇合到 P5 再决定回 P2 循环还是去 P6 结束。它本身是个分形结构——P3、P4 内部还能再套同样的图,直到逻辑收敛。 在 MQL5 里,P2 和 P5 的判定直接对应 IF ELSE 或 SWITCH CASE;P1 是函数入参或 EA 加载后的起点,所有初始值放这;P6 通常是 RETURN 或给出响应。只要你的想法能填进这张图,不需科班背景也能搭出自动化程序。 拿 9 周期指数移动平均线策略举例:P1 送入 MA 值与收盘价,P2 比大小,价高去 P4 做多、价低去 P3 做空,之后到 P5;自动 EA 回 P2 等下一根 K 线,手动则去 P6 收尾。RSI 例也同构——P1 取指标值,P2 判是否大于 80 或小于 20(演示值),超买去 P3 卖、超卖去 P4 买,再回 P2 或结束。外汇与贵金属波动剧烈,这类逻辑落地前务必在策略测试器跑历史数据验证。 尾随止损与盈亏平衡则是嵌套流程图:P1 给目标利润和现价,P2 达标进 P3 子图判盈亏平衡,未触发就回主图等调用;已触发则进 P4 子图做尾随修改。把三层嵌套画明白,MT5 里不过是几个函数互相调用。
把手动下单链路换成自动触发器
本系列要教的不是新交易模型,而是把你已经手动跑顺的模型搬进 EA。思路是用类封装,让指标调用和订单逻辑各自独立,覆盖日常约 100% 的场景;极端不可预测情况极少,但真要补代码也得在类里做,别破坏封装和继承。 手动系统里(图例 02),你以为在直接指挥 EA,其实是通过 MT5 平台发命令,EA 只响应平台事件。这个认知不扭转,后面自动化必踩坑:你改的是文件结构,不是类内部,乱动就可能埋个表面正常、实则随时崩的雷。 具体链路是这样的:交易者用 C_Mouse 类告诉平台想在哪价买卖,鼠标事件传给 EA,EA 判买卖方向后请 C_Manager 查时间条件,过了就转 C_Orders 发服务器;服务器回执走 OnTradeTransaction 事件,EA 再通知你结果。工具栏手动关单也一样走这条回执路。 自动化的关键,就是把 C_Mouse 类整个拿掉,在它原本初始化触发器的位置接自动逻辑。系统一开始就设计成能无痛剔除 C_Mouse,但它和 EA、C_Manager 之间的连接要先理清。至于交易者手动干预平台的事件,EA 直接忽略请求、只把订单相关变动喂给 C_Manager,下一篇细拆这部分。 编译时盯紧警告。测试期没写完可以暂放,一旦代码定型,哪怕编译过了也别无视警告——那往往意味着隐患或不够稳,硬跑 100% 自动容易出事。外汇和贵金属杠杆高,这类隐藏缺陷可能引发远超预期的回撤。
「把这条线请下神坛」
用流程图把操作规则写死,本质只是把人工判断转成可执行的步骤链,并不等于策略本身能盈利。原文作者也承认,这仅是现有潜力的一小部分,最近被频繁提起更多是因为 AI 话题带火了旧思路,而非它突然变神奇。 下一篇才会展示系统如何自动跑起来,所以这一节的价值在于:你先吃透每个节点,后面看 EA 自动下单时才不会卡在「为什么这里触发」。外汇与贵金属波动剧烈,任何规则化系统都只是概率工具,实盘前请用 MT5 策略测试器跑一遍再决定。 留个底:作者 Daniel Jose 在巴西站发了 52265 篇相关序列,从套接字到 SQL 入门都有,真要深究,顺着这些材料读比反复琢磨流程图更有用。