Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
349 views
in Technique[技术] by (71.8m points)

How to create an alert in pine script depending on the result of dynamic label?

(Edited) Hello, I'm trying to include alerts from this indicator I found in Tradingview.

Indicator: TradingView

I need 4 alerts when the current candle is greater than HH and LH or lower than LL and HL.

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=4
study(title="Double Zig Zag with HHLL", overlay = true)

////////////////////
prd1 = input(defval = 8, title="ZigZag Period 1", minval = 2, maxval = 20)
showzz = input(defval = "Show Both", title = "Show Zig Zags", options = ["Show Zig Zag 1", "Show Zig Zag 2", "Show Both", "Show None"])
showhhll = input(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")
txtcol = input(defval = color.black, title = "Text Color")
zz1style = input(defval = "Dashed", title = "Zig Zag 1 Line Style", options = ["Dashed", "Dotted"])
zz1width = input(defval = 2, title = "Zig zag 1 Line Width", minval = 1, maxval = 4)

float ph1 = highestbars(high, prd1) == 0 ? high : na
float pl1 = lowestbars(low, prd1) == 0 ? low : na

var dir1 = 0


dir1 := iff(ph1 and na(pl1), 1, iff(pl1 and na(ph1), -1, dir1))

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

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 = 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
    float val = array.get(zigzag1, 0)
    int point = round(array.get(zigzag1, 1))
    if change(val) or change(point)
        float val1 = array.get(zigzag1, 2)
        int point1 = round(array.get(zigzag1, 3))
        if change(val1) == 0 and change(point1) == 0
            line.delete(zzline1)
            label.delete(zzlabel1)
        if showzz == "Show Zig Zag 1" or showzz == "Show Both"
            zzline1 := line.new(x1 = point, y1 = val, x2 = point1, y2 = val1, 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 = point, y = val, text = hhlltxt, color = labelcol, textcolor = txtcol, style = dir1 == 1 ? label.style_label_down : label.style_label_up) 


////////Trigger zigzag1
hh= (array.get(zigzag1, 0))
ll= (array.get(zigzag1, 6))

triggerHL()=>
    hh== crossover(close,(array.get(zigzag1, 0)))
    ll== crossunder(close,(array.get(zigzag1, 6)))
    if hh
        alert("COhh crossing up hh level", alert.freq_once_per_bar)
    else if ll
        alert("CUll crossing up ll level", alert.freq_once_per_bar)

The way I'm trying to do this is getting?the info from?zigzag1. As advised in the comments, I'm following the new functionality for alerts.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

hh and ll- these are boolean variables, so they are not converted to a string, but this is not necessary. If their value is true, then we know which vertex the zigzag has.

////////Trigger zigzag1
hh= (array.get(zigzag1, 0))
ll= (array.get(zigzag1, 6))

triggerHL()=>
    hh= crossover(close,(array.get(zigzag1, 0)))
    ll= crossunder(close,(array.get(zigzag1, 6)))
    if hh
        alert("COhh crossing up hh level", alert.freq_once_per_bar)
    else if ll
        alert("CUll crossing up ll level", alert.freq_once_per_bar)

[ADDON]

//@version=4
study(title="Help (Double Zig Zag with HHLL)", overlay = true)

////////////////////
prd1 = input(defval = 8, title="ZigZag Period 1", minval = 2, maxval = 20)
showzz = input(defval = "Show Both", title = "Show Zig Zags", options = ["Show Zig Zag 1", "Show Zig Zag 2", "Show Both", "Show None"])
showhhll = input(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")
txtcol = input(defval = color.black, title = "Text Color")
zz1style = input(defval = "Dashed", title = "Zig Zag 1 Line Style", options = ["Dashed", "Dotted"])
zz1width = input(defval = 2, title = "Zig zag 1 Line Width", minval = 1, maxval = 4)

float ph1 = highestbars(high, prd1) == 0 ? high : na
float pl1 = lowestbars(low, prd1) == 0 ? low : na

var dir1 = 0


dir1 := iff(ph1 and na(pl1), 1, iff(pl1 and na(ph1), -1, dir1))

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

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 = 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
    float val = array.get(zigzag1, 0)
    int point = round(array.get(zigzag1, 1))
    if change(val) or change(point)
        float val1 = array.get(zigzag1, 2)
        int point1 = round(array.get(zigzag1, 3))
        if change(val1) == 0 and change(point1) == 0
            line.delete(zzline1)
            label.delete(zzlabel1)
        if showzz == "Show Zig Zag 1" or showzz == "Show Both"
            zzline1 := line.new(x1 = point, y1 = val, x2 = point1, y2 = val1, 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 = point, y = val, text = hhlltxt, color = labelcol, textcolor = txtcol, style = dir1 == 1 ? label.style_label_down : label.style_label_up) 
            alert("New label: " + hhlltxt, alert.freq_once_per_bar) // added string


////////Trigger zigzag1
//hh= (array.get(zigzag1, 0))
//ll= (array.get(zigzag1, 6))

//triggerHL()=>
// hh= crossover(close,(array.get(zigzag1, 0)))
// ll= crossunder(close,(array.get(zigzag1, 6)))
// if hh
//     alert("COhh crossing up hh level", alert.freq_once_per_bar)
// else if ll
//     alert("CUll crossing up ll level", alert.freq_once_per_bar)

enter image description here


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...