ATC冠军访谈:多币种EA与MQL5实战
从程序员视角拆解稳定EA的构建逻辑
受访者背景与交易历程
Valery Mazurenko 是一名资深程序员,曾在交易商(Dealing Center)工作约两年,参与开发了两版客户端交易平台,其中一版他至今仍在使用。在 MQL2 时代,他开设了第一个真实账户运行自己的机器人。六年间他编写了大量不同类型的 EA,最终得出一个朴素但重要的结论:EA 不需要复杂,理念越简单,结果往往越稳定。早期他将交易视为爱好,近半年才认真考虑将爱好货币化,目标是写出可实盘稳定运行的 EA。
他在 ATC 2006 使用了单币种 EA,而从 ATC 2007、2008 到 2010 都提交了多币种 EA。在 2010 年锦标赛第一周,他凭借名为 ch2010 的多币种 EA 登上榜首。这种持续参赛并迭代的思路,对普通交易者很有参考价值:把比赛当作压力测试和公开验证场,而非一夜暴富途径。
数学在交易中的真实角色
Valery 指出,构建资金管理与风险管理策略时,严肃的数学是必要的;但要创建相对无损的系统,并不要求你是数学家,而是需要两点:健全的视角与清晰的头脑。很多论坛上关于锁仓、马丁、网格、剥头皮的激烈争论,在他看来答案显而易见,但许多交易者看到测试器或 demo 上的漂亮曲线就陷入催眠状态。
他认为开发盈利策略需要数月试错与测试,数学不好并不是障碍。但他特别批判了一种有害假设:例如规定回撤不得超过入金 30%。他提出,可以用 Stop Out 充当 Stop Loss,而将那 70% 闲置资金存银行拿利息。资金管理必须针对每个策略单独计算,盲目套用通用规则是坏结果的根源。
为什么选择多币种 EA
Valery 没有偏好的货币对。任何新想法都会先在随机选择的货币对(不仅是外汇,也包括 CFD)上测试,失败则丢弃。两年爱好经验让他感觉多币种 EA 更稳定——虽非严格证明,但他要求策略在多个随机品种上均表现良好才视为有效。他认为多币种对程序员更有发挥空间,长期看生存概率更高。
从工程角度看,多币种意味着分散特异性风险:单品种黑天鹅或季节性呆滞不会摧毁整体。但代价是参数空间变大、优化更复杂,对代码架构要求更高。这正是他推崇 MQL5 面向对象的原因。
- 任何想法先在随机品种测试,失败即弃
- 只在多品种均盈利才认定策略有效
- 多币种分散风险,但需更清晰代码架构
- ATC 2007/2008/2010 均提交多币种 EA
锦标赛经验与行情认知
他总结的第一条经验:下跌是趋势季,横盘策略会失效(参考 2006、2007);但迟早会出现回调与反转(如 2008),杀死无法反应的系统。他并不认为自己过往参赛不成功,因为总在找正面经验。2010 年他的机器人以每对 0.1 固定手数、无 averaging,年内近乎三倍,最大回撤 33%,因此有理由相信锦标赛结尾为正。
这条经验对中文交易者的启示是:不要迷信一种市况下的回测美景。必须考虑趋势/横盘切换的鲁棒性,以及在反转中幸存的逻辑分支。
EA 交易原则与模糊性设计
他的 EA 除'趋势是朋友'外,故意引入两个随机(模糊)因素,使系统变'粗糙'。有经验开发者能很快发现第一个模糊因素,第二个他保密。此外使用了仓位 averaging,但他强调这不是策略核心,而是锦标赛的激进资金管理。这种'故意不完美'的思路,实际是对过拟合的一种防御:纯精确规则易在实盘失效。
模糊逻辑与他研究生方向一致。在实盘化时,这种粗糙性可能反而提高鲁棒性,避免对历史噪声的过度记忆。但这不等于随便加随机,而是有数学背景的受控随机。
锦标赛中的资金管理方案
锦标赛中他没有用严肃资金管理,而是在挂单时占用 1/15 自由保证金。有一个小安全垫:若手数小于 0.1,只要有其他订单持仓就不四舍五入到 0.1。他举例可扩展条件:当存在其他持仓且 FreeMargin < 0.7*Balance 时不新开单。若锦标赛成绩好,他会认真做资金管理,尤其研究 Ralf Vince 的'最优 F'在多币种 EA 的应用。
最优 F 对单币种无 averaging 的策略不难算,但多币种叠加 averaging 时计算复杂。这揭示了一个现实:很多学术资金管理方法在工程落地时需要大量定制。
// 简化的安全垫逻辑示例(非原文完整代码)
if(PositionTotal() > 0 && AccountInfoDouble(ACCOUNT_FREEMARGIN) < 0.7 * AccountInfoDouble(ACCOUNT_BALANCE))
{
// 不新开订单
return;
}
挂单逻辑与限价单偏好
他早期就决定只用限价单:无滑点、无重新报价问题,大幅简化代码。限价单顺趋势挂,等待小回调;averaging 订单永远在持仓开价之后。这种纯粹限价单风格在现今 ECNDMA 环境依然有生命力,尤其适合不想被撮合不确定性干扰的策略。
- 仅用 Limit 单,规避滑点与 requote
- 顺趋势挂单,等小回撤
- averaging 单置于持仓价后方
- 代码复杂度显著降低
MQL5 学习曲线与面向对象价值
作为 C/C++ 与 Delphi 程序员,他用两个晚上学会所需 MQL5 并写出参赛 EA:第一晚原型,第二晚调试。他弃用标准库以节省五位数报价处理时间与函数调用开销。他认为 MQL5 访问柱数据不太方便,但 OOP 对多币种 EA 极方便。
在 MQL4 中他不得不用数组组存各品种参数,代码充满遍历循环;MQL5 只需声明类、写清单品种逻辑,然后通过实例化轻松变成多币种,且逻辑清晰。他还喜欢:访问所有品种(即便不在 Market Watch)、__LINE__ 宏、定时器事件、自定义优化准则计算。唯一遗憾是不能以程序方式按自定义准则中断优化。
// MQL5 多币种类实例化简例
class CMyEA
{
public:
void Init(string symbol) { m_symbol = symbol; }
void OnTick() { /* 单品种逻辑 */ }
private:
string m_symbol;
};
CMyEA eur, usd, jpy;
eur.Init("EURUSD"); usd.Init("USDJPY"); jpy.Init("GBPUSD");
对中文交易者的可落地启示
综合访谈,几点值得借鉴:一、策略简单化,先求稳定再求复杂;二、多品种验证,拒绝单一品种过拟合;三、资金管理必须按策略定制,不盲信百分比回撤教条;四、限价单可降低执行不确定性;五、用 MQL5 OOP 管理多币种状态;六、把比赛/公开榜当验证,而非赌注。
同时要注意,访谈中 averaging 与激进占用保证金是锦标赛行为,实盘需替换为严谨风控。模糊因素设计要有数学支撑,不能成随意随机。最后,优化器中断等工程痛点至今仍影响 MQL5 工作流,开发时应预设早停脚本或分批优化。