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

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线做保留处理,可能覆盖原有正确值,导致线条异常。

修正示例

  1. 初始化全局变量
int positiveRangeBar = -1;
int negativeRangeBar = -1;
double highestHighVal = 0.0;
double lowestLowVal = DBL_MAX; // 初始设为极大值,确保第一个低点能被捕获
  1. 填充缓冲区默认值
    在循环前对未计算的K线缓冲区设为EMPTY_VALUE:
for(int j = 0; j <= i; j++){
    currHigh[j] = EMPTY_VALUE;
    currLow[j] = EMPTY_VALUE;
}
  1. 修正索引使用
    将positiveRangeBar = BarIndex(shift1);改为positiveRangeBar = shift1;,同理处理negativeRangeBar。

  2. 添加拐点连线逻辑
    在标记新趋势段时,连接上一个对应拐点:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:04:50