You are on page 1of 8

// This work is licensed under a Attribution-NonCommercial-ShareAlike 4.

0 International (CC
BY-NC-SA 4.0) https://creativecommons.org/licenses/by-nc-sa/4.0/

// © LuxAlgo

//@version=5

indicator("Liquidity Swings [LuxAlgo]"

, overlay = true

, max_lines_count = 500

, max_labels_count = 500

, max_boxes_count = 500)

//------------------------------------------------------------------------------

//Settings

//-----------------------------------------------------------------------------{

length = input(14, 'Pivot Lookback')

area = input.string('Wick Extremity', 'Swing Area', options = ['Wick Extremity', 'Full Range'])

intraPrecision = input(false, 'Intrabar Precision', inline = 'intrabar')

intrabarTf = input.timeframe('1', '' , inline = 'intrabar')

filterOptions = input.string('Count', 'Filter Areas By', options = ['Count', 'Volume'], inline =


'filter')

filterValue = input.float(0, '' , inline = 'filter')

//Style

showTop = input(true, 'Swing High' , inline = 'top', group = 'Style')

topCss = input(color.red, '' , inline = 'top', group = 'Style')

topAreaCss = input(color.new(color.red, 50), 'Area', inline = 'top', group = 'Style')

showBtm = input(true, 'Swing Low' , inline = 'btm', group = 'Style')

btmCss = input(color.teal, '' , inline = 'btm', group = 'Style')

btmAreaCss = input(color.new(color.teal, 50), 'Area', inline = 'btm', group = 'Style')


labelSize = input.string('Tiny', 'Labels Size', options = ['Tiny', 'Small', 'Normal'], group = 'Style')

//-----------------------------------------------------------------------------}

//Functions

//-----------------------------------------------------------------------------{

n = bar_index

get_data()=> [high, low, volume]

[h, l, v] = request.security_lower_tf(syminfo.tickerid, intrabarTf, get_data())

get_counts(condition, top, btm)=>

var count = 0

var vol = 0.

if condition

count := 0

vol := 0.

else

if intraPrecision

if n > length

if array.size(v[length]) > 0

for [index, element] in v[length]

vol += array.get(l[length], index) < top and array.get(h[length], index) > btm ?
element : 0

else

vol += low[length] < top and high[length] > btm ? volume[length] : 0

count += low[length] < top and high[length] > btm ? 1 : 0


[count, vol]

set_label(count, vol, x, y, css, lbl_style)=>

var label lbl = na

var label_size = switch labelSize

'Tiny' => size.tiny

'Small' => size.small

'Normal' => size.normal

target = switch filterOptions

'Count' => count

'Volume' => vol

if ta.crossover(target, filterValue)

lbl := label.new(x, y, str.tostring(vol, format.volume)

, style = lbl_style

, size = label_size

, color = #00000000

, textcolor = css)

if target > filterValue

label.set_text(lbl, str.tostring(vol, format.volume))

set_level(condition, crossed, value, count, vol, css)=>

var line lvl = na

target = switch filterOptions

'Count' => count

'Volume' => vol

if condition
if target[1] < filterValue[1]

line.delete(lvl[1])

else if not crossed[1]

line.set_x2(lvl, n - length)

lvl := line.new(n - length, value, n, value

, color = na)

if not crossed[1]

line.set_x2(lvl, n+3)

if crossed and not crossed[1]

line.set_x2(lvl, n)

line.set_style(lvl, line.style_dashed)

if target > filterValue

line.set_color(lvl, css)

set_zone(condition, x, top, btm, count, vol, css)=>

var box bx = na

target = switch filterOptions

'Count' => count

'Volume' => vol

if ta.crossover(target, filterValue)

bx := box.new(x, top, x + count, btm

, border_color = na

, bgcolor = css)

if target > filterValue


box.set_right(bx, x + count)

//-----------------------------------------------------------------------------}

//Global variables

//-----------------------------------------------------------------------------{

//Pivot high

var float ph_top = na

var float ph_btm = na

var bool ph_crossed = na

var ph_x1 = 0

var box ph_bx = box.new(na,na,na,na

, bgcolor = color.new(topAreaCss, 80)

, border_color = na)

//Pivot low

var float pl_top = na

var float pl_btm = na

var bool pl_crossed = na

var pl_x1 = 0

var box pl_bx = box.new(na,na,na,na

, bgcolor = color.new(btmAreaCss, 80)

, border_color = na)

//-----------------------------------------------------------------------------}

//Display pivot high levels/blocks

//-----------------------------------------------------------------------------{

ph = ta.pivothigh(length, length)

//Get ph counts

[ph_count, ph_vol] = get_counts(ph, ph_top, ph_btm)


//Set ph area and level

if ph and showTop

ph_top := high[length]

ph_btm := switch area

'Wick Extremity' => math.max(close[length], open[length])

'Full Range' => low[length]

ph_x1 := n - length

ph_crossed := false

box.set_lefttop(ph_bx, ph_x1, ph_top)

box.set_rightbottom(ph_bx, ph_x1, ph_btm)

else

ph_crossed := close > ph_top ? true : ph_crossed

if ph_crossed

box.set_right(ph_bx, ph_x1)

else

box.set_right(ph_bx, n+3)

if showTop

//Set ph zone

set_zone(ph, ph_x1, ph_top, ph_btm, ph_count, ph_vol, topAreaCss)

//Set ph level

set_level(ph, ph_crossed, ph_top, ph_count, ph_vol, topCss)

//Set ph label

set_label(ph_count, ph_vol, ph_x1, ph_top, topCss, label.style_label_down)

//-----------------------------------------------------------------------------}
//Display pivot low levels/blocks

//-----------------------------------------------------------------------------{

pl = ta.pivotlow(length, length)

//Get pl counts

[pl_count, pl_vol] = get_counts(pl, pl_top, pl_btm)

//Set pl area and level

if pl and showBtm

pl_top := switch area

'Wick Extremity' => math.min(close[length], open[length])

'Full Range' => high[length]

pl_btm := low[length]

pl_x1 := n - length

pl_crossed := false

box.set_lefttop(pl_bx, pl_x1, pl_top)

box.set_rightbottom(pl_bx, pl_x1, pl_btm)

else

pl_crossed := close < pl_btm ? true : pl_crossed

if pl_crossed

box.set_right(pl_bx, pl_x1)

else

box.set_right(pl_bx, n+3)

if showBtm

//Set pl zone

set_zone(pl, pl_x1, pl_top, pl_btm, pl_count, pl_vol, btmAreaCss)


//Set pl level

set_level(pl, pl_crossed, pl_btm, pl_count, pl_vol, btmCss)

//Set pl labels

set_label(pl_count, pl_vol, pl_x1, pl_btm, btmCss, label.style_label_up)

//-----------------------------------------------------------------------------}

You might also like