xmd79

TF Segmented Polynomial Regression [LUX]

Aug 7th, 2022
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 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("TF Segmented Polynomial Regression [LUX]"
  6. , "Segmented PolyReg [LUX]"
  7. , overlay = true)
  8. //-----------------------------------------------------------------------------}
  9. //Settings
  10. //-----------------------------------------------------------------------------{
  11. degree = input.int(3, "Polynomial Degree"
  12. , minval = 0
  13. , maxval = 10)
  14.  
  15. mult = input.float(2., "Width"
  16. , minval = 0)
  17.  
  18. tf = input.timeframe("1D", "Timeframe")
  19.  
  20. show = input(false, "Show fit for new bars")
  21.  
  22. src = input(close)
  23.  
  24. //-----------------------------------------------------------------------------}
  25. //Define variables
  26. //-----------------------------------------------------------------------------{
  27. var coefficients = matrix.new<float>(degree + 1, 1)
  28. var b = matrix.new<float>(0, 0)
  29.  
  30. var float out = na
  31. var sse = 0.
  32. var k = 0.
  33.  
  34. n = bar_index
  35. dt = timeframe.change(tf)
  36.  
  37. //-----------------------------------------------------------------------------}
  38. //Request future prices
  39. //-----------------------------------------------------------------------------{
  40. y = request.security(syminfo.tickerid
  41. , tf
  42. , request.security_lower_tf(syminfo.tickerid, timeframe.period, src)
  43. , lookahead = barmerge.lookahead_on)
  44.  
  45. K = array.size(y)
  46.  
  47. //-----------------------------------------------------------------------------}
  48. //Compute polynomial regression point and intervals
  49. //-----------------------------------------------------------------------------{
  50.  
  51. //Solve system
  52. if dt and K > 1
  53. design = matrix.new<float>(0, 0)
  54. response = matrix.new<float>(0, 0)
  55.  
  56. for i = 0 to degree
  57. column = array.new_float(0)
  58.  
  59. for j = 0 to K - 1
  60. array.push(column, math.pow(j,i))
  61.  
  62. matrix.add_col(design, i, column)
  63.  
  64. a = matrix.inv(matrix.mult(matrix.transpose(design), design))
  65. b := matrix.mult(a, matrix.transpose(design))
  66.  
  67. matrix.add_col(response, 0, y)
  68.  
  69. coefficients := matrix.mult(b, response)
  70.  
  71. sse := 0
  72. for i = 0 to K - 1
  73. y_ = 0.
  74. for j = 0 to degree
  75. y_ += math.pow(i, j)*matrix.get(coefficients, j, 0)
  76.  
  77. sse += math.pow(array.get(y, i) - y_, 2)
  78.  
  79. sse := math.sqrt(sse / (K - 1)) * mult
  80.  
  81. k := 0
  82.  
  83. //Compute best fit and upper/lower intervals
  84. reg = 0.
  85. for i = 0 to degree
  86. reg += math.pow(k, i)*matrix.get(coefficients, i, 0)
  87.  
  88. if barstate.isrealtime
  89. if show
  90. out := reg
  91. else
  92. out := reg
  93.  
  94. upper = out + sse
  95. lower = out - sse
  96.  
  97. k += 1
  98.  
  99. //-----------------------------------------------------------------------------}
  100. //Plot
  101. //-----------------------------------------------------------------------------{
  102. css = dt ? na : out > out[1] ? #0cb51a : #ff1100
  103.  
  104. plot_0 = plot(upper, "Upper"
  105. , color = color.new(#2157f3, 100))
  106.  
  107. plot(out, "PolyReg"
  108. , color = css)
  109.  
  110. plot_1 = plot(lower, "Lower"
  111. , color = color.new(#ff1100, 100))
  112.  
  113. fill(plot_0, plot_1
  114. , dt ? na : color.new(#2157f3, 80)
  115. , "Interval Fill")
  116.  
  117. //-----------------------------------------------------------------------------}
Advertisement
Add Comment
Please, Sign In to add comment