You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何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

火山引擎 最新活动