xmd79

Swing High/Low Anchored Spiral

Mar 10th, 2023
331
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.92 KB | None | 0 0
  1. // 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/
  2. // © alexgrover
  3.  
  4. //@version=5
  5. indicator('Swing High/Low Anchored Spiral', overlay=true, max_bars_back=1000, max_lines_count=500)
  6. //Swing High/Low Settings
  7. length = input.int(14, minval=2, maxval=499, group='Swing')
  8.  
  9. ref = input.int(0, 'Occurence', minval=0, group='Swing')
  10.  
  11. anchor_mode = input.string('Swing High', 'Anchor Point', options=['Swing High', 'Swing Low'], group='Swing')
  12.  
  13. //Spiral Settings
  14. turns = input.int(2, 'Spiral Turns', minval=1, group='Spiral')
  15.  
  16. fliph = input.bool(false, 'Flip Horizontally', group='Spiral')
  17.  
  18. flipv = input.bool(false, 'Flip Vertically', group='Spiral')
  19.  
  20.  
  21. //Style Settings
  22. solid = input.bool(false, 'Use Solid Color', inline='inlinesolid', group='Style')
  23.  
  24. solid_col = input.color(#2157f3, '', inline='inlinesolid', group='Style')
  25.  
  26. gradient_min = input.color(#ff1100, 'Gradient Colors', inline='inlinegradient', group='Style')
  27.  
  28. gradient_max = input.color(#0cb51a, '', inline='inlinegradient', group='Style')
  29.  
  30. //------------------------------------------------------------------------------
  31. n = bar_index
  32. var pi = math.pi
  33. var anchor = 0
  34. var color col = na
  35. var lines = array.new_line(0)
  36. yval = array.new_float(0)
  37. xval = array.new_int(0)
  38. prices = array.new_float(0)
  39.  
  40. //Flipping Constants
  41. flip_h = fliph ? -1 : 1
  42. flip_v = flipv ? -1 : 1
  43.  
  44. //Get Swing High/Low
  45. ph = ta.pivothigh(length, length)
  46. pl = ta.pivotlow(length, length)
  47. ph_val = ta.valuewhen(ph, high[length], ref)
  48. pl_val = ta.valuewhen(pl, low[length], ref)
  49.  
  50. //Get anchor corrdinate
  51. if anchor_mode == 'Swing High'
  52. anchor := ta.valuewhen(ph, n - length, ref)
  53. anchor
  54. else
  55. anchor := ta.valuewhen(pl, n - length, ref)
  56. anchor
  57. len = n - anchor
  58.  
  59. //Append lines
  60. if barstate.isfirst
  61. for i = 0 to 499 by 1
  62. array.push(lines, line.new(na, na, na, na))
  63. //------------------------------------------------------------------------------
  64. y1 = 0.
  65. y2 = 0.
  66. max = 0.
  67. min = 0.
  68. if barstate.islast
  69. //Append spiral coordinates to arays
  70. for i = 0 to len - 1 by 1
  71. t = i / (len - 1) * turns * pi
  72. x = t * math.cos(t) * flip_h / pi / turns * len + anchor
  73. y = t * math.sin(t) * flip_v / pi
  74.  
  75. array.push(yval, y)
  76. array.push(xval, int(x))
  77.  
  78. for i = 0 to array.max(xval) - array.min(xval) - 1 by 1
  79. array.push(prices, close[i])
  80.  
  81. //Rescale coordinates and set line corrdinates
  82. for i = 1 to len - 1 by 1
  83. yval_max = array.max(yval)
  84. yval_min = array.min(yval)
  85. yval_range = yval_max - yval_min
  86. range_1 = array.max(prices) - array.min(prices)
  87.  
  88. x1 = array.get(xval, i - 1)
  89. x2 = array.get(xval, i)
  90.  
  91. if anchor_mode == 'Swing High'
  92. y1 := ph_val + array.get(yval, i - 1) / yval_range * range_1
  93. y2 := ph_val + array.get(yval, i) / yval_range * range_1
  94. min := ph_val + yval_min / yval_range * range_1
  95. max := ph_val + yval_max / yval_range * range_1
  96. max
  97. else
  98. y1 := pl_val + array.get(yval, i - 1) / yval_range * range_1
  99. y2 := pl_val + array.get(yval, i) / yval_range * range_1
  100. min := pl_val + yval_min / yval_range * range_1
  101. max := pl_val + yval_max / yval_range * range_1
  102. max
  103.  
  104. //Line coloring
  105. if solid
  106. col := solid_col
  107. col
  108. else
  109. col := color.from_gradient(y2, min, max, gradient_min, gradient_max)
  110. col
  111.  
  112. l = array.get(lines, i - 1)
  113. line.set_xy1(l, x1, y1)
  114. line.set_xy2(l, x2, y2)
  115. line.set_color(l, col)
  116.  
  117. //Plot Swing High/Low for reference
  118. 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)
  119.  
  120.  
Advertisement
Add Comment
Please, Sign In to add comment