为何MQL4回测中的RSI数值与图表显示的RSI数值不一致?
解释EA回测中RSI数值与图表不匹配的原因
我来帮你拆解这个问题,你的EA代码和回测逻辑里有几个关键细节导致了RSI数值和图表不一致:
1. 时间判断用错了函数(核心问题)
你代码里用了TimeCurrent()来获取时间,但这个函数在回测模式下返回的是你电脑的真实当前时间,不是回测时的历史K线时间!
举个例子:当你回测7号9-11点的历史行情时,TimeCurrent()会返回你现在打开MT4的时间(比如10号下午),这时候day ==7的判断根本不会触发在正确的历史K线上——要么是误触发了和当前真实时间匹配的历史K线,要么完全没触发你预期的那段行情,自然打印的RSI和你看的图表对不上。
正确的做法是用Time[0],它代表当前正在处理的历史K线的时间,这样判断条件才能精准对应你关注的那段历史行情。
2. RSI参数是否和图表完全一致?
检查你图表上的RSI指标设置:
- 周期是不是
M5? - 长度是不是14?
- 计算用的价格是不是
收盘价(PRICE_CLOSE)?
如果图表上的RSI参数和代码里的任何一项不匹配,数值肯定会不一样,比如不小心选了PRICE_OPEN或者把长度改成了21。
3. 回测时RSI的计算时机问题
代码里iRSI的最后一个参数是0,代表当前K线的实时RSI值(也就是还没收盘的动态值)。但图表上显示的RSI是K线完全收盘后的最终计算值。如果你的EA在回测时,是在K线运行过程中(比如9:02分)打印RSI,那这个数值会和收盘后(9:05分)图表上的最终RSI有差异。
修正后的代码示例
把时间获取换成Time[0],确保回测时判断的是历史K线的时间:
void OnTick() { double rsi = iRSI( Symbol(), PERIOD_M5, 14, PRICE_CLOSE, 0 ); // 使用当前K线的时间,适配回测场景 datetime barTime = Time[0]; int day = TimeDay( barTime ); int hour = TimeHour( barTime ); int min = TimeMinute( barTime ); if ( day == 7 && hour >= 9 && hour < 11 ) { Print( Symbol(), " / ", PERIOD_M5, " rsi: ", (string) rsi ); } }
另外建议你回测时,先把EA的运行周期和图表周期统一,同时确认RSI指标的参数和代码完全一致,这样就能匹配上了。
内容的提问来源于stack exchange,提问作者dvn0zzz




