BITSTAMP:ETHUSD   Ethereum
// This source code is subject to the terms of the Mozilla Public License 2.0 at mozilla.org/MPL/2.0/
// © LonesomeTheBlue

//@version=4
study("Linear Regression Channel", overlay = true, max_bars_back = 1000, max_lines_count = 300)
src = input(defval = close, title = "Source")
len = input(defval = 100, title = "Length", minval = 10)
devlen = input(defval = 2., title = "Deviation", minval = 0.1, step = 0.1)
extendit = input(defval = true, title = "Extend Lines")
showfibo = input(defval = false, title = "Show Fibonacci Levels")
showbroken = input(defval = true, title = "Show Broken Channel", inline = "brk")
brokencol = input(defval = color.blue, title = "", inline = "brk")
upcol = input(defval = color.lime, title = "Up/Down Trend Colors", inline = "trcols")
dncol = input(defval = color.red, title = "", inline = "trcols")
widt = input(defval = 2, title = "Line Width")

var fibo_ratios = array.new_float(0)
var colors = array.new_color(2)
if barstate.isfirst
array.unshift(colors, upcol)
array.unshift(colors, dncol)
array.push(fibo_ratios, 0.236)
array.push(fibo_ratios, 0.382)
array.push(fibo_ratios, 0.618)
array.push(fibo_ratios, 0.786)


get_channel(src, len)=>
mid = sum(src, len) / len
slope = linreg(src, len, 0) - linreg(src, len, 1)
intercept = mid - slope * floor(len / 2) + ((1 - (len % 2)) / 2) * slope
endy = intercept + slope * (len - 1)
dev = 0.0
for x = 0 to len - 1
dev := dev + pow(src - (slope * (len - x) + intercept), 2)
dev := sqrt(dev/len)


= get_channel(src, len)

outofchannel = (slope > 0 and close < y2_ - dev * devlen) ? 0 : (slope < 0 and close > y2_ + dev * devlen) ? 2 : -1

var reglines = array.new_line(3)
var fibolines = array.new_line(4)
for x = 0 to 2
if not showbroken or outofchannel != x or nz(outofchannel, -1) != -1
line.delete(array.get(reglines, x))
else
line.set_color(array.get(reglines, x), color = brokencol)
line.set_width(array.get(reglines, x), width = 2)
line.set_style(array.get(reglines, x), style = line.style_dotted)
line.set_extend(array.get(reglines, x), extend = extend.none)

array.set(reglines, x,
line.new(x1 = bar_index - (len - 1),
y1 = y1_ + dev * devlen * (x - 1),
x2 = bar_index,
y2 = y2_ + dev * devlen * (x - 1),
color = array.get(colors, round(max(sign(slope), 0))),
style = x % 2 == 1 ? line.style_solid : line.style_dashed,
width = widt,
extend = extendit ? extend.right : extend.none))
if showfibo
for x = 0 to 3
line.delete(array.get(fibolines, x))
array.set(fibolines, x,
line.new(x1 = bar_index - (len - 1),
y1 = y1_ - dev * devlen + dev * devlen * 2 * array.get(fibo_ratios, x),
x2 = bar_index,
y2 = y2_ - dev * devlen + dev * devlen * 2 * array.get(fibo_ratios, x),
color = array.get(colors, round(max(sign(slope), 0))),
style = line.style_dotted,
width = widt,
extend = extendit ? extend.right : extend.none))

var label sidelab = label.new(x = bar_index - (len - 1), y = y1_, text = "S", size = size.large)
txt = slope > 0 ? slope > slope ? "⇑" : "⇗" : slope < 0 ? slope < slope ? "⇓" : "⇘" : "⇒"
stl = slope > 0 ? slope > slope ? label.style_label_up : label.style_label_upper_right : slope < 0 ? slope < slope ? label.style_label_down : label.style_label_lower_right : label.style_label_right
label.set_style(sidelab, stl)
label.set_text(sidelab, txt)
label.set_x(sidelab, bar_index - (len - 1))
label.set_y(sidelab, slope > 0 ? y1_ - dev * devlen : slope < 0 ? y1_ + dev * devlen : y1_)
label.set_color(sidelab, slope > 0 ? upcol : slope < 0 ? dncol : color.blue)

alertcondition(outofchannel, title='Channel Broken', message='Channel Broken')

// direction
trendisup = sign(slope) != sign(slope) and slope > 0
trendisdown = sign(slope) != sign(slope) and slope < 0
alertcondition(trendisup, title='Up trend', message='Up trend')
alertcondition(trendisdown, title='Down trend', message='Down trend')

Disclaimer

The information and publications are not meant to be, and do not constitute, financial, investment, trading, or other types of advice or recommendations supplied or endorsed by TradingView. Read more in the Terms of Use.