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

求ZigZag指标HH、LH、LL、HL的正确预警条件(解决数组越界)

Pine Script 高低形态预警修正方案

错误原因

你碰到的「Index 0 is out of bounds, array size is 0」错误,本质是预警代码直接访问zigzag1数组的索引,但数组初始化后是空的——图表加载初期、或者还没收集到足够高低点数据时,数组长度不够,强行访问索引0、4就会触发越界报错。

正确预警条件

预警需要满足两个核心前提:

  1. 数组长度至少为6(和标签显示的条件一致,保证有足够历史高低点可以对比)
  2. 捕捉形态刚确认的时刻(方向切换后,新的高低点被确定的瞬间,避免重复触发预警)

修正后的预警逻辑如下:

// 先定义形态确认的布尔变量,避免重复计算
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:20:04