无法从iBand指标获取上下轨值的问题求助
无法从iBand指标获取上下轨值的问题求助
嘿,我看了你的代码和遇到的问题,这情况确实挺让人纳闷的——明明没报错,但上下轨却都是中轨值,范围直接成0了。我给你梳理几个排查方向和解决方案:
首先,一定要先检查指标句柄是否有效,这是很多人容易忽略的点!如果iBands创建句柄失败,后续的CopyBuffer根本拿不到正确数据,但你没做检查,所以不知道问题出在哪。给你的代码加个判断:
void OnTick() { double upperBand[]; double lowerBand[]; double range; int handle = iBands(_Symbol, _Period, 20, 2, 0, PRICE_CLOSE); // 新增句柄有效性检查 if(handle == INVALID_HANDLE) { Print("创建布林带句柄失败,错误代码: ", GetLastError()); return; } // 同时检查CopyBuffer的返回值,确认数据复制成功 int copiedUpper = CopyBuffer(handle, 1, 0, 1, upperBand); if(copiedUpper != 1) { Print("复制上轨数据失败,错误代码: ", GetLastError()); return; } int copiedLower = CopyBuffer(handle, 2, 0, 1, lowerBand); if(copiedLower != 1) { Print("复制下轨数据失败,错误代码: ", GetLastError()); return; } Print("Upper Band: ", upperBand[0]); Print("Lower Band: ", lowerBand[0]); range = upperBand[0] - lowerBand[0]; Print("Range: ", range); }
然后,确认你用的是MQL4还是MQL5,因为两者的布林带缓冲区索引不一样:
- MQL5:缓冲区0是中轨,1是上轨,2是下轨——你的代码里用1和2是对的
- MQL4:缓冲区0是上轨,1是中轨,2是下轨——如果是MQL4,你得把CopyBuffer的第二个参数改成0和2
另外,你可以试试直接用iBands函数获取单个值来验证,看看是不是CopyBuffer的问题:
// 直接获取上下轨和中轨的值,对比CopyBuffer的结果 double upper = iBands(_Symbol, _Period, 20, 2, 0, PRICE_CLOSE, MODE_UPPER, 0); double lower = iBands(_Symbol, _Period, 20, 2, 0, PRICE_CLOSE, MODE_LOWER, 0); double middle = iBands(_Symbol, _Period, 20, 2, 0, PRICE_CLOSE, MODE_MIDDLE, 0); Print("直接获取结果:上轨=", upper, " 中轨=", middle, " 下轨=", lower);
如果直接获取的结果里上下轨和中轨还是相等,那可能是你图表上的布林带参数和代码里的不一致?比如代码里用了PRICE_CLOSE,但图表上用的是PRICE_OPEN?或者deviation参数被误设成0了?
先按上面的步骤排查,应该能找到问题所在!
备注:内容来源于stack exchange,提问作者Solebay Sharp
相关产品推荐
相关产品推荐

