「EA 自动交易的基础骨架」
「EA 自动交易的基础骨架」
在 MT5 里跑一套自动策略,核心载体是 EA(Expert Advisor)。它不像指标只画线,而是能在行情跳动时直接下单、改仓、撤单,属于终端里权限最高的程序形态。 一套 EA 的工程结构通常分为三层:初始化入口 OnInit()、主循环 OnTick()、退出清理 OnDeinit()。OnInit 只在加载时跑一次,用来校验参数和申请资源;OnTick 每次报价触发,是策略逻辑的主战场;OnDeinit 在卸载或重编译时释放句柄,漏写容易撑爆内存。 以 2023 年 3 月官方示例库统计,社区发布的 EA 类文章月均阅读约 6.8k,说明实盘自动化需求一直在线。不过外汇和贵金属杠杆高、滑点跳空频繁,EA 回测漂亮不等于实盘能活,任何信号都只是概率倾向。 新手常犯的错是把所有逻辑塞进 OnTick,导致每跳重复计算历史。正确做法是把不变的量放 OnInit 预计算,OnTick 只处理增量。这样 CPU 占用和延迟都会降一个量级,尤其在 XAUUSD 这种点差跳动的品种上更明显。
自动EA的第一道坎不在代码
不少读者以为写个无人值守的EA最难的环节是MQL5编程,其实从大量新手求助来看,卡点往往在前端:他们连这类系统的基础风险都没厘清。所谓全自动EA,是指不依赖交易者直接或间接干预就能买卖资产的程序,外汇与贵金属市场杠杆高、跳空频繁,这类系统一旦逻辑有漏洞,亏损可能远超人工盯盘。 我接触过的爱好者,疑问高度雷同——但很多人对‘自动化系统该怎么落地’存在完全错误的认知,甚至误以为交给代码就能稳稳执行策略。这里要先泼冷水:创建EA是极漫长的任务,需要大量研究与投入,不是华丽图表或统计话术能掩盖的。 最大的问题从不在程序员身上。亏损常源于请求开发的人所设计的交易系统本身经验不足——换句话说,EA只是执行器,烂逻辑不会被编程救活。原生MQL5够用,但前提是你想清楚让机器跑什么。
◍ EA 内部其实只有两块:下单与触发
自动 EA 跑起来并不神秘,拆开看就两个内部结构:订单系统 + 触发系统。订单系统对所有 EA 都一样,负责把单子发出去、管仓位;触发系统才是各家的差异点,决定什么时候该动手。 图例 01 的思维逻辑示意图把这套关系画得很直白——EA 不是黑箱,而是「条件判断」驱动「下单动作」的闭环。很多人一上来就把两块搅在一起写,尤其是新手,结果逻辑乱了连错在哪都找不到。 务实的做法是先把手里的订单系统做稳,确认它可靠,再集中火力折腾触发系统。后者才是出问题最多的地方,也是你后续调参、接小布 AIGC 信号的主战场。外汇和贵金属杠杆高,EA 任何一环失效都可能放大亏损,拆分清楚才能定位故障。
「先把订单系统磨稳再谈自动化」
MT5 平台自带尾随止损机制,但必须逐笔持仓手动开启并设值,在还没自己开发测试前,先用这个原生功能最稳。盈亏平衡和尾随止损都属于订单系统里「可以有但不必必有」的模块,本系列不展开,建议去读从头开发交易 EA 的系列把每一步吃透。 订单系统的实体起点是图表上的指示线,用来实时看 EA 在干什么,一路延伸到尾随止损逻辑,这部分必须你独立写、独立在模拟账户上人工跑。模拟账户没有真实盈亏,但测试密度要拉满,所有故障、误报、图表画错都要修到你能完全驾驭为止。 别急着往下走。系统没崩过、你也没被错误信号误导过之前,停在这一步调参。真上了实盘外汇或贵金属,订单系统崩溃的唯一责任人就是你本人,这类品种高杠杆高风险,平台和市场都不会替你背锅。 等你手里的订单系统按预期跑顺了,再碰下一步的触发系统——它逻辑更简单,但该有的预防措施一样不能省。
触发系统别堆复杂度
触发系统最容易被新手神化:接上订单模块后,EA 仿佛成了不眠不休的“真交易员”。但真正有价值的不是编程外壳,而是背后的数学思维——拉里·威廉姆斯当年靠简单算法盈利的故事人人爱听,可如今市面上的算法远比他那时高效,老方法在严控风险下仍可能赚钱,只是你必须让它足够简单。 越简单的触发逻辑越容易回测。若无法归纳成一个可编程的数学公式,硬塞“指标 Z 联动资产 X、监控价位 P 再加市场深度意图 W”这类怪异规则毫无意义,你根本测不出它到底行不行。 简单永远是第一选择。复杂触发器可能在极端行情下发疯,短时间倾泻巨量买卖单,不只爆仓还会拖垮本金。尤其要避开持续同向加仓摊平成本的触发结构,理想状态是 EA 开新仓前先平掉旧仓。 可用时间锁或持仓屏蔽来阻止重复发单,否则 EA 易陷无限循环,几分钟甚至几秒亏光。1987 年“黑色星期一”就是触发系统连锁踩踏引发,设计前先搞清这段历史——别信“量化必胜”的忽悠,圣杯不存在,外汇和贵金属杠杆市场高风险,真有稳赚大厂早重金垄断了。
◍ 写EA前先吃透这四件事和两种态度
很多人在MT5里栽跟头,不是因为MQL5难,而是把编程当成堆命令:以为只要写出来,行情就会按希望走。实际恰恰相反,越是复杂的EA,越该拆回最基础的构件。 MQL5语法接近C/C++,入门真正要掌握的只有四类知识:先用简单命令打底,再碰复杂结构;搞清IF、FOR以及=、+、-、/、*、%这些基础运算符;明白位与字节的差异,以及!、|、&、^这类布尔运算的用处;分清函数与过程、全局与局部变量、事件处理和过程调用的边界。任何EA逻辑,最终都能归纳进这四块,归不进去的就是架构走歪了。 光有技术不够,还得有两种底色:一是真去读MQL5文档,别凭记忆瞎写;二是把任务拆碎、写好注释、不理解的先标出来,并且无论如何都跑测试、记结果。外汇和贵金属杠杆高、滑点跳空频繁,没测过的订单逻辑直接上实盘就是赌。 最后一点最反直觉——谦虚。你永远不可能知道全部,总有人写得比你好。接受这点,才不会在报错时硬凹‘系统问题’,而是回头改自己的结构。
「从空白 EA 摸透事件驱动骨架」
打开 MetaEditor 后别急着抄网上的现成 EA,从 Experts 目录右键新建一个干净工程才是正路。MetaEditor 自动生成的骨架里只有三个过程:OnInit、OnDeInit、OnTick,这正是 MQL5 事件驱动模型的入口与出口。 MQL5 不是顺序执行脚本,而是等 MetaTrader 5 平台抛事件再响应:挂 EA 触发 OnInit 且仅调用一次;从图表移除触发 OnDeInit 并带回 reason 代码;每次服务器有新跳价就触发 OnTick。把重计算全堆进 OnTick 是多数 EA 崩溃的根源,运行时错误往往难复现。 下面这段是新建工程后几乎原样落地的代码,三函数体皆空,#property 只管面板显示不影响逻辑: #property copyright "Daniel Jose" #property link "[MQL5官方文档] #property version "1.00" //+------------------------------------------------------------------+ int OnInit() { return INIT_SUCCEEDED; } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ 写 EA 至少要留 OnInit 与 OnTick 两个事件,OnDeInit 视特殊清理需求再加。外汇与贵金属杠杆高、跳价稀密不均,OnTick 过载会直接拖垮实盘稳定性,建议先在策略测试器用历史数据跑通空骨架再填逻辑。 下一篇会接订单系统,直接从图表发买卖单,但这一步的目录习惯和事件认知若没建立,后面代码你只会越看越乱。
class="macro">#class="kw">property copyright "Daniel Jose" class="macro">#class="kw">property link "[MQL5官方文档] class="macro">#class="kw">property version "class="num">1.00" class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">int OnInit() { class="kw">return INIT_SUCCEEDED; } class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnDeinit(class="kw">const class="type">int reason) { } class=class="str">"cmt">//+------------------------------------------------------------------+ class="type">void OnTick() { } class=class="str">"cmt">//+------------------------------------------------------------------+