“MT5里指标参数在周期切换后丢失,十有八九是代码里用了静态变量存参数,而不是存在指标句柄里。”
先说排查过程吧。我一开始也以为是MT5的缓存抽风,毕竟这平台偶尔会闹点小脾气。我试过清空缓存、删除图表模板、甚至重装了一次MT5,问题照旧。后来我干脆写了个脚本,在切换周期时把指标参数和计算值都打印到日志里,这才发现猫腻——指标初始化函数里,我用了一个全局静态数组来存参数,想着这样调用快。结果MT5在周期切换时会重新初始化指标,但静态变量的生命周期是跨初始化的,旧值没清掉,新参数又没写进去,等于EA拿到的还是老一套。
这个坑其实挺典型的。很多新手包括我,写指标时图省事,喜欢用static变量或者全局变量来缓存中间计算结果,觉得能提升性能。但在MT5里,图表周期切换会触发指标重新编译和初始化,这时候静态变量的行为跟你想的完全不一样。它不是按新参数重新算,而是保留上一次的残留值。你要是把参数直接存在指标句柄的输入变量里,就不会有这问题——因为句柄是跟着图表走的,周期切换后MT5会自动重建句柄,参数自然跟着新周期走。
我最后怎么改的?把那个静态数组全删了,改成在OnInit里从输入参数重新赋值,然后计算过程需要缓存的数据,用IndicatorSetInteger或者干脆每次实时算。性能确实牺牲了一点点,我测了下,原来一秒能算300根K线的指标,现在大概慢个15%左右,但换来的是参数稳定,值了。另外我还加了个保险动作:在EA的OnChartEvent里监听周期切换事件,一旦检测到PERIOD_CHANGE,就强制调用一次指标刷新函数,确保EA手里的参数跟图表显示的一致。
说回你问的“平台缓存还是代码缺陷”,我现在的判断是——MT5的缓存机制确实存在,但它通常只影响图表模板和界面状态,不会动指标逻辑层的参数。你遇到的这种“图表显示和EA读取不一致”的情况,九成是代码里用了不该用的存储方式。平台只是个背锅的。
你要是在自己的指标里也碰到类似问题,建议先做两件事:首先,打开MT5的“智能交易系统”日志,看切换周期时有没有警告信息,比如“indicator parameter mismatch”之类的;然后,在指标里加一行Print输出当前参数值,切一次周期看一次输出,对比一下就清楚了。这个排查方法对MT4同样适用,只是MT4的静态变量行为更宽松一些,不容易暴露问题,但一旦暴露就是大坑。
最后留个问题给你琢磨:如果你在指标里用了Handle变量来调用其他指标,周期切换时这个Handle会自动失效,你是在OnInit里重建,还是用OnCalculate里的rates_total变化来触发重建?我两种都试过,各有优劣,想听听你的做法。
