Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 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/
- // © alexgrover
- //@version=5
- indicator('Swing High/Low Anchored Spiral', overlay=true, max_bars_back=1000, max_lines_count=500)
- //Swing High/Low Settings
- length = input.int(14, minval=2, maxval=499, group='Swing')
- ref = input.int(0, 'Occurence', minval=0, group='Swing')
- anchor_mode = input.string('Swing High', 'Anchor Point', options=['Swing High', 'Swing Low'], group='Swing')
- //Spiral Settings
- turns = input.int(2, 'Spiral Turns', minval=1, group='Spiral')
- fliph = input.bool(false, 'Flip Horizontally', group='Spiral')
- flipv = input.bool(false, 'Flip Vertically', group='Spiral')
- //Style Settings
- solid = input.bool(false, 'Use Solid Color', inline='inlinesolid', group='Style')
- solid_col = input.color(#2157f3, '', inline='inlinesolid', group='Style')
- gradient_min = input.color(#ff1100, 'Gradient Colors', inline='inlinegradient', group='Style')
- gradient_max = input.color(#0cb51a, '', inline='inlinegradient', group='Style')
- //------------------------------------------------------------------------------
- n = bar_index
- var pi = math.pi
- var anchor = 0
- var color col = na
- var lines = array.new_line(0)
- yval = array.new_float(0)
- xval = array.new_int(0)
- prices = array.new_float(0)
- //Flipping Constants
- flip_h = fliph ? -1 : 1
- flip_v = flipv ? -1 : 1
- //Get Swing High/Low
- ph = ta.pivothigh(length, length)
- pl = ta.pivotlow(length, length)
- ph_val = ta.valuewhen(ph, high[length], ref)
- pl_val = ta.valuewhen(pl, low[length], ref)
- //Get anchor corrdinate
- if anchor_mode == 'Swing High'
- anchor := ta.valuewhen(ph, n - length, ref)
- anchor
- else
- anchor := ta.valuewhen(pl, n - length, ref)
- anchor
- len = n - anchor
- //Append lines
- if barstate.isfirst
- for i = 0 to 499 by 1
- array.push(lines, line.new(na, na, na, na))
- //------------------------------------------------------------------------------
- y1 = 0.
- y2 = 0.
- max = 0.
- min = 0.
- if barstate.islast
- //Append spiral coordinates to arays
- for i = 0 to len - 1 by 1
- t = i / (len - 1) * turns * pi
- x = t * math.cos(t) * flip_h / pi / turns * len + anchor
- y = t * math.sin(t) * flip_v / pi
- array.push(yval, y)
- array.push(xval, int(x))
- for i = 0 to array.max(xval) - array.min(xval) - 1 by 1
- array.push(prices, close[i])
- //Rescale coordinates and set line corrdinates
- for i = 1 to len - 1 by 1
- yval_max = array.max(yval)
- yval_min = array.min(yval)
- yval_range = yval_max - yval_min
- range_1 = array.max(prices) - array.min(prices)
- x1 = array.get(xval, i - 1)
- x2 = array.get(xval, i)
- if anchor_mode == 'Swing High'
- y1 := ph_val + array.get(yval, i - 1) / yval_range * range_1
- y2 := ph_val + array.get(yval, i) / yval_range * range_1
- min := ph_val + yval_min / yval_range * range_1
- max := ph_val + yval_max / yval_range * range_1
- max
- else
- y1 := pl_val + array.get(yval, i - 1) / yval_range * range_1
- y2 := pl_val + array.get(yval, i) / yval_range * range_1
- min := pl_val + yval_min / yval_range * range_1
- max := pl_val + yval_max / yval_range * range_1
- max
- //Line coloring
- if solid
- col := solid_col
- col
- else
- col := color.from_gradient(y2, min, max, gradient_min, gradient_max)
- col
- l = array.get(lines, i - 1)
- line.set_xy1(l, x1, y1)
- line.set_xy2(l, x2, y2)
- line.set_color(l, col)
- //Plot Swing High/Low for reference
- plot(anchor_mode == 'Swing High' ? ph : pl, 'Swings', anchor_mode == 'Swing High' ? color.new(#ff1100, 0) : color.new(#0cb51a, 0), 1, plot.style_circles, offset=-length)
Advertisement
Add Comment
Please, Sign In to add comment