You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MQL5中iStochastic函数返回无效值问题求助

解决MQL5中iStochastic函数返回垃圾值的问题

我明白你在MQL5里调用iStochastic时碰到了头疼的问题——返回的数组里全是0,还混了一个离谱的超大负数。这大概率是指标句柄无效或者数据拷贝失败导致的未初始化数组值,咱们来一步步解决:

先看你原来的代码,这里有几个关键的疏漏:

void OnInit() { double K[],D[]; int s = iStochastic(_Symbol,PERIOD_M1,5,3,3,MODE_SMA,STO_LOWHIGH); ArraySetAsSeries(K,true); CopyBuffer(s,0,0,15,K); for (int i=0; i< ArraySize(K); i++) { PrintFormat("K%d: %f",i,K[i]); } }

问题根源

  • 没检查指标句柄有效性:iStochastic可能因为参数错误、品种周期不存在等原因返回INVALID_HANDLE,这时候调用CopyBuffer根本无法获取有效数据,数组里的内容就是内存里的随机垃圾值。
  • 没验证数据拷贝结果:CopyBuffer返回实际拷贝的元素数量,如果返回值不等于你期望的15,说明数据获取失败,但你没做任何判断,直接就打印未初始化的数组元素。
  • OnInit阶段的时机问题:在策略测试器中,OnInit是初始化阶段,部分历史数据可能还没加载完成,这时候去拷贝指标数据自然拿不到有效值。

修正后的代码

我给你调整了代码,加上了关键的错误检查和逻辑优化:

void OnInit() 
{ 
    double K[], D[]; 
    // 创建随机指标句柄
    int stochasticHandle = iStochastic(_Symbol, PERIOD_M1, 5, 3, 3, MODE_SMA, STO_LOWHIGH); 
    
    // 第一步:检查句柄是否创建成功
    if(stochasticHandle == INVALID_HANDLE)
    {
        Print("随机指标句柄创建失败,错误码:", GetLastError());
        return;
    }
    
    ArraySetAsSeries(K, true); 
    // 第二步:拷贝K线数据,并检查拷贝结果
    int copiedCount = CopyBuffer(stochasticHandle, 0, 0, 15, K);
    if(copiedCount != 15)
    {
        Print("K线数据拷贝失败,仅拷贝了", copiedCount, "条数据,错误码:", GetLastError());
        return;
    }
    
    // 打印有效数据
    for (int i = 0; i < ArraySize(K); i++) 
    { 
        PrintFormat("K%d: %.2f", i, K[i]); 
    } 
}

额外建议

如果在策略测试器里还是拿不到数据,可以把获取指标数据的逻辑放到OnTick函数里,因为OnTick是在数据完全加载后才会触发的。另外,也可以在OnInit里通过IsTesting()判断是否处于测试模式,等待数据加载完成后再执行拷贝操作。

那个离谱的超大负数其实就是未初始化的double数组在内存里的随机值,只要确保句柄有效、数据拷贝成功,这个问题就会消失啦。

内容的提问来源于stack exchange,提问作者Jaffer Wilson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:26