Untitled

 avatar
s7s
plain_text
5 months ago
6.4 kB
22
Indexable
// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
// © LuxAlgo

//@version=5
indicator("Trendlines with Breaks [LuxAlgo]", overlay=true)

// Inputs
length = input.int(14)
k = input.float(1.0, 'Slope', minval=0, step=0.1)
method = input.string('Atr', 'Slope Calculation Method', options=['Atr', 'Stdev', 'Linreg'])
show = input(false, 'Show Only Confirmed Breakouts')

// Variables
var float upper = na
var float lower = na
var float slope_ph = na
var float slope_pl = na
src = close
n = bar_index

// Pivot points
ph = ta.pivothigh(length, length)
pl = ta.pivotlow(length, length)

// Slope calculation
slope = switch method
    'Atr' => ta.atr(length) / length * k
    'Stdev' => ta.stdev(src, length) / length * k
    'Linreg' => math.abs(ta.sma(src * bar_index, length) - ta.sma(src, length) * ta.sma(bar_index, length)) / ta.variance(n, length) / 2 * k

slope_ph := ph ? slope : slope_ph[1]
slope_pl := pl ? slope : slope_pl[1]

upper := ph ? ph : upper[1] - slope_ph
lower := pl ? pl : lower[1] + slope_pl

// Breakout detection
single_upper = 0
single_lower = 0
single_upper := src[length] > upper ? 0 : ph ? 1 : single_upper[1]
single_lower := src[length] < lower ? 0 : pl ? 1 : single_lower[1]
upper_breakout = single_upper[1] and src[length] > upper and (show ? src > src[length] : 1)
lower_breakout = single_lower[1] and src[length] < lower and (show ? src < src[length] : 1)

plotshape(upper_breakout ? low[length] : na, "Upper Break", shape.labelup, location.absolute, #26a69a, -length, text="B", textcolor=color.white, size=size.tiny)
plotshape(lower_breakout ? high[length] : na, "Lower Break", shape.labeldown, location.absolute, #ef5350, -length, text="B", textcolor=color.white, size=size.tiny)

// Trendlines
var line up_l = na
var line dn_l = na
var label recent_up_break = na
var label recent_dn_break = na

if ph[1]
    line.delete(up_l[1])
    label.delete(recent_up_break[1])
    up_l := line.new(n - length - 1, ph[1], n - length, upper, color=#26a69a, extend=extend.right, style=line.style_dashed)

if pl[1]
    line.delete(dn_l[1])
    label.delete(recent_dn_break[1])
    dn_l := line.new(n - length - 1, pl[1], n - length, lower, color=#ef5350, extend=extend.right, style=line.style_dashed)

if ta.crossover(src, upper - slope_ph * length)
    label.delete(recent_up_break[1])
    recent_up_break := label.new(n, low, 'B', color=#26a69a, textcolor=color.white, style=label.style_label_up, size=size.small)

if ta.crossunder(src, lower + slope_pl * length)
    label.delete(recent_dn_break[1])
    recent_dn_break := label.new(n, high, 'B', color=#ef5350, textcolor=color.white, style=label.style_label_down, size=size.small)

// Plotting
plot(upper, 'Upper', color=ph ? na : #26a69a, offset=-length)
plot(lower, 'Lower', color=pl ? na : #ef5350, offset=-length)

alertcondition(ta.crossover(src, upper - slope_ph * length), 'Upper Breakout', 'Price broke upper trendline')
alertcondition(ta.crossunder(src, lower + slope_pl * length), 'Lower Breakout', 'Price broke lower trendline')

// Constants
var START_OFFSET = 0
var END_OFFSET = 25

// Inputs for liquidity levels
var g_htf = "HTF Liquidity"
var g_intraday = "Intraday Liquidity"
var g_purged = "Purged Liquidity"

i_isDailyEnabled = input(true, "Daily", inline="Daily", group=g_htf)
i_dailyAboveLiquidityColor = input(color.new(#8931ac, 35), "", inline="Daily", group=g_htf)
i_dailyBelowLiquidityColor = input(color.new(#8931ac, 35), "", inline="Daily", group=g_htf)
i_dailyWidth = input(2, "Width", inline="Daily", group=g_htf)

i_isWeeklyEnabled = input(true, "Weekly", inline="Weekly", group=g_htf)
i_weeklyAboveLiquidityColor = input(color.new(#3e76d6, 46), "", inline="Weekly", group=g_htf)
i_weeklyBelowLiquidityColor = input(color.new(#3e76d6, 46), "", inline="Weekly", group=g_htf)
i_weeklyWidth = input(5, "Width", inline="Weekly", group=g_htf)

i_is1HEnabled = input(true, "1H", inline="1H", group=g_intraday)
i_1HAboveLiquidityColor = input(color.rgb(231, 173, 74, 32), "", inline="1H", group=g_intraday)
i_1HBelowLiquidityColor = input(color.rgb(231, 173, 74, 32), "", inline="1H", group=g_intraday)
i_1HWidth = input(1, "Width", inline="1H", group=g_intraday)

i_is4HEnabled = input(true, "4H", inline="4H", group=g_intraday)
i_4HAboveLiquidityColor = input(color.rgb(29, 90, 47, 32), "", inline="4H", group=g_intraday)
i_4HBelowLiquidityColor = input(color.rgb(29, 90, 47, 32), "", inline="4H", group=g_intraday)
i_4HWidth = input(1, "Width", inline="4H", group=g_intraday)

i_purgedLevelColor = input(color.new(color.gray, 70), "Color", group=g_purged)
i_purgedLevelStyle = input.string("Dashed", "Style", ["Solid", "Dashed", "Dotted"], group=g_purged)
i_showPurgeDaily = input(false, "Show Purge Daily", group=g_purged)
i_showPurgeWeekly = input(false, "Show Purge Weekly", group=g_purged)
i_showPurge1H = input(false, "Show Purge 1H", group=g_purged)
i_showPurge4H = input(false, "Show Purge 4H", group=g_purged)

// Variables for liquidity levels : 
var highsArray = array.new_float()
var lowsArray = array.new_float()
var highLinesArray = array.new_line()
var lowLinesArray = array.new_line()
var purgedLinesArray = array.new_line()
var float dayHigh = na
var float dayLow = na

var highsTFnumArray = array.new_int()
var lowsTFnumArray = array.new_int()
var purgedTFnumArray = array.new_int()
// 
int TF_D   = 1
int TF_W   = 2
int TF_M   = 3
int TF_240 = 4
int TF_60  = 5

[prevDayHigh, prevDayLow] = request.security(syminfo.tickerid, "D", [high[1], low[1]], lookahead=barmerge.lookahead_on)
[prevWeekHigh, prevWeekLow] = request.security(syminfo.tickerid, "W", [high[1], low[1]], lookahead=barmerge.lookahead_on)
[prevMonthHigh, prevMonthLow] = request.security(syminfo.tickerid, "M", [high[1], low[1]], lookahead=barmerge.lookahead_on)
[prev4HHigh, prev4HLow] = request.security(syminfo.tickerid, "240", [high[1], low[1]], lookahead=barmerge.lookahead_on)
[prev1HHigh, prev1HLow] = request.security(syminfo.tickerid, "60", [high[1], low[1]], lookahead=barmerge.lookahead_on)

// Functions
f_drawLine(float _y, color _c, int _w=1) => line.new(bar_index, _y, bar_index, _y, color=_c, width=_w)

f_create(float _high, float _low, color _upperColor, color _lowerColor, int _linewidth, int aTFnum) =>
    array.push(highsArray, _high)
    array.push(lowsArray, _low)
    array.push(highLinesArray, f_drawLine(_high, _upperColor
Editor is loading...