MQL4自定义指标未绘制ZigZag样式线条问题求助
MQL4指标仅显示蓝色线条,无法实现ZigZag效果排查
首次制作MQL4指标,预期实现类似ZigZag的线条绘制效果,但运行后图表仅显示蓝色线条。以下是OnCalculate函数代码:
int Counted_bars=IndicatorCounted(); // Number of counted bars int i=Bars-Counted_bars-1; // Setup if(rates_total<=DATA_LIMIT) return(0); // Loop for uncounted bars & for the 0th bar while(i >= 0) { int shift1 = i+1; int shift2 = i+2; double ao1 = iAO(_Symbol, 0, shift1); double ao2 = iAO(_Symbol, 0, shift2); // mark the start of a new range if(ao1 > 0 && ao2 < 0) { positiveRangeBar = BarIndex(shift1); highestHighVal = high[shift1]; } if(ao1 < 0 && ao2 > 0) { negativeRangeBar = BarIndex(shift1); lowestLowVal = low[shift1]; } // update the highest high/lowest low if(ao1 > 0) { double _high = high[shift1]; if(_high > highestHighVal) { highestHighVal = _high; currHigh[shift1] = highestHighVal; } } if(ao1 < 0) { double _low = low[shift1]; if(_low < lowestLowVal) { lowestLowVal = _low; currLow[shift1] = lowestLowVal; } } i--; }
问题排查方向
- 全局变量未初始化:
positiveRangeBar、negativeRangeBar、highestHighVal、lowestLowVal若未初始化,会导致逻辑判断异常。比如lowestLowVal初始值如果是0,第一个低点可能无法被正确捕获,后续下跌段的更新逻辑失效。 - 缓冲区未填充默认值:
currHigh和currLow缓冲区仅在新高/新低条件满足时赋值,其余位置未设为EMPTY_VALUE,会导致线条强制连为一体,只显示指标默认的蓝色。ZigZag需要非拐点位置设为EMPTY_VALUE才能断开显示。 - 索引使用错误:
BarIndex(shift1)返回的是图表K线的绝对索引,和high[]等数组的本地索引(0为最新K线)不匹配,应该直接用shift1作为缓冲区索引。 - 缺少拐点连线逻辑:当前代码仅记录新高/新低,但未实现相邻拐点的连线逻辑。ZigZag需要在确认拐点后,将当前拐点与上一个对应拐点(如上涨高点和下跌低点)在缓冲区赋值,形成间断线条。
- 已计算K线未保留:未对
IndicatorCounted()返回的已计算K线做保留处理,可能覆盖原有正确值,导致线条异常。
修正示例
- 初始化全局变量
int positiveRangeBar = -1; int negativeRangeBar = -1; double highestHighVal = 0.0; double lowestLowVal = DBL_MAX; // 初始设为极大值,确保第一个低点能被捕获
- 填充缓冲区默认值
在循环前对未计算的K线缓冲区设为EMPTY_VALUE:
for(int j = 0; j <= i; j++){ currHigh[j] = EMPTY_VALUE; currLow[j] = EMPTY_VALUE; }
修正索引使用
将positiveRangeBar = BarIndex(shift1);改为positiveRangeBar = shift1;,同理处理negativeRangeBar。添加拐点连线逻辑
在标记新趋势段时,连接上一个对应拐点:
if(ao1 > 0 && ao2 < 0) { positiveRangeBar = shift1; highestHighVal = high[shift1]; // 连接上一个下跌低点和当前上涨高点 if(negativeRangeBar != -1){ currHigh[negativeRangeBar] = highestHighVal; currLow[positiveRangeBar] = lowestLowVal; } } if(ao1 < 0 && ao2 > 0) { negativeRangeBar = shift1; lowestLowVal = low[shift1]; // 连接上一个上涨高点和当前下跌低点 if(positiveRangeBar != -1){ currLow[positiveRangeBar] = lowestLowVal; currHigh[negativeRangeBar] = highestHighVal; } }
内容的提问来源于stack exchange,提问作者Samaara
相关产品推荐
相关产品推荐

