有个汇友昨天发我一段日志,说他的EA挂在MT5上跑欧美,开了三个图表,结果只有第一个图表正常下单,后面两个死活不动。他以为是平台问题,换了VPS重装了两遍还是老样子。我让他把Journal和Experts两个标签页的日志都截图发我,一看就明白了——Error 4109: trade is not allowed,典型的自动交易权限没打开。
这个问题其实特别常见,但很多人排查方向一开始就错了,先去怀疑策略逻辑或者VPS网络,白白折腾半天。下面我把整个排查流程梳理一下,都是我自己踩过的坑。
首先第一步永远是看日志,不是看你自己print出来的东西,而是看MT5原生报错。
第二个容易忽略的点是品种后缀。很多经纪商的欧美是EURUSD.a、EURUSDpro这种带后缀的,你EA里硬编码Symbol()返回的是当前图表品种没错,但如果用SymbolInfoDouble去查点差或者用OrderSend传了固定字符串"EURUSD",那在带后缀的账户上就会报Error 4301: unknown symbol。解决办法是用Symbol()动态获取,或者用SymbolInfoString配合后缀变量。我自己是写了个函数,遍历Market Watch找匹配前缀的品种名。
第三个坑是订单填充模式。MT5的OrderSend里有个type_filling参数,不同经纪商支持的模式不一样。有的只支持FOK,有的只支持IOC,你如果写死ORDER_FILLING_FOK,在某些平台上就会报Error 10030: unsupported filling mode。我的做法是先调用SymbolInfoInteger(SYMBOL_FILLING_MODE)拿到支持的位掩码,然后按优先级选一个。
还有一个细节是止损止盈的最小距离。黄金和镑美这种波动大的品种,有些平台要求SL/TP离现价至少多少个点,你设太近会直接报Error 130: invalid stops。这个值可以用SymbolInfoInteger(SYMBOL_TRADE_STOPS_LEVEL)拿到,然后在下单前做一次校验。
最后提醒一句,排查EA报错一定要用策略测试器的可视化模式先跑一遍,很多权限和品种问题在回测里就能暴露出来,比实盘试错成本低得多。你们平时遇到最头疼的报错代码是哪个?评论区贴出来一起看看。
这个问题其实特别常见,但很多人排查方向一开始就错了,先去怀疑策略逻辑或者VPS网络,白白折腾半天。下面我把整个排查流程梳理一下,都是我自己踩过的坑。
首先第一步永远是看日志,不是看你自己print出来的东西,而是看MT5原生报错。
- Journal标签页看平台级错误,比如连接、登录、权限;
- Experts标签页看EA自身输出和交易服务器返回码;
- 如果用了DLL或者外部信号,还要看是否被Allow DLL imports拦住了。
第二个容易忽略的点是品种后缀。很多经纪商的欧美是EURUSD.a、EURUSDpro这种带后缀的,你EA里硬编码Symbol()返回的是当前图表品种没错,但如果用SymbolInfoDouble去查点差或者用OrderSend传了固定字符串"EURUSD",那在带后缀的账户上就会报Error 4301: unknown symbol。解决办法是用Symbol()动态获取,或者用SymbolInfoString配合后缀变量。我自己是写了个函数,遍历Market Watch找匹配前缀的品种名。
第三个坑是订单填充模式。MT5的OrderSend里有个type_filling参数,不同经纪商支持的模式不一样。有的只支持FOK,有的只支持IOC,你如果写死ORDER_FILLING_FOK,在某些平台上就会报Error 10030: unsupported filling mode。我的做法是先调用SymbolInfoInteger(SYMBOL_FILLING_MODE)拿到支持的位掩码,然后按优先级选一个。
还有一个细节是止损止盈的最小距离。黄金和镑美这种波动大的品种,有些平台要求SL/TP离现价至少多少个点,你设太近会直接报Error 130: invalid stops。这个值可以用SymbolInfoInteger(SYMBOL_TRADE_STOPS_LEVEL)拿到,然后在下单前做一次校验。
最后提醒一句,排查EA报错一定要用策略测试器的可视化模式先跑一遍,很多权限和品种问题在回测里就能暴露出来,比实盘试错成本低得多。你们平时遇到最头疼的报错代码是哪个?评论区贴出来一起看看。
