编程错误让我痛失1.5万美元
从ATC2010选手教训学EA风控与止损
一、背景:从瓷砖工到MQL开发者的交易之路
Andrey Voitenko在2008年通过朋友和网络广告接触交易,彼时他虽有高等技术教育与研究生经历,却只能从事瓷砖铺贴等体力工作。像多数新手一样,他开户后经历亏损、对盈利方法完全迷茫。当时MT4极流行,但他初期轻视自动化交易,坚持手动操作,直到发现手动盯盘易被干扰、难以严格执行系统,才开始学MQL4。他坦承在ATC2010前并不真正相信自动化交易,也因市场如活物般有难以用代码描述的习性而屡感挫折。后来他因健康原因辞职,借MQL5的Jobs服务接单写EA,既赚收入又接触全球项目,还看中平台第三方仲裁防欺诈的机制。
二、为何参加ATC2010与EA基本逻辑
他首次参赛并非为奖金,而是想验证自己系统在实盘能否如合成测试般微利。其EA基于水平通道突破:先用5分钟bar的高低点算通道边界,价格深入通道后挂双侧挂单,成交其一后等待止盈或止损。该系统在低波动转高波动时表现好。5分钟周期是他优化所选,欲使EA活跃交易。他提到曾帮朋友LeoV写EA却犯诸多错致其成绩不佳。通道突破属趋势跟踪变体,与均线突破不同,它依赖波动率收缩扩张,对参数鲁棒性要求高。
三、致命编程错误:移动止损逻辑失效
Andrey自述最痛教训是移动止损的非标准实现:代码中止损条件无效,使SL立刻被拖得离市价过近,仓位无法持有至利润放大。他后来修正并发布第二版采用经典移动止损。他估算若非此错,当时权益可增1.5万美元、排第三拿现金奖。也就是说,轻率实验式移动止损直接让他损失名次与奖金。此错非语法bug,而是逻辑漏洞:未判断最小拖移距离、未过滤噪音刺穿。很多中文初学者也爱自写trailing,却忽略点差与滑点放大近距止损概率。
四、资金管理被故意关闭的隐患
其EA其实内置按自由保证金百分比计算 lot 的资金管理,但锦标赛中他禁用了,只用固定5手起步。他认为稳妥系统即便简单策略也能成,但赛时关掉MM使风险固定、不够激进。若启用,lot随资金浮动,风险不固定。这提醒我们:实盘与竞赛目标不同,禁用MM虽利排名却放大回撤。其50%回撤发生在初期余额小、12月6日 sluggish 行情中,价格反复触通道边界扫损;换经典trailing后曲线平滑多。中文交易者常照搬赛EA实盘,忽略MM开关即爆仓诱因。
五、回测优化与参数选择的真实细节
赛前测试好于预期,他提前一月提交后未改。优化准则仅取最大余额而非最小回撤,因面向冠军。EA平仓主要靠SL,TP设极远几乎不触,因trailing已覆盖;SL与trailing参数来自优化,TP仅防干扰。他曲线平滑源于及时获利算法而非刻意控回撤。其EA开源,用户建议加通道边界反转、参数绑定宽度、进阶MM、倾斜通道等,但他认为倾斜即另写EA。这显示优化目标必须与部署环境一致,仅最大化余额的赛EA直接实盘必偏激。
六、仅用挂单不市价成交的设计考量
他全程用stop挂单不入市价,因挂单水平明确、逻辑易追溯,利于锦标赛透明;市价成交则边界意义失。其文章EA本为演示抽利而写,顺带参赛没空改。这反映观点:结构清晰比花哨重要。对比直接市价突破,挂单可避滑点突袭,但可能漏单。中文社群常混淆stop与limit,应知通道突破用stop挂单双向待触发。
七、与其他方案及对手EA的对比
他欣赏多货币EA如Manov,曲线美、按最小回撤优化,若加仓无人能敌。旧届领袖本年失利,他归因为类似编程错与准备动机不足。对比单货币通道EA,多货币分散非相关品种更稳,但开发量大。Jobs服务较自由职业防骗优,因有第三方仲裁。与纯手动比,EA去情绪但需防代码暗病。中文用户选方案时应衡自身编程力,勿盲目追多货币。
八、可借鉴的MQL5代码修正思路
虽原文未附全码,依述第二版经典trailing可如此写:先算距开仓浮利,超阈值才拖SL,且留最小止损距。以下片段示核心逻辑,真实可用作模板。注意SymbolInfoInteger查点值、用PositionGetDouble取开价。很多错误源于用Bid算多单SL却忘点差,必须用订单品种ask/bid。
// 经典移动止损示例(多单)
input double TrailStart = 50; // 启动拖移点数
input double TrailStep = 20; // 最小拖移距
void ManageTrailing(ulong ticket)
{
if(PositionSelectByTicket(ticket))
{
double open = PositionGetDouble(POSITION_PRICE_OPEN);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double sl = PositionGetDouble(POSITION_SL);
double new_sl = bid - TrailStep*_Point;
if(bid - open > TrailStart*_Point && new_sl > sl && new_sl > open)
PositionModify(ticket, new_sl, 0);
}
}
九、给中文交易者的实操 checklist
从访谈蒸馏出避坑步骤:1)写EA先隔离模块单测trailing;2)优化含OOS与多目标;3)实盘必启MM或明确固定风险;4)挂单边界用stop而非市价;5)开源版常更至经典逻辑;6)勿抄赛EA禁MM直接实盘。对比无脑跟单,自研虽难但可控。平台Jobs可找人修码但需验开发者历史。最终,编程错即真金损失,严谨胜聪明。
- 用最小距离常量防SL近距被扫
- 优化用均衡准则而非仅max balance
- 实盘启用保证金百分比MM
- 通道突破用stop挂单双侧
- 定期重构trailing至经典版
- 勿将赛化EA直用于实盘