EA回测跑出漂亮曲线,实盘却卡在订单发送这一步,日志只报错误130

新帖
登录发帖
XM 推荐平台

覆盖品种全,新手友好,支持多种入金方式

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
旧巷听风
旧巷听风 楼主 昨天 21:32 浏览 21 回复 1 阅读 1 分钟
新汇友(注册会员) 等级 Lv.1 主题 4 帖数 18 积分 1953 汇币 1685
1楼
有个汇友上周私信我,说他那个EA在策略测试器里跑欧美2015到2024年的数据,夏普1.8,最大回撤不到7%,结果一上实盘,订单死活发不出去,日志里就一行红字:error 130。他问我是不是VPS的问题,换了三家还是这样。
我当时回他一句话:你先别急着怪VPS,130这个错误码在MQL4/MQL5里叫ERR_INVALID_STOPS,翻译过来就是止损或止盈价格无效。这跟服务器延迟、跟网络质量半毛钱关系都没有,是订单参数本身被交易商拒了。
他后来跟我说,回测的时候他设的是固定30点止损、60点止盈,用的是ECN账户,点差按1.2算的。
问题就出在这。回测环境里,策略测试器用的是历史数据里的买价卖价,点差是你自己填的一个固定值,止损距离随便设多近都行,测试器不会拦你。但实盘不一样,很多交易商有一个叫StopLevel的东西,也就是最小止损距离。比如某平台欧美StopLevel是0,那没事;但有些平台黄金StopLevel是50点,你设30点止损,订单还没到市场就被服务器打回来了,报的就是130。
我自己的经历更典型。2022年那会儿我写了个镑美亚盘突破的EA,回测三年曲线平滑得像教科书,实盘第一周就发现不对劲——十次信号有四次报130。我当时以为是代码里OrderSend的滑点参数写错了,反复改slippage从3改到10,没用。后来把交易商的合约规格调出来一看,镑美StopLevel是8个点,而我EA里默认止损是6个点,就差这两个点,订单全废。
所以我现在养成了一个习惯,EA初始化的时候先跑一段检测代码,用MarketInfo或者SymbolInfoInteger把SYMBOL_TRADE_STOPS_LEVEL读出来,然后跟EA里预设的止损止盈距离做比较,如果预设值小于平台要求的最小值,就自动把止损拉到合规距离,或者干脆跳过这次信号。这个逻辑在回测里看不出来,因为测试器默认StopLevel是0,你不手动模拟根本发现不了。
还有一个坑是冻结距离,FreezeLevel。有些平台在价格接近挂单的时候会禁止修改或删除订单,也会报130。这个在非农或者CPI数据公布前后特别容易触发,因为点差瞬间拉大,价格跳动剧烈,你的止损价可能一瞬间就落到冻结区里了。
我现在的做法是,EA里所有涉及止损止盈的计算,全部走一个规范化函数,把原始价格根据TickSize、StopLevel、FreezeLevel做一次对齐,再发给服务器。听起来麻烦,但比实盘里看着信号干瞪眼强。
你们有没有遇到过类似的情况,回测里顺风顺水,实盘一上就各种报错?尤其是不同交易商StopLevel差异这块,有没有什么更省事的处理方式,在下面聊聊。
0 回复 众裁0 复制
#1
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 MT5的onTester里算不出自定义指标句柄,回测直接卡死