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

Zigzag指标优化:仅在最高点线段结束时显示标签

解决Zigzag指标重复显示标签的问题

原指标会随每根新K线重复生成线段标签,需求是仅在**最高高点(HH)且线段端点确认(不再更新)**时显示标签。核心思路是通过对比新旧线段的坐标,确认端点稳定后再创建标签。

修改后的完整代码

//@version=5
indicator("Test 62", overlay = true, max_bars_back = 500)

prd1 = input.int(defval = 8, title="ZigZag Period 1", minval = 2, maxval = 20)
prd2 = input.int(defval = 20, title="ZigZag Period 2", minval = 2, maxval = 50)
showzz = input.string(defval = "Show Both", title = "Show Zig Zags", options = ["Show Zig Zag 1", "Show Zig Zag 2", "Show Both", "Show None"])
showhhll = input.string(defval = "Show Both", title = "Show HHLL", options = ["Show HHLL 1", "Show HHLL 2", "Show Both", "Show None"])
upcol1 = input(defval = color.lime, title = "Zig Zag 1 Up Color")
dncol1 = input(defval = color.red, title = "Zig Zag 1 Down Color")
upcol2 = input(defval = color.blue, title = "Zig Zag 2 Up Color")
dncol2 = input(defval = color.purple, title = "Zig Zag 2 Down Color")
txtcol = input(defval = color.black, title = "Text Color")
zz1style = input.string(defval = "Dashed", title = "Zig Zag 1 Line Style", options = ["Dashed", "Dotted"])
zz1width = input.int(defval = 2, title = "Zig zag 1 Line Width", minval = 1, maxval = 4)
zz2width = input.int(defval = 3, title = "Zig zag 2 Line Width", minval = 1, maxval = 6)

float ph1 = ta.highestbars(open, prd1) == 0 ? open : na
float pl1 = ta.lowestbars(close, prd1) == 0 ? close : na
float ph2 = ta.highestbars(open, prd2) == 0 ? open : na
float pl2 = ta.lowestbars(close, prd2) == 0 ? close : na

var dir1 = 0
var dir2 = 0

dir1 := ph1 and na(pl1) ? 1 : pl1 and na(ph1) ? -1 : dir1
dir2 := ph2 and na(pl2) ? 1 : pl2 and na(ph2) ? -1 : dir2

var max_array_size = 10 // [5, 2] matrix
var zigzag1 = array.new_float(0)
var zigzag2 = array.new_float(0)
oldzigzag1 = array.copy(zigzag1)
oldzigzag2 = array.copy(zigzag2)

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)

dir2changed = ta.change(dir2)
if ph2 or pl2
    if dir2changed
        add_to_zigzag(zigzag2, dir2 == 1 ? ph2 : pl2, bar_index)
    else
        update_zigzag(zigzag2, dir2 == 1 ? ph2 : pl2, bar_index, dir2)

// ZigZag 1 处理逻辑:仅在端点确认时显示标签
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)
        line.delete(zzline1)
        label.delete(zzlabel1)
        
        // 绘制新线段
        if showzz == "Show Zig Zag 1" or showzz == "Show Both"
            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, 
                style = zz1style == "Dashed" ? line.style_dashed : line.style_dotted
            )
    
    // 关键判断:当前端点与上一根K线的端点完全一致,说明端点已确认(不再更新)
    is_endpoint_confirmed = array.size(oldzigzag1)>=2 and 
                           array.get(zigzag1, 0) == array.get(oldzigzag1, 0) and 
                           array.get(zigzag1, 1) == array.get(oldzigzag1, 1)
    
    // 仅在端点确认且是最高高点时创建标签
    if is_endpoint_confirmed and (showhhll == "Show HHLL 1" or showhhll == "Show Both")
        hhlltxt = dir1 == 1 ? (array.get(zigzag1, 0) > array.get(zigzag1, 4) ? "HH" : "LH") : (array.get(zigzag1, 0) < array.get(zigzag1, 4) ? "LL" : "HL")
        // 只显示HH标签,若需要其他标签可删除此判断
        if hhlltxt == "HH"
            labelcol = dir1 == 1 ? upcol1 : dncol1
            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
            )

// ZigZag 2 处理逻辑:与ZigZag1一致
if array.size(zigzag2) >= 6
    var line zzline2 = na
    var label zzlabel2 = na
    
    if array.get(zigzag2, 0) != array.get(oldzigzag2, 0) or array.get(zigzag2, 1) != array.get(oldzigzag2, 1)
        line.delete(zzline2)
        label.delete(zzlabel2)
        
        if showzz == "Show Zig Zag 2" or showzz == "Show Both"
            zzline2 := line.new(
                x1 = math.round(array.get(zigzag2, 1)), y1 = array.get(zigzag2, 0), 
                x2 = math.round(array.get(zigzag2, 3)), y2 = array.get(zigzag2, 2), 
                color = dir2 == 1 ? upcol2 : dncol2, width = zz2width
            )
    
    is_endpoint_confirmed = array.size(oldzigzag2)>=2 and 
                           array.get(zigzag2, 0) == array.get(oldzigzag2, 0) and 
                           array.get(zigzag2, 1) == array.get(oldzigzag2, 1)
    
    if is_endpoint_confirmed and (showhhll == "Show HHLL 2" or showhhll == "Show Both")
        hhlltxt = dir2 == 1 ? (array.get(zigzag2, 0) > array.get(zigzag2, 4) ? "HH" : "LH") : (array.get(zigzag2, 0) < array.get(zigzag2, 4) ? "LL" : "HL")
        if hhlltxt == "HH"
            labelcol = dir2 == 1 ? upcol2 : dncol2
            zzlabel2 := label.new(
                x = math.round(array.get(zigzag2, 1)), y = array.get(zigzag2, 0), 
                text = hhlltxt, color = labelcol, textcolor = txtcol, 
                style = dir2 == 1 ? label.style_label_down : label.style_label_up
            )

核心修改说明

  • 端点确认判断:新增is_endpoint_confirmed变量,对比当前zigzag数组和上一根K线的oldzigzag数组的前两个元素(端点的价格和K线索引),只有当两者完全一致时,说明这个端点已经稳定,不会再被后续K线更新。
  • 标签显示控制:仅在is_endpoint_confirmed为真且标签类型为HH时,才创建标签,避免重复生成。
  • 清理旧元素:在线段更新时先删除旧的线和标签,避免界面残留无效元素。

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:17:02