xmd79

Visible Range Mean Deviation Histogram [LUX]

Sep 13th, 2022
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.05 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. // © LuxAlgo
  3.  
  4. //@version=5
  5. indicator("Visible Range Mean Deviation Histogram [LUX]", "VRMDH [LUX]"
  6. , overlay = true
  7. , max_boxes_count = 500)
  8. //------------------------------------------------------------------------------
  9. //Settings
  10. //-----------------------------------------------------------------------------{
  11. rows = input.int(10, "Bins Per Side"
  12. , minval = 1)
  13.  
  14. mult = input.float(2, "Deviation Multiplier"
  15. , minval = 0)
  16.  
  17. //Style
  18. rel = input(true, "Relative"
  19. , inline = 'inline0'
  20. , group = 'Style')
  21.  
  22. width = input.float(30
  23. , minval = 0
  24. , maxval = 100
  25. , inline = 'inline0'
  26. , group = 'Style')
  27.  
  28. up_css = input.color(#0cb51a, "Bin Colors"
  29. , inline = 'inline1'
  30. , group = 'Style')
  31.  
  32. dn_css = input.color(#ff1100, ""
  33. , inline = 'inline1'
  34. , group = 'Style')
  35.  
  36. poc = input(true, "Show POCs"
  37. , group = 'Style')
  38.  
  39. //-----------------------------------------------------------------------------}
  40. //Calculations
  41. //-----------------------------------------------------------------------------{
  42. var csum1 = 0.
  43. var csum2 = 0.
  44. var idx = 0
  45.  
  46. n = bar_index
  47.  
  48. left = chart.left_visible_bar_time
  49. right = chart.right_visible_bar_time
  50.  
  51. if time >= left and time <= right
  52. csum1 += close
  53. csum2 += close * close
  54.  
  55. idx += 1
  56.  
  57. //Display Histogram
  58. if time == right
  59. //Calculate mean/standard deviation
  60. mean1 = csum1 / idx
  61. mean2 = csum2 / idx
  62.  
  63. dev = math.sqrt(mean2 - mean1 * mean1) * mult / rows
  64.  
  65. //Highlight upper/lower extremities
  66. line.new(left, mean1 + dev*rows, right, mean1 + dev*rows
  67. , color = up_css
  68. , style = line.style_dashed
  69. , xloc = xloc.bar_time)
  70.  
  71. line.new(left, mean1 - dev*rows, right, mean1 - dev*rows
  72. , color = dn_css
  73. , style = line.style_dashed
  74. , xloc = xloc.bar_time)
  75.  
  76. //Count prices values within bins
  77. upper_bins_count = array.new_int(0)
  78. lower_bins_count = array.new_int(0)
  79.  
  80. upper_levels = array.new_float(0)
  81. lower_levels = array.new_float(0)
  82.  
  83. sum_dev = dev
  84. upper_prev = mean1
  85. lower_prev = mean1
  86.  
  87. for i = 0 to rows-1
  88. sum_up = 0
  89. sum_dn = 0
  90.  
  91. upper = mean1 + sum_dev
  92. lower = mean1 - sum_dev
  93.  
  94. array.push(upper_levels, upper)
  95. array.push(lower_levels, lower)
  96.  
  97. for j = 0 to idx-1
  98. sum_up := high[j] >= upper_prev and low[j] < upper ? sum_up + 1
  99. : sum_up
  100.  
  101. sum_dn := low[j] <= lower_prev and high[j] > lower ? sum_dn + 1
  102. : sum_dn
  103.  
  104. array.push(upper_bins_count, sum_up)
  105. array.push(lower_bins_count, sum_dn)
  106.  
  107. sum_dev += dev
  108. upper_prev += dev
  109. lower_prev -= dev
  110.  
  111. //Display bins
  112. incr_mult = 0.
  113. upper_prev := mean1
  114. lower_prev := mean1
  115.  
  116. max_up = array.max(upper_bins_count)
  117. max_dn = array.max(lower_bins_count)
  118. max = math.max(max_up, max_dn)
  119.  
  120. for i = 0 to rows-1
  121. upper_right = 0
  122. lower_right = 0
  123.  
  124. get_up_bin = array.get(upper_bins_count, i)
  125. get_dn_bin = array.get(lower_bins_count, i)
  126.  
  127. upper = array.get(upper_levels, i)
  128. lower = array.get(lower_levels, i)
  129.  
  130. incr_mult += mult / rows
  131.  
  132. if rel
  133. upper_right := math.round(get_up_bin / max * width / 100 * (idx - 1))
  134. lower_right := math.round(get_dn_bin / max * width / 100 * (idx - 1))
  135. else
  136. upper_right := get_up_bin
  137. lower_right := get_dn_bin
  138.  
  139. //Upper side bins
  140. box.new(n - idx + 1, upper, n - idx + 1 + upper_right, upper_prev
  141. , border_color = up_css
  142. , bgcolor = color.new(up_css, 90)
  143. , text = '+' + str.tostring(incr_mult, '#.##')
  144. , text_color = up_css
  145. , text_halign = text.align_left)
  146.  
  147. if get_up_bin == max_up and poc
  148. avg = math.avg(upper, upper_prev)
  149.  
  150. line.new(n - idx + 1 + upper_right, avg, n, avg
  151. , color = up_css
  152. , style = line.style_dotted)
  153.  
  154. //Lower side bins
  155. box.new(n - idx + 1, lower_prev, n - idx + 1 + lower_right, lower
  156. , border_color = dn_css
  157. , bgcolor = color.new(dn_css, 90)
  158. , text = '-' + str.tostring(incr_mult, '#.##')
  159. , text_color = dn_css
  160. , text_halign = text.align_left)
  161.  
  162. if get_dn_bin == max_dn and poc
  163. avg = math.avg(lower, lower_prev)
  164.  
  165. line.new(n - idx + 1 + lower_right, avg, n, avg
  166. , color = dn_css
  167. , style = line.style_dotted)
  168.  
  169. upper_prev := upper
  170. lower_prev := lower
  171.  
  172. //-----------------------------------------------------------------------------}
Advertisement
Add Comment
Please, Sign In to add comment