如何在MQL5中编程实现Keltner Channel?求代码修复协助
MQL5 Keltner Channel 代码修复方案
核心问题排查
- ATR值计算错误:原代码仅获取单次当前bar的ATR值,Keltner Channel需要每个bar对应的滚动ATR序列值,而非固定值。
- 变量未定义/不匹配:
count变量未声明,应使用之前获取的bars变量;TimeFrame需替换为MQL5标准的_Period(当前图表周期)。 - 逻辑冲突:OnTick中同时使用手动计算的数组和未初始化的
handleKeltner指标句柄,CopyBuffer会因句柄无效执行失败。 - 未处理初始化阶段无效值:前
atrPeriod个bar的ATR未完成计算,直接赋值会产生无效数据。
修复后的完整代码示例
全局变量声明
double upperKeltner[]; double lowerKeltner[]; double atrValues[]; // 存储每个bar的ATR序列值 input int atrPeriod = 14; input double multiplier = 1.5;
OnInit() 函数修复
int OnInit() { int bars = iBars(_Symbol, _Period); // 同步调整所有数组大小 ArrayResize(upperKeltner, bars); ArrayResize(lowerKeltner, bars); ArrayResize(atrValues, bars); // 批量复制ATR序列到数组,避免循环调用iATR if(CopyBuffer(iATR(_Symbol, _Period, atrPeriod), 0, 0, bars, atrValues) == -1) { Print("复制ATR失败,错误码:", GetLastError()); return(INIT_FAILED); } // 遍历计算每个bar的Keltner通道值 for(int i = 0; i < bars; i++) { double typicalPrice = (iOpen(_Symbol, _Period, i) + iHigh(_Symbol, _Period, i) + iLow(_Symbol, _Period, i)) / 3.0; // 跳过ATR未初始化的bar(前atrPeriod个bar无有效ATR) if(i >= atrPeriod) { upperKeltner[i] = typicalPrice + atrValues[i] * multiplier; lowerKeltner[i] = typicalPrice - atrValues[i] * multiplier; } else { upperKeltner[i] = EMPTY_VALUE; lowerKeltner[i] = EMPTY_VALUE; } } return(INIT_SUCCEEDED); }
OnTick() 函数修复(实时更新最新bar)
void OnTick() { int latestBar = 0; // MQL5中0代表最新bar double typicalPrice = (iOpen(_Symbol, _Period, latestBar) + iHigh(_Symbol, _Period, latestBar) + iLow(_Symbol, _Period, latestBar)) / 3.0; double currentATR = iATR(_Symbol, _Period, atrPeriod, latestBar); // 实时更新最新bar的通道值 upperKeltner[latestBar] = typicalPrice + currentATR * multiplier; lowerKeltner[latestBar] = typicalPrice - currentATR * multiplier; // 示例:打印最新通道值用于调试 Print("最新Upper Keltner: ", upperKeltner[latestBar], " | Lower Keltner: ", lowerKeltner[latestBar]); }
额外注意事项
- 若需将Keltner Channel作为独立指标调用,需单独编写指标文件,再通过
iCustom获取句柄后使用CopyBuffer。 - 实际策略中需判断
upperKeltner[i]和lowerKeltner[i]是否为EMPTY_VALUE,避免无效信号。 - 批量复制开盘/最高/最低价数组可进一步优化性能,减少循环中对
iOpen/iHigh/iLow的频繁调用。
内容的提问来源于stack exchange,提问作者Geraldo Isaaks
相关产品推荐
相关产品推荐

