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
相关产品推荐
相关产品推荐

