I am trying to make a change to the Zigzag indicator below. In this indicator, the label with the structure of the line is displayed again and again with each new candle.
I want to make the label only show when the higst is high and the end of the line is reached. I tried to intervene in several queries but unfortunately could not implement a reasonable query that only displays the label at the end of the line.
I also considered querying the X and Y coordinates of the line. At the highest high and the end of the line, the old line and the new line should have the same coordinates. So it might be interesting to implement a query that queries the coordinates of the old and new line to query the highest high. So an idea would be interesting how I can display the label only at the end of the line in this indicator
//@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)
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)
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)
if 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"
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)
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)
if array.get(zigzag2, 2) == array.get(oldzigzag2, 2) and array.get(zigzag2, 3) == array.get(oldzigzag2, 3)
line.delete(zzline2)
label.delete(zzlabel2)
if showzz == "Show Zig Zag 2" or showzz == "Show Both"
label.new(bar_index, na, "", color=color.rgb(228, 34, 170), textcolor=color.black, style=label.style_label_up, yloc=yloc.belowbar)
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)
if 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"
labelcol = dir2 == 1 ? array.get(zigzag2, 0) > array.get(zigzag2, 4) ? upcol2 : dncol2 : array.get(zigzag2, 0) < array.get(zigzag2, 4) ? dncol2 : upcol2
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)