ATC冠军访谈:MQL5 scalping EA揭秘
从AZXY策略看MT5自动化交易实战思路
受访者背景与进入MT5的契机
Andrea Zani(论坛ID:sbraer)来自意大利,职业是一家国际公司的软件开发者,该公司主要从事基金投资于证券及其他金融工具的软件开发。他从1996年就开始开发各类软件,技术栈以微软平台为主,熟悉C#等语言,同时也对Linux、开源技术与Web应用有广泛兴趣。在自动化交易锦标赛(ATC 2011)第十一周时,他的EA排在第六名,权益约47,000美元。值得注意的是,他是少数直接从MetaTrader 5和MQL5开始、并未使用过MT4的参赛者。大约一年前他才接触MT5平台,几个月前由朋友David(brainkiller)引入外汇世界,此后便开始用MT5编写自己的EA,从最简单版本逐步迭代到复杂策略。
这一段背景对中文交易者的启示是:MT5与MQL5并不要求你先有MT4经验。如果你本身具备C++或C#等面向对象语言基础,转向MQL5的曲线非常平滑。Andrea强调自己因为有C++经验,学习MQL5没有任何障碍,这说明语言迁移成本低于许多人想象。
对MQL5平台的评价与改进期望
Andrea明确表示喜欢MQL5,认为它足够强大,尤其对自己这类有面向对象经验的人非常友好。但他也提出了三个具体诉求:第一,希望有更先进的EA调试工具;第二,希望回测能输出更丰富的报告;第三,希望MT5提供插件系统,让他可以扩展平台、按自己想要的方式对回测结果进行分组、排序和绘图分析。此外,他期待全球更多外汇券商采用MQL5。
这些诉求在今天的MT5中部分已经实现,例如策略测试器已支持图表化自定义报表与云优化,但当时(2011年)的确是短板。对于现在的中文开发者来说,应当充分利用MT5自带的标准库、可视化回测以及第三方开源框架,弥补原生调试体验的不足。
- MQL5语法接近C++,面向对象易上手
- 回测报告与调试工具在当年较弱,如今已大幅改善
- 插件化扩展至今仍非官方核心能力,需借助自定义脚本或外部工具
AZXY策略的核心设计逻辑
AZXY这个名字中,AZ是Andrea Zani名字首字母,XY代表坐标系,因为该EA的基本思想是通过研究前一日最高价与最低价的坐标来决定订单类型。策略极其简单:一天一笔订单。最终参赛版本利用前一日min/max价格以及一个特殊形态(pattern)来判断开多还是开空;代码中还嵌入了另一个权重更高的形态,用于研判次日的趋势方向。
从交易记录看,该EA接近剥头皮(scalping):每笔利润通常200–500美元,持仓一般不超过40分钟。它用允许的最大手数开仓,并在6–10点(作为参数设定)的小利差下锁定利润。它不使用超时平仓,而是等待预设盈利;若到晚间10点仍未盈利,则自动平掉敞口。也正因为这种短平快逻辑,EA未设置止损(Stop Loss)。
分拆下单与成交机制的特殊处理
在ATC 2011 prelim测试阶段,Andrea发现EA在大手数(超过3手)时存在问题,因此修改代码将大单拆成小单。例如我们看到历史中有两笔各2.5手的订单,而非一笔5手。但在平仓时,EA会发送一个更大的平仓指令试图一次性关闭整个仓位。这种拆开进场、合并出场的方式,既规避了当时测试环境的限制,也简化了仓位管理。
对于中文交易者,这揭示了一个实用经验:当经纪商或测试环境对单笔订单手数有限制,或滑点异常时,可以通过分仓逻辑提升鲁棒性。在MQL5中,你可以使用PositionSelect、OrderSend的多个ticket循环,以及CTrade类的部分平仓方法来实现类似控制。
// 简化示例:分拆下单逻辑骨架
void OpenSplitOrders(double lots, int splitCount)
{
double lotStep = lots / splitCount;
for(int i=0; i<splitCount; i++)
{
trade.Buy(lotStep, Symbol());
}
}
风险保护与回撤的真实教训
Andrea承认AZXY没有传统止损,仅靠晚间10点强制平仓与盈利即走的规则控制风险。锦标赛初期那一笔亏损,正是因为价格超出限额4点触发了平台的Stop Out规则,而随后EURUSD反转——若非该规则,EA本可盈利离场。这让他损失了半数本金。由此可见,即便在算法层面‘不设止损’,平台规则与保证金机制仍可能替你‘被动止损’。
对实盘开发者的核心教训是:任何EA都必须明确最大可接受回撤,并通过仓位上限、保证金监控或隐性止损来兜底。依赖‘不触止损’在低频波动中或许可行,但无法对抗跳空与流动性枯竭。
多币种观点与每日决策周期
AZXY只交易EURUSD单一品种。Andrea认为多币种EA未来很有前景,但当时他只看到yyy999的多币种EA真正稳定盈利,自己尚未决定是否尝试。关于每日周期,他透露EA用历史形态将过往交易日与上一年同期模式对比,从而决定买卖。整个EA代码不足500行,逻辑高度浓缩。
这种‘一年同期形态比对’属于季节性或周期统计思路,在MQL5中可通过读取前一年同日期的MqlRates数组实现。对于想复刻类似思路的中文开发者,建议使用CopyRates函数获取历史柱,并用结构体保存形态特征值,避免硬编码日期。
// 获取前一日高低价示例 MqlRates rates[1]; CopyRates(Symbol(), PERIOD_D1, 1, 1, rates); double prevHigh = rates[0].high; double prevLow = rates[0].low;
商业化打算与MQL5市场展望
访谈中不少观众留言想购买AZXY。Andrea表示正在考虑出售,如果决定卖,会选用MQL5.community的Market服务。这反映出早期开发者对官方分发渠道的认可。如今MQL5市场已成熟,支持EA、指标、脚本的售卖与激活次数控制,成为中文开发者变现的合规路径。
他同时认为自己的EA已无望进入前三,只希望保住前十,且剩余五天不能再有50%回撤。他欣赏Pirat与GradyLee的EA,后者当时零亏损。对于来年ATC,他已有新EA构想。这段访谈整体展示了一名严谨软件工程师如何以模块化、小步快跑方式迭代交易算法。
- 单一品种聚焦可降低复杂度,适合新手模仿
- 代码少于500行说明策略清晰优于堆砌指标
- 官方市场是合规变现首选,早布局早受益
给中文MQL5学习者的实操路径
综合访谈,我们建议中文交易者按以下路径吸收Andrea的经验:先巩固MQL5语法与CTrade/ CPositionInfo等标准库;再用历史数据复现‘前日高低坐标+形态比对’的日频决策;接着以分仓方式处理大手数限制;最后在策略测试器中严格统计回撤,并补入实盘必需的隐性风控。切勿直接照搬无止损参数,而应把AZXY当作‘结构设计范本’而非‘实盘圣杯’。
另外,积极参与如ATC类的竞赛或用模拟账户跑分,能快速暴露代码在极端行情下的缺陷。Andrea正是通过 prelim 测试才发现大单bug,这种‘竞赛即压力测试’的思路,比闭门造车更高效。