Untitled

 avatar
unknown
plain_text
5 months ago
3.5 kB
19
Indexable
//@version=5
indicator('Single Zig Zag with HHLL', overlay=true, max_bars_back=1000)

// Input for ZigZag period
prd = input.int(defval=14, title='ZigZag Period', minval=2, maxval=500)

// Input for showing ZigZag and HHLL
showzz = input.string(defval='Show', title='Show Zig Zag', options=['Show', 'Hide'])
showhhll = input.string(defval='Show', title='Show HHLL', options=['Show', 'Hide'])

// Colors are now fixed
upcol = color.new(#ffb74d, 0)  // Fixed color for Zig Zag Up
dncol = color.new(#ffb74d, 0)  // Fixed color for Zig Zag Down
txtcol = color.black
zzstyle = input.string(defval='Solid', title='Zig Zag Line Style', options=['Solid', 'Dashed', 'Dotted'])
zzwidth = input.int(defval=2, title='Zig Zag Line Width', minval=1, maxval=4)

// Variables to store high and low points
float ph = ta.highestbars(high, prd) == 0 ? high : na
float pl = ta.lowestbars(low, prd) == 0 ? low : na

var dir = 0  // Variable to track direction (1 = up, -1 = down)
iff_1 = pl and na(ph) ? -1 : dir
dir := ph and na(pl) ? 1 : iff_1

var max_array_size = 10  // Define the maximum array size
var zigzag = array.new_float(0)
oldzigzag = array.copy(zigzag)

// Function to add points to the zigzag array
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)

// Function to update zigzag points based on direction
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)
        na

// Check for direction change
dirchanged = ta.change(dir)
if ph or pl
    if dirchanged
        add_to_zigzag(zigzag, dir == 1 ? ph : pl, bar_index)
    else
        update_zigzag(zigzag, dir == 1 ? ph : pl, bar_index, dir)

// Plot the zigzag and label HH/LL if there are enough points
if array.size(zigzag) >= 6
    var line zzline = na
    var label zzlabel = na
    if array.get(zigzag, 0) != array.get(oldzigzag, 0) or array.get(zigzag, 1) != array.get(oldzigzag, 1)
        if array.get(zigzag, 2) == array.get(oldzigzag, 2) and array.get(zigzag, 3) == array.get(oldzigzag, 3)
            line.delete(zzline)
            label.delete(zzlabel)
        if showzz == 'Show'
            zzline := line.new(x1=math.round(array.get(zigzag, 1)), y1=array.get(zigzag, 0), x2=math.round(array.get(zigzag, 3)), y2=array.get(zigzag, 2), color=dir == 1 ? upcol : dncol, width=zzwidth, style=zzstyle == 'Dashed' ? line.style_dashed : zzstyle == 'Dotted' ? line.style_dotted : line.style_solid)  // Added Solid option
            zzline
        if showhhll == 'Show'
            hhlltxt = dir == 1 ? array.get(zigzag, 0) > array.get(zigzag, 4) ? 'HH' : 'LH' : array.get(zigzag, 0) < array.get(zigzag, 4) ? 'LL' : 'HL'
            labelcol = dir == 1 ? array.get(zigzag, 0) > array.get(zigzag, 4) ? upcol : dncol : array.get(zigzag, 0) < array.get(zigzag, 4) ? dncol : upcol
            zzlabel := label.new(x=math.round(array.get(zigzag, 1)), y=array.get(zigzag, 0), text=hhlltxt, color=labelcol, textcolor=txtcol, style=dir == 1 ? label.style_label_down : label.style_label_up)
            zzlabel

Editor is loading...
Leave a Comment