Advertisement
xmd79

Standard Deviation Channel

Aug 24th, 2023
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.96 KB | None | 0 0
  1. //@version=5
  2.  
  3. indicator("Standard Deviation Channel", overlay=true)
  4.  
  5. length = input.int(128, title="Length", minval = 1, maxval = 5000)
  6.  
  7. src = input.source(close, title="Source")
  8.  
  9. // ----------------------------------------------------------------------
  10. upper_1_bool_input = input.bool(true, title="Upper +1", inline="abc", group = "channel")
  11. upper_1_float_input = input.float(1.0, title="", inline="abc", group = "channel")
  12.  
  13. upper_2_bool_input = input.bool(true, title="Upper +2", inline="cde", group = "channel")
  14. upper_2_float_input = input.float(2.0, title="", inline="cde", group = "channel")
  15.  
  16. upper_3_bool_input = input.bool(true, title="Upper +3", inline="ghi", group = "channel")
  17. upper_3_float_input = input.float(3.0, title="", inline="ghi", group = "channel")
  18.  
  19. lower_1_bool_input = input.bool(true, title="Lower -1", inline="bcd", group = "channel")
  20. lower_1_float_input = input.float(1.0, title="", inline="bcd", group = "channel")
  21.  
  22. lower_2_bool_input = input.bool(true, title="Lower -2", inline="def", group = "channel")
  23. lower_2_float_input = input.float(2.0, title="", inline="def", group = "channel")
  24.  
  25. lower_3_bool_input = input.bool(true, title="Lower +3", inline="hij", group = "channel")
  26. lower_3_float_input = input.float(3.0, title="", inline="hij", group = "channel")
  27. // ----------------------------------------------------------------------
  28. color_upper_1 = input.color(color.new(color.blue, 95), "", inline = "colors", group = "colors")
  29. color_upper_2 = input.color(color.new(color.green, 95), "", inline = "colors", group = "colors")
  30. color_upper_3 = input.color(color.new(color.red, 95), "", inline = "colors", group = "colors")
  31.  
  32. color_lower_1 = input.color(color.new(color.blue, 95), "", inline = "colors", group = "colors")
  33. color_lower_2 = input.color(color.new(color.green, 95), "", inline = "colors", group = "colors")
  34. color_lower_3 = input.color(color.new(color.red, 95), "", inline = "colors", group = "colors")
  35. // ----------------------------------------------------------------------
  36. visual_settings_group = "Visual Settings"
  37.  
  38. prinp = input.bool(false, "Show Pearson's R", group = visual_settings_group)
  39. exl = input.bool(false, "Extend Lines Left", group = visual_settings_group)
  40. exr = input.bool(true, "Extend Lines Right", group = visual_settings_group)
  41.  
  42. exs = switch
  43. exl and exr => extend.both
  44. exl => extend.left
  45. exr => extend.right
  46. => extend.none
  47. // ----------------------------------------------------------------------
  48. slpclc(source, length) =>
  49.  
  50. max_bars_back(source, 5000)
  51.  
  52. if not barstate.islast or length <= 1
  53. [float(na), float(na), float(na)]
  54.  
  55. else
  56. sumX = 0.0
  57. sumY = 0.0
  58. sumXSqr = 0.0
  59. sumXY = 0.0
  60.  
  61. for i = 0 to length - 1 by 1
  62. val = source[i]
  63. per = i + 1.0
  64. sumX += per
  65. sumY += val
  66. sumXSqr += per * per
  67. sumXY += val * per
  68.  
  69. slope = (length * sumXY - sumX * sumY) / (length * sumXSqr - sumX * sumX)
  70.  
  71. average = sumY / length
  72.  
  73. intercept = average - slope * sumX / length + slope
  74.  
  75. [slope, average, intercept]
  76. // ----------------------------------------------------------------------
  77. [s, a, i] = slpclc(src, length)
  78.  
  79. st_price = i + s * (length - 1)
  80. end_price = i
  81.  
  82. base_line = line.new(bar_index - length + 1, st_price, bar_index, end_price, width=1, extend=exs, style=line.style_dashed, color=color.new(color.orange, 0))
  83. // ----------------------------------------------------------------------
  84. devcalc(source, length, slope, average, intercept) =>
  85. upDev = 0.0
  86. dnDev = 0.0
  87. stdDevAcc = 0.0
  88. dsxx = 0.0
  89. dsyy = 0.0
  90. dsxy = 0.0
  91. periods = length - 1
  92. daY = intercept + slope * periods / 2
  93. val = intercept
  94. for j = 0 to periods by 1
  95. price = high[j] - val
  96. if price > upDev
  97. upDev := price
  98. price := val - low[j]
  99. if price > dnDev
  100. dnDev := price
  101. price := source[j]
  102. dxt = price - average
  103. dyt = val - daY
  104. price -= val
  105. stdDevAcc += price * price
  106. dsxx += dxt * dxt
  107. dsyy += dyt * dyt
  108. dsxy += dxt * dyt
  109. val += slope
  110. stdDev = math.sqrt(stdDevAcc / (periods == 0 ? 1 : periods))
  111. pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / math.sqrt(dsxx * dsyy)
  112. [stdDev, pearsonR, upDev, dnDev]
  113. // ----------------------------------------------------------------------
  114. [stdDev, pearsonR, upDev, dnDev] = devcalc(src, length, s, a, i)
  115. // ----------------------------------------------------------------------
  116. create_line(bool_input, float_input, color, dev) =>
  117. line_start_price = st_price + (bool_input ? float_input * stdDev : dev)
  118. line_end_price = end_price + (bool_input ? float_input * stdDev : dev)
  119.  
  120. line.new(bar_index - length + 1, line_start_price, bar_index, line_end_price, width=1, style=line.style_dashed, extend=exs, color=color.new(color, 0))
  121. // ----------------------------------------------------------------------
  122. upper_1_line = create_line(upper_1_bool_input, upper_1_float_input, color_upper_1, upDev)
  123. upper_2_line = create_line(upper_2_bool_input, upper_2_float_input, color_upper_2, upDev)
  124. upper_3_line = create_line(upper_3_bool_input, upper_3_float_input, color_upper_3, upDev)
  125.  
  126. lower_1_line = create_line(lower_1_bool_input, -lower_1_float_input, color_lower_1, -dnDev)
  127. lower_2_line = create_line(lower_2_bool_input, -lower_2_float_input, color_lower_2, -dnDev)
  128. lower_3_line = create_line(lower_3_bool_input, -lower_3_float_input, color_upper_3, -dnDev)
  129. // ----------------------------------------------------------------------
  130. linefill.new(upper_1_line, base_line, color = color_upper_1)
  131. linefill.new(lower_1_line, base_line, color = color_lower_1)
  132. // ----------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement