Advertisement
xmd79

Double Zig Zag with HHLL

Apr 18th, 2021
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.06 KB | None | 0 0
  1. // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
  2. // © LonesomeTheBlue
  3.  
  4. //@version=4
  5. study("Double Zig Zag with HHLL", overlay = true, max_bars_back = 500)
  6. prd1 = input(defval = 8, title="ZigZag Period 1", minval = 2, maxval = 20)
  7. prd2 = input(defval = 20, title="ZigZag Period 2", minval = 2, maxval = 50)
  8. showzz = input(defval = "Show Both", title = "Show Zig Zags", options = ["Show Zig Zag 1", "Show Zig Zag 2", "Show Both", "Show None"])
  9. showhhll = input(defval = "Show Both", title = "Show HHLL", options = ["Show HHLL 1", "Show HHLL 2", "Show Both", "Show None"])
  10. upcol1 = input(defval = color.lime, title = "Zig Zag 1 Up Color")
  11. dncol1 = input(defval = color.red, title = "Zig Zag 1 Down Color")
  12. upcol2 = input(defval = color.blue, title = "Zig Zag 2 Up Color")
  13. dncol2 = input(defval = color.purple, title = "Zig Zag 2 Down Color")
  14. txtcol = input(defval = color.black, title = "Text Color")
  15. zz1style = input(defval = "Dashed", title = "Zig Zag 1 Line Style", options = ["Dashed", "Dotted"])
  16. zz1width = input(defval = 2, title = "Zig zag 1 Line Width", minval = 1, maxval = 4)
  17. zz2width = input(defval = 3, title = "Zig zag 2 Line Width", minval = 1, maxval = 6)
  18.  
  19. float ph1 = highestbars(high, prd1) == 0 ? high : na
  20. float pl1 = lowestbars(low, prd1) == 0 ? low : na
  21. float ph2 = highestbars(high, prd2) == 0 ? high : na
  22. float pl2 = lowestbars(low, prd2) == 0 ? low : na
  23.  
  24. var dir1 = 0
  25. var dir2 = 0
  26. dir1 := iff(ph1 and na(pl1), 1, iff(pl1 and na(ph1), -1, dir1))
  27. dir2 := iff(ph2 and na(pl2), 1, iff(pl2 and na(ph2), -1, dir2))
  28.  
  29. var max_array_size = 10 // [5, 2] matrix
  30. var zigzag1 = array.new_float(0)
  31. var zigzag2 = array.new_float(0)
  32.  
  33. add_to_zigzag(pointer, value, bindex)=>
  34. array.unshift(pointer, bindex)
  35. array.unshift(pointer, value)
  36. if array.size(pointer) > max_array_size
  37. array.pop(pointer)
  38. array.pop(pointer)
  39.  
  40. update_zigzag(pointer, value, bindex, dir)=>
  41. if array.size(pointer) == 0
  42. add_to_zigzag(pointer, value, bindex)
  43. else
  44. if (dir == 1 and value > array.get(pointer, 0)) or (dir == -1 and value < array.get(pointer, 0))
  45. array.set(pointer, 0, value)
  46. array.set(pointer, 1, bindex)
  47. 0.
  48.  
  49. dir1changed = change(dir1)
  50. if ph1 or pl1
  51. if dir1changed
  52. add_to_zigzag(zigzag1, dir1 == 1 ? ph1 : pl1, bar_index)
  53. else
  54. update_zigzag(zigzag1, dir1 == 1 ? ph1 : pl1, bar_index, dir1)
  55.  
  56. dir2changed = change(dir2)
  57. if ph2 or pl2
  58. if dir2changed
  59. add_to_zigzag(zigzag2, dir2 == 1 ? ph2 : pl2, bar_index)
  60. else
  61. update_zigzag(zigzag2, dir2 == 1 ? ph2 : pl2, bar_index, dir2)
  62.  
  63. if array.size(zigzag1) >= 6
  64. var line zzline1 = na
  65. var label zzlabel1 = na
  66. float val = array.get(zigzag1, 0)
  67. int point = round(array.get(zigzag1, 1))
  68. if change(val) or change(point)
  69. float val1 = array.get(zigzag1, 2)
  70. int point1 = round(array.get(zigzag1, 3))
  71. if change(val1) == 0 and change(point1) == 0
  72. line.delete(zzline1)
  73. label.delete(zzlabel1)
  74. if showzz == "Show Zig Zag 1" or showzz == "Show Both"
  75. zzline1 := line.new(x1 = point, y1 = val, x2 = point1, y2 = val1, color = dir1 == 1 ? upcol1 : dncol1, width = zz1width, style = zz1style == "Dashed" ? line.style_dashed : line.style_dotted)
  76. if showhhll == "Show HHLL 1" or showhhll == "Show Both"
  77. hhlltxt = dir1 == 1 ? array.get(zigzag1, 0) > array.get(zigzag1, 4) ? "HH" : "LH" : array.get(zigzag1, 0) < array.get(zigzag1, 4) ? "LL" : "HL"
  78. labelcol = dir1 == 1 ? array.get(zigzag1, 0) > array.get(zigzag1, 4) ? upcol1 : dncol1 : array.get(zigzag1, 0) < array.get(zigzag1, 4) ? dncol1 : upcol1
  79. zzlabel1 := label.new(x = point, y = val, text = hhlltxt, color = labelcol, textcolor = txtcol, style = dir1 == 1 ? label.style_label_down : label.style_label_up)
  80.  
  81. if array.size(zigzag2) >= 6
  82. var line zzline2 = na
  83. var label zzlabel2 = na
  84. float val = array.get(zigzag2, 0)
  85. int point = round(array.get(zigzag2, 1))
  86. if change(val) or change(point)
  87. float val1 = array.get(zigzag2, 2)
  88. int point1 = round(array.get(zigzag2, 3))
  89. if change(val1) == 0 and change(point1) == 0
  90. line.delete(zzline2)
  91. label.delete(zzlabel2)
  92. if showzz == "Show Zig Zag 2" or showzz == "Show Both"
  93. zzline2 := line.new(x1 = point, y1 = val, x2 = point1, y2 = val1, color = dir2 == 1 ? upcol2 : dncol2, width = zz2width)
  94. if showhhll == "Show HHLL 2" or showhhll == "Show Both"
  95. hhlltxt = dir2 == 1 ? array.get(zigzag2, 0) > array.get(zigzag2, 4) ? "HH" : "LH" : array.get(zigzag2, 0) < array.get(zigzag2, 4) ? "LL" : "HL"
  96. labelcol = dir2 == 1 ? array.get(zigzag2, 0) > array.get(zigzag2, 4) ? upcol2 : dncol2 : array.get(zigzag2, 0) < array.get(zigzag2, 4) ? dncol2 : upcol2
  97. zzlabel2 := label.new(x = point, y = val, text = hhlltxt, color = labelcol, textcolor = txtcol, style = dir2 == 1 ? label.style_label_down : label.style_label_up)
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement