MACD双线报警代码在MT5编译通过却在实盘静默,问题出在哪个回调函数?

较热57.7
登录发帖
XM 推荐平台

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

CySEC(塞浦路斯) / ASIC(澳洲) / IFSC(伯利兹) · 最低入金 $5
打不过就跑
打不过就跑 楼主 6 天前 浏览 477 回复 0 阅读 1 分钟
Lv.4 实盘汇友 等级 Lv.4 主题 3 帖数 10 积分 1790 汇币 1463
1楼
编译零错误零警告,回测里信号响得跟闹钟一样,一挂到实盘就彻底哑火——这种事儿我上个月刚踩过一次,折腾了整整两个晚上才定位到问题。当时写的是一个MACD双线金叉死叉报警的EA,逻辑不复杂,主图和信号图两条线,快线上穿慢线触发Alert加Push通知。MT5策略测试器里跑欧美M15,三个月数据,报警日志刷了满满一屏,我还挺得意。结果挂上VPS实盘,整整一周,一次都没响过。要不是我每天手动看一眼图表,差点错过两波像样的镑美行情。
先说结论,问题不在OnTick,也不在指标句柄的创建,而是出在[b ]OnCalculate[/b ]这个回调函数的返回值上。我知道很多人一听这个就懵了,报警EA不是用OnTick驱动的吗,跟OnCalculate有什么关系?这就是坑所在。我的报警逻辑是写在OnTick里的,每来一个tick就去读iMACD的当前值。但MT5里自定义指标和EA读取指标数据,底层都依赖OnCalculate的返回状态。如果你在EA里内嵌了指标计算代码,或者用了iCustom去调用一个自己写的MACD指标,而那个指标的OnCalculate返回了[b ]零或者负值[/b ],MT5会认为这个指标数据无效,后续所有CopyBuffer拿到的全是空值或者上一次的缓存。编译期不会报错,因为语法没问题,回测能跑是因为测试器对指标缓存的处理和实盘不一样,实盘里tick稀疏的时候,这个静默失败就被放大了。
有个汇友在帖子里说,他遇到类似情况是句柄没释放导致的,每次OnTick都Create一次iMACD句柄,跑几天就卡死。
这个说法对了一半,句柄泄漏确实会让EA变慢甚至崩溃,但不会导致完全静默。我的情况更隐蔽:我在OnInit里创建了MACD句柄,OnDeinit里也正常Release了,看起来没问题。真正的问题是我在OnCalculate里写了个自定义的柱状图平滑逻辑,返回的是[b ]rates_total - prev_calculated - 1[/b ],但有一次prev_calculated等于rates_total的时候,我返回了0。MT5文档里写得很清楚,OnCalculate返回0表示没有新数据需要计算,指标缓冲区不会被更新。实盘里当一根新K线刚生成、tick还没进来的时候,prev_calculated恰好等于rates_total,我的代码就返回了0。那一瞬间CopyBuffer读到的就是旧值,而我的报警条件写的是严格大于或小于,旧值不满足条件,报警就被跳过了。回测里因为tick是连续模拟的,几乎不会出现这个边界状态,所以测试器里一切正常。
关键决策就一个:把OnCalculate的返回值改成[b ]永远返回rates_total[/b ],或者至少保证在prev_calculated等于rates_total时返回1而不是0。改完之后实盘报警立刻就活了。我还在OnTick里加了一个简单的容错,如果CopyBuffer返回false或者读到的值跟上一根K线完全相同,就跳过这次判断,避免重复报警。另外提醒一句,MT5的Alert和SendNotification在VPS上偶尔会被系统静音,尤其是你用了多个EA同时推送的时候,最好在代码里加个Print日志,方便排查到底是信号没触发还是通知没发出去。我当时就是靠Print才发现OnCalculate根本没更新缓冲区,不然还在那儿傻等手机弹窗。
说到底,MT5的指标回调机制比MT4复杂得多,MT4里iMACD直接读值,没这么多状态管理。MT5把指标计算和EA逻辑解耦了,好处是性能好,坏处就是这种静默失败特别难查。编译通过不代表逻辑正确,回测正常不代表实盘正常。如果你也在写MACD双线报警,先检查OnCalculate的返回值,再检查CopyBuffer的错误码,最后才去看报警条件本身。顺序反了,可能像我一样白熬两个晚上。
你们有没有遇到过类似的情况,编译和回测都正常,实盘就是不动?或者有没有人用Python的MetaTrader5库做过MACD报警,那边是不是也有同样的缓冲区陷阱?在下面聊聊你的排查思路。

补充一句,后来发现即使OnCalculate返回值对了,如果指标句柄是在OnInit里用iMACD创建但没等数据同步完就在OnTick里读,实盘照样可能拿到空值,建议加个BarsCalculated的判断再放行信号。
0 回复 众裁0 复制
#1
💬
暂无回复,来抢沙发吧!
THE END
本帖内容仅供学习交流,不构成任何投资建议。外汇交易存在高风险,请谨慎参与。
← 上一帖 先保住本金,再谈赚钱 下一帖 → 推荐一个MT5回测报告里99%历史数据质量到底怎么验证的替代方案