Indicator on TV using HL and LH

barbaros

Administrator
Staff member
Strategies in TradingView will not enter you in trades in a live account. They are only for testing. I’m telling the feeling that you want it to auto enter and you close trades yourself by your comment.
 

trades4x

New member
Strategies in TradingView will not enter you in trades in a live account. They are only for testing. I’m telling the feeling that you want it to auto enter and you close trades yourself by your comment.
you are right, I want to analyze what method of profit target is best for this. A fixed one or let it run until trade reversal is received and then manually decide if I want to close earlier or wait until the reversal.

My goal is if I can get 2-3 good trades early in the morning, I can close the day and not worry about smaller reversal during rest of the day. and 95% morning time you get good reversals and good trades.

many time, if there is runaway trend and I catch that then that one trade can make 100% gains easy.

my analysis so far:

1. most big losses come from carryover trades from overnight. So, I want to close them the same day at the end of day

2. other big losses are when the price breaks the low of 4 or 5 bars when the trade was entered


so I want strategy tester to test with these 2 conditions and see if profit curve improves significantly
 
Last edited:

BrusselsAffair

New member
Any chance we could get these converted to thinkscript?
 

barbaros

Administrator
Staff member
you are right, I want to analyze what method of profit target is best for this. A fixed one or let it run until trade reversal is received and then manually decide if I want to close earlier or wait until the reversal.

My goal is if I can get 2-3 good trades early in the morning, I can close the day and not worry about smaller reversal during rest of the day. and 95% morning time you get good reversals and good trades.

many time, if there is runaway trend and I catch that then that one trade can make 100% gains easy.

my analysis so far:

1. most big losses come from carryover trades from overnight. So, I want to close them the same day at the end of day

2. other big losses are when the price breaks the low of 4 or 5 bars when the trade was entered


so I want strategy tester to test with these 2 conditions and see if profit curve improves significantly
Understood. I’ll try to help add the conditions when I get more free time.
 

barbaros

Administrator
Staff member
Any chance we could get these converted to thinkscript?
This won’t be an easy conversion. ToS doesn’t have arbitrary array capabilities.
 

barbaros

Administrator
Staff member
i made additions for strategy tester ... now one last thing...

1) can u add an option to close the open trade at end of day or set time
2) or close/stop a buy if price drops below 5 bar low and close/stop a sell if price breaks above 5 bar high

the strategy code is here:
********************************************************************************************************************************************
Code:
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue

// Modified to add confirmed buy and sell signals for https://b4indicators.com/threads/indicator-on-tv-using-hl-and-lh.238/

//@version=4
strategy("Double Zig Zag with HHLL B4Signals", overlay = true, max_bars_back = 500)

prd1 = input(defval = 8, title="ZigZag Period 1", minval = 2, maxval = 20)
prd2 = input(defval = 20, title="ZigZag Period 2", minval = 2, maxval = 50)
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")
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(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)
zz2width = input(defval = 3, title = "Zig zag 2 Line Width", minval = 1, maxval = 6)

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

var dir1 = 0
var dir2 = 0
dir1 := iff(ph1 and na(pl1), 1, iff(pl1 and na(ph1), -1, dir1))
dir2 := iff(ph2 and na(pl2), 1, iff(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)

var direction1 = 0
var direction2 = 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)

dir2changed = 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)
        direction1 := dir1 == 1 and array.get(zigzag1, 0) <= array.get(zigzag1, 4) ? -1 : dir1 == -1 and array.get(zigzag1, 0) >= array.get(zigzag1, 4) ? 1 : 0
        if showzz == "Show Zig Zag 1" or showzz == "Show Both"
            zzline1 := line.new( x1 = round(array.get(zigzag1, 1)), y1 = array.get(zigzag1, 0), x2 = 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 = 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"
            zzline2 := line.new(x1 = round(array.get(zigzag2, 1)), y1 = array.get(zigzag2, 0), x2 = 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 = 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)


barhigh5 = highestbars(close, 5)
barlow5  = lowestbars(close, 5)

plot(barhigh5, title="High/Low X Bars Line", color=color.orange)

plot(barlow5, title="High/Low X Bars Line", color=color.blue)

direction1_signal = 0
direction1_signal := direction1[1] == 1 and direction1 == 1 and close > open ? 1 : direction1[1] == -1 and direction1 == -1 and close < open ? -1 : direction1 == 0 ? 0 : direction1_signal[1]

BuySignal1 = crossover(direction1_signal, 0)
SellSignal1 = crossunder(direction1_signal, 0)

direction2_signal = 0
direction2_signal := direction2[1] == 1 and direction2 == 1 and close > open ? 1 : direction2[1] == -1 and direction2 == -1 and close < open ? -1 : direction2 == 0 ? 0 : direction2_signal[1]

BuySignal2 = crossover(direction2_signal, 0)
SellSignal2 = crossunder(direction2_signal, 0)

plotshape(BuySignal1, title="Buy1", text="Buy", style=shape.labelup, location=location.belowbar, color=color.rgb(0, 255, 0), textcolor=color.rgb(0, 0, 0), size=size.normal)
plotshape(SellSignal1, title="Sell1", text="Sell", style=shape.labeldown, location=location.abovebar, color=color.rgb(255, 0, 0), textcolor=color.rgb(255, 255, 255), size=size.normal)

plotshape(BuySignal2, title="Buy2", text="Buy2", style=shape.labelup, location=location.belowbar, color=color.rgb(0, 255, 0), textcolor=color.rgb(0, 0, 0), size=size.normal)
plotshape(SellSignal2, title="Sell2", text="Sell2", style=shape.labeldown, location=location.abovebar, color=color.rgb(255, 0, 0), textcolor=color.rgb(255, 255, 255), size=size.normal)


//Strategy

strategy.entry("long", strategy.long, when=BuySignal1)

strategy.entry("short",strategy.short, when=SellSignal1)
Is this a trailing stop loss of 5 bars high/low?
 

barbaros

Administrator
Staff member
not necessarily, that can be just hard stop. Can we chose number of bars for stop in parameter? and this will be low of 4 or 5 bars when the trade was entered
Then, what is your target? 1:1? 1:2? Until next signal?
 

trades4x

New member
Then, what is your target? 1:1? 1:2? Until next signal?
Yes that can be default and we can vary these values in strategy tester to find best combinations
or like I have seen in another algo, it says profit target in % so tgt1 = .4 , tgt2=.8 , stop=.4 (tgts or stops can be on or off) for testing various combinations

so, if not using stops then hard stop of 4 or 5 bars low at time of entry can be a stop or when the new opposite signal is triggered

same way if tgt1 & tgt2 are off then target can be when the opposite signal is triggered
 

barbaros

Administrator
Staff member
@trades4x How would you avoid the false signals? We all know there is no way to avoid all false signals in any system, but what could be ways to minimize so we can code those too.

3mT1zux.png
 

trades4x

New member
there are 2 ways:

1) a false signal will get stopped by break of 4 or 5 bar low or high

2) we can flip a long to sell and vice versa if the low of 4 or 5 bar is broken after the entry.

ability to select both options on or off will help in testing different combinations

like as in screenshot, the 2 false signals would have given profit on reversal of the trade

 

trades4x

New member
another example of how flipping sell to buy when last 4 or 5 bars high was broken ... turned a losing trade in to a mega winner

Note:- low of 4 or 5 bars - some tolerance (like 1pt or whatever a user wants to set it to), so it will avoid some fake breaks

 
Last edited:
Top