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
相关产品推荐
相关产品推荐

