标题:EA运行报错了求帮助
正文:
各位老哥好,小弟刚接触MT4自动交易没多久,最近自己琢磨着改了一个简单的均线交叉EA,想着回测数据看着还行,就挂到模拟账户上跑了两天。结果今天打开平台一看,日志里全是红字报错,EA直接罢工了,连单子都没开出来。我翻了半天论坛和文档,还是没搞明白问题出在哪,特来求助各位大神。
先说下我的EA逻辑吧,其实挺基础的:用EMA12和EMA26的交叉信号做入场,金叉做多,死叉做空,止损设20点,止盈设40点,移动止损用的是ATR的2倍。我回测的时候用的是2019年到2021年的欧元兑美元1小时数据,参数优化过两轮,胜率大概在58%左右,最大回撤控制在15%以内,看着挺稳的。但实盘模拟跑起来,第一天还好,第二天下午就开始报错,日志里反复出现“OrderSend error 130”和“Invalid stops”这种错误。
我查了下,error 130好像是止损或止盈设置有问题?但我的止损止盈都是固定数值,20点和40点,按理说不会触发什么限制才对。而且我确认过,账户是模拟账户,不是真实账户,应该没有资金不足的问题。我还特意检查了服务器时间,MT4用的是GMT+2,我挂单的时候也注意了市场是否在活跃时段,但报错依然频繁出现。
后来我又仔细看了日志,发现一个细节:报错出现的时间点,好像都是在一根K线收盘前几秒内。比如1小时图,收盘前10秒左右,EA开始执行开仓逻辑,然后瞬间就报错。我怀疑是不是因为K线收盘时价格波动剧烈,导致止损或止盈设定超出了当前市场的可接受范围?但我的EA逻辑里,止损止盈是在开仓时同时设置的,按理说不会因为后续价格波动而影响开仓本身啊。
另外,我还注意到一个现象:报错后,EA并没有完全停止运行,只是那一单没开成,后续的交叉信号还是会被检测到。但问题在于,如果连续几次报错,EA可能会因为逻辑判断上的累积误差,导致后续信号判断混乱。比如,我本来的逻辑是金叉后开多单,但如果开单失败,而价格继续上行,下一个K线可能就变成死叉了,EA就会尝试开空单,结果又报错。这样来回折腾,账户虽然没亏钱,但EA等于废了。
我尝试过修改EA里的交易设置,比如把止损止盈改成用Points计算,而不是用固定数值,但问题依旧。我也试过把OrderSend函数里的滑点参数从默认的10改成50,结果更糟,日志里开始出现“OrderSend error 138”(重试次数过多)的提示。看来滑点改大反而让MT4频繁重试,导致订单一直挂在那里,最后超时被拒绝。
更让我头疼的是,我用的这个EA是从网上一个免费模板改的,原作者用的是MarketInfo(Symbol(), MODE_STOPLEVEL)来动态获取最小止损距离,但我嫌麻烦直接写死了数值。现在想来,可能不同经纪商对止损距离的要求不一样,我的模拟账户用的是某知名平台,但它的最小止损距离可能不是固定的,有些时候会动态调整。比如,在重大数据发布前后,平台会临时提高止损距离限制,这时候我写死的20点止损可能就低于平台要求的最小值,导致OrderSend失败。
我也试过在EA里加入一个检查函数,在开仓前先获取当前工具的最小止损距离,然后用这个值去动态调整止损止盈。但改了之后,虽然error 130减少了,但又出现了新的问题:“OrderModify error 1”之类的,可能是移动止损部分逻辑没处理好。我现在的移动止损是用OnTick()里每根K线检查一次,如果当前价格比开仓价高出一定比例,就移动止损到盈亏平衡点。但可能因为服务器响应延迟,或者执行顺序问题,导致修改止损时订单已经平仓了,继而报错。
最后想说,小弟我纯属业余爱好者,编程基础就是大学时学的那点C语言皮毛,MQL4的语法也是边看文档边改的。这个问题折腾了我两天,晚上都没睡好,总想着是不是哪里逻辑漏洞。希望有经验的老哥能指点一下,是不是我EA架构本身就有问题,还是说需要加一些错误处理机制,比如循环重试或者延迟执行?另外,有没有什么通用的EA报错排查步骤,或者常用的测试方法?先谢过各位了!
正文:
各位老哥好,小弟刚接触MT4自动交易没多久,最近自己琢磨着改了一个简单的均线交叉EA,想着回测数据看着还行,就挂到模拟账户上跑了两天。结果今天打开平台一看,日志里全是红字报错,EA直接罢工了,连单子都没开出来。我翻了半天论坛和文档,还是没搞明白问题出在哪,特来求助各位大神。
先说下我的EA逻辑吧,其实挺基础的:用EMA12和EMA26的交叉信号做入场,金叉做多,死叉做空,止损设20点,止盈设40点,移动止损用的是ATR的2倍。我回测的时候用的是2019年到2021年的欧元兑美元1小时数据,参数优化过两轮,胜率大概在58%左右,最大回撤控制在15%以内,看着挺稳的。但实盘模拟跑起来,第一天还好,第二天下午就开始报错,日志里反复出现“OrderSend error 130”和“Invalid stops”这种错误。
我查了下,error 130好像是止损或止盈设置有问题?但我的止损止盈都是固定数值,20点和40点,按理说不会触发什么限制才对。而且我确认过,账户是模拟账户,不是真实账户,应该没有资金不足的问题。我还特意检查了服务器时间,MT4用的是GMT+2,我挂单的时候也注意了市场是否在活跃时段,但报错依然频繁出现。
后来我又仔细看了日志,发现一个细节:报错出现的时间点,好像都是在一根K线收盘前几秒内。比如1小时图,收盘前10秒左右,EA开始执行开仓逻辑,然后瞬间就报错。我怀疑是不是因为K线收盘时价格波动剧烈,导致止损或止盈设定超出了当前市场的可接受范围?但我的EA逻辑里,止损止盈是在开仓时同时设置的,按理说不会因为后续价格波动而影响开仓本身啊。
另外,我还注意到一个现象:报错后,EA并没有完全停止运行,只是那一单没开成,后续的交叉信号还是会被检测到。但问题在于,如果连续几次报错,EA可能会因为逻辑判断上的累积误差,导致后续信号判断混乱。比如,我本来的逻辑是金叉后开多单,但如果开单失败,而价格继续上行,下一个K线可能就变成死叉了,EA就会尝试开空单,结果又报错。这样来回折腾,账户虽然没亏钱,但EA等于废了。
我尝试过修改EA里的交易设置,比如把止损止盈改成用Points计算,而不是用固定数值,但问题依旧。我也试过把OrderSend函数里的滑点参数从默认的10改成50,结果更糟,日志里开始出现“OrderSend error 138”(重试次数过多)的提示。看来滑点改大反而让MT4频繁重试,导致订单一直挂在那里,最后超时被拒绝。
更让我头疼的是,我用的这个EA是从网上一个免费模板改的,原作者用的是MarketInfo(Symbol(), MODE_STOPLEVEL)来动态获取最小止损距离,但我嫌麻烦直接写死了数值。现在想来,可能不同经纪商对止损距离的要求不一样,我的模拟账户用的是某知名平台,但它的最小止损距离可能不是固定的,有些时候会动态调整。比如,在重大数据发布前后,平台会临时提高止损距离限制,这时候我写死的20点止损可能就低于平台要求的最小值,导致OrderSend失败。
我也试过在EA里加入一个检查函数,在开仓前先获取当前工具的最小止损距离,然后用这个值去动态调整止损止盈。但改了之后,虽然error 130减少了,但又出现了新的问题:“OrderModify error 1”之类的,可能是移动止损部分逻辑没处理好。我现在的移动止损是用OnTick()里每根K线检查一次,如果当前价格比开仓价高出一定比例,就移动止损到盈亏平衡点。但可能因为服务器响应延迟,或者执行顺序问题,导致修改止损时订单已经平仓了,继而报错。
最后想说,小弟我纯属业余爱好者,编程基础就是大学时学的那点C语言皮毛,MQL4的语法也是边看文档边改的。这个问题折腾了我两天,晚上都没睡好,总想着是不是哪里逻辑漏洞。希望有经验的老哥能指点一下,是不是我EA架构本身就有问题,还是说需要加一些错误处理机制,比如循环重试或者延迟执行?另外,有没有什么通用的EA报错排查步骤,或者常用的测试方法?先谢过各位了!
外汇策略爱好者,记录每一笔回测数据,持续优化交易系统