xmd79

Sid's Trend Channel

Oct 5th, 2021
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. //@version=4
  2. study("Sid's Trend Channel", shorttitle="Sid's Trend Channel", overlay=true)
  3.  
  4. upperMult = input(title="Superior Adjust", defval=2)
  5. lowerMult = input(title="Inferior Adjust", defval=-2)
  6.  
  7. useUpperDev = input(title="Use Superior Adjust", defval=false)
  8. useLowerDev = input(title="Use Inferior Adjust", defval=true)
  9. showPearson = input(title="Show TM Pearson's R", defval=true)
  10. extendLines = input(title="Extend lines", defval=false)
  11.  
  12. len = input(title="Count", defval=50)
  13. src = input(title="Source", defval=close)
  14.  
  15. extend = extendLines ? extend.right : extend.none
  16.  
  17. calcSlope(src, len) =>
  18. if not barstate.islast or len <= 1
  19. [float(na), float(na), float(na)]
  20. else
  21. sumX = 0.0
  22. sumY = 0.0
  23. sumXSqr = 0.0
  24. sumXY = 0.0
  25. for i = 0 to len - 1
  26. val = src[i]
  27. per = i + 1.0
  28. sumX := sumX + per
  29. sumY := sumY + val
  30. sumXSqr := sumXSqr + per * per
  31. sumXY := sumXY + val * per
  32. slope = (len * sumXY - sumX * sumY) / (len * sumXSqr - sumX * sumX)
  33. average = sumY / len
  34. intercept = average - slope * sumX / len + slope
  35. [slope, average, intercept]
  36.  
  37. [s, a, i] = calcSlope(src, len)
  38.  
  39. startPrice = i + s * (len - 1)
  40. endPrice = i
  41. var line baseLine = na
  42.  
  43. if na(baseLine) and not na(startPrice)
  44. baseLine := line.new(bar_index - len + 1, startPrice, bar_index, endPrice, width=2, extend=extend, color=color.yellow)
  45. else
  46. line.set_xy1(baseLine, bar_index - len + 1, startPrice)
  47. line.set_xy2(baseLine, bar_index, endPrice)
  48. na
  49.  
  50. calcDev(src, len, slope, average, intercept) =>
  51. upDev = 0.0
  52. dnDev = 0.0
  53. stdDevAcc = 0.0
  54. dsxx = 0.0
  55. dsyy = 0.0
  56. dsxy = 0.0
  57.  
  58. periods = len - 1
  59.  
  60. daY = intercept + (slope * periods) / 2
  61. val = intercept
  62.  
  63. for i = 0 to periods
  64. price = high[i] - val
  65. if (price > upDev)
  66. upDev := price
  67.  
  68. price := val - low[i]
  69. if (price > dnDev)
  70. dnDev := price
  71.  
  72. price := src[i]
  73. dxt = price - average
  74. dyt = val - daY
  75.  
  76. price := price - val
  77. stdDevAcc := stdDevAcc + price * price
  78. dsxx := dsxx + dxt * dxt
  79. dsyy := dsyy + dyt * dyt
  80. dsxy := dsxy + dxt * dyt
  81. val := val + slope
  82.  
  83. stdDev = sqrt(stdDevAcc / (periods == 0 ? 1 : periods))
  84. pearsonR = dsxx == 0 or dsyy == 0 ? 0 : dsxy / sqrt(dsxx * dsyy)
  85. [stdDev, pearsonR, upDev, dnDev]
  86.  
  87. [stdDev, pearsonR, upDev, dnDev] = calcDev(src, len, s, a, i)
  88.  
  89. upperStartPrice = startPrice + (useUpperDev ? upperMult * stdDev : upDev)
  90. upperEndPrice = endPrice + (useUpperDev ? upperMult * stdDev : upDev)
  91. var line upper = na
  92.  
  93. lowerStartPrice = startPrice + (useLowerDev ? lowerMult * stdDev : -dnDev)
  94. lowerEndPrice = endPrice + (useLowerDev ? lowerMult * stdDev : -dnDev)
  95. var line lower = na
  96.  
  97. if na(upper) and not na(upperStartPrice)
  98. upper := line.new(bar_index - len + 1, upperStartPrice, bar_index, upperEndPrice, width=2, extend=extend, color=#FFFF00)
  99. else
  100. line.set_xy1(upper, bar_index - len + 1, upperStartPrice)
  101. line.set_xy2(upper, bar_index, upperEndPrice)
  102. na
  103.  
  104. if na(lower) and not na(lowerStartPrice)
  105. lower := line.new(bar_index - len + 1, lowerStartPrice, bar_index, lowerEndPrice, width=2, extend=extend, color=#FFFF00)
  106. else
  107. line.set_xy1(lower, bar_index - len + 1, lowerStartPrice)
  108. line.set_xy2(lower, bar_index, lowerEndPrice)
  109. na
  110.  
  111.  
Advertisement
Add Comment
Please, Sign In to add comment