求ZigZag指标HH、LH、LL、HL的正确预警条件(解决数组越界)
Pine Script 高低形态预警修正方案
错误原因
你碰到的「Index 0 is out of bounds, array size is 0」错误,本质是预警代码直接访问zigzag1数组的索引,但数组初始化后是空的——图表加载初期、或者还没收集到足够高低点数据时,数组长度不够,强行访问索引0、4就会触发越界报错。
正确预警条件
预警需要满足两个核心前提:
- 数组长度至少为6(和标签显示的条件一致,保证有足够历史高低点可以对比)
- 捕捉形态刚确认的时刻(方向切换后,新的高低点被确定的瞬间,避免重复触发预警)
修正后的预警逻辑如下:
// 先定义形态确认的布尔变量,避免重复计算 isHH = array.size(zigzag1) >= 6 and dir1 == 1 and array.get(zigzag1, 0) > array.get(zigzag1, 4) and dir1changed isLH = array.size(zigzag1) >= 6 and dir1 != 1 and array.get(zigzag1, 0) > array.get(zigzag1, 4) and dir1changed isLL = array.size(zigzag1) >= 6 and dir1 != 1 and array.get(zigzag1, 0) < array.get(zigzag1, 4) and dir1changed isHL = array.size(zigzag1) >= 6 and dir1 == 1 and array.get(zigzag1, 0) < array.get(zigzag1, 4) and dir1changed // 预警条件 alertcondition(isHH, title='Higher High (HH)', message='出现Higher High形态') alertcondition(isLH, title='Lower High (LH)', message='出现Lower High形态') alertcondition(isLL, title='Lower Low (LL)', message='出现Lower Low形态') alertcondition(isHL, title='Higher Low (HL)', message='出现Higher Low形态')
完整修正代码
//@version=5 indicator('Testing', overlay=true) prd1 = input.int(defval=30, title='ZigZag Period', minval=2) upcol1 = color.lime dncol1 = color.red txtcol = color.black zz1width = 1 float ph1 = ta.highestbars(high, prd1) == 0 ? high : na float pl1 = ta.lowestbars(low, prd1) == 0 ? low : na var dir1 = 0 iff_1 = pl1 and na(ph1) ? -1 : dir1 dir1 := ph1 and na(pl1) ? 1 : iff_1 var max_array_size = 10 // [5, 2] matrix var zigzag1 = array.new_float(0) oldzigzag1 = array.copy(zigzag1) add_to_zigzag(pointer, value, bindex) => array.unshift(pointer, bindex) array.unshift(pointer, value) if array.size(pointer) > max_array_size array.pop(pointer) array.pop(pointer) update_zigzag(pointer, value, bindex, dir) => if array.size(pointer) == 0 add_to_zigzag(pointer, value, bindex) else if dir == 1 and value > array.get(pointer, 0) or dir == -1 and value < array.get(pointer, 0) array.set(pointer, 0, value) array.set(pointer, 1, bindex) 0. dir1changed = ta.change(dir1) if ph1 or pl1 if dir1changed add_to_zigzag(zigzag1, dir1 == 1 ? ph1 : pl1, bar_index) else update_zigzag(zigzag1, dir1 == 1 ? ph1 : pl1, bar_index, dir1) if array.size(zigzag1) >= 6 var line zzline1 = na var label zzlabel1 = na if array.get(zigzag1, 0) != array.get(oldzigzag1, 0) or array.get(zigzag1, 1) != array.get(oldzigzag1, 1) if array.get(zigzag1, 2) == array.get(oldzigzag1, 2) and array.get(zigzag1, 3) == array.get(oldzigzag1, 3) line.delete(zzline1) label.delete(zzlabel1) zzline1 := line.new(x1=math.round(array.get(zigzag1, 1)), y1=array.get(zigzag1, 0), x2=math.round(array.get(zigzag1, 3)), y2=array.get(zigzag1, 2), color=dir1 == 1 ? upcol1 : dncol1, width=zz1width) hhlltxt = dir1 == 1 ? array.get(zigzag1, 0) > array.get(zigzag1, 4) ? 'HH' : 'LH' : array.get(zigzag1, 0) < array.get(zigzag1, 4) ? 'LL' : 'HL' labelcol = dir1 == 1 ? array.get(zigzag1, 0) > array.get(zigzag1, 4) ? upcol1 : dncol1 : array.get(zigzag1, 0) < array.get(zigzag1, 4) ? dncol1 : upcol1 zzlabel1 := label.new(x=math.round(array.get(zigzag1, 1)), y=array.get(zigzag1, 0), text=hhlltxt, color=labelcol, textcolor=txtcol, style=dir1 == 1 ? label.style_label_down : label.style_label_up) // --- 修正后的预警条件 --- isHH = array.size(zigzag1) >= 6 and dir1 == 1 and array.get(zigzag1, 0) > array.get(zigzag1, 4) and dir1changed isLH = array.size(zigzag1) >= 6 and dir1 != 1 and array.get(zigzag1, 0) > array.get(zigzag1, 4) and dir1changed isLL = array.size(zigzag1) >= 6 and dir1 != 1 and array.get(zigzag1, 0) < array.get(zigzag1, 4) and dir1changed isHL = array.size(zigzag1) >= 6 and dir1 == 1 and array.get(zigzag1, 0) < array.get(zigzag1, 4) and dir1changed alertcondition(isHH, title='Higher High (HH)', message='出现Higher High形态') alertcondition(isLH, title='Lower High (LH)', message='出现Lower High形态') alertcondition(isLL, title='Lower Low (LL)', message='出现Lower Low形态') alertcondition(isHL, title='Higher Low (HL)', message='出现Higher Low形态')
关键说明
- 新增
array.size(zigzag1) >= 6的判断,确保数组有足够数据可以访问索引0、4,彻底避免越界报错 - 加入
dir1changed(方向变化)的判断,只在形态刚确认的那一刻触发预警,不会每根K线重复触发 - 把形态判断逻辑抽成单独的布尔变量,代码更清晰易维护
内容的提问来源于stack exchange,提问作者Jakx
相关产品推荐
相关产品推荐

