Adding Bollinger Bands, TEMA Crossover and LRC all together in one script

I am trying to add Bollinger Bands, TEMA Crossover and Linear Regression Channel in one script as a single overlay. I am encountering the following error on Tradingview -

Add to Chart operation failed, reason: line 34: Cannot call 'input.int' with argument 'defval'='close'. An argument of 'series float' type was used but a 'const int' is expected; line 36: Cannot call 'input.int' with argument 'defval'='2'. An argument of 'literal float' type was used but a 'const int' is expected Cannot call 'input.int' with argument 'minval'='0.1'. An argument of 'literal float' type was used but a 'const int' is expected Cannot call 'input.int' with argument 'step'='0.1'. An argument of 'literal float' type was used but a 'const int' is expected

My code is as follows -

//@version=5
indicator(shorttitle="BB", title="Bollinger Bands", overlay=true, timeframe="", timeframe_gaps=true)
length = input.int(20, minval=1)
src_bb = input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
basis = ta.sma(src_bb, length)
dev_bb = mult * ta.stdev(src_bb, length)
upper = basis + dev_bb
lower = basis - dev_bb
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// TEMA
len1 = input.int(10, minval=1, title="Length 1")
len2 = input.int(20, minval=2, title="Length 2")
ema1 = ta.ema(close, len1)
ema11 = ta.ema(ema1, len1)
ema111 = ta.ema(ema11, len1)
tema1 = 3 * (ema1 - ema11) + ema111
ema2 = ta.ema(close, len2)
ema22 = ta.ema(ema2, len2)
ema222 = ta.ema(ema22, len2)
tema2 = 3 * (ema2 - ema22) + ema222
color_tema1 = color.new(color.black, 20)
color_tema2 = color.new(color.maroon, 20)
plot(tema1, color=color_tema1)
plot(tema2, color=color_tema2)


//LRC
src = input.int(defval = close, title = "Source")
len = input.int(defval = 100, title = "Length", minval = 10)
devlen = input.int(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.int(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 = math.sum(src, len) / len
    slope = ta.linreg(src, len, 0) - ta.linreg(src, len, 1)
    intercept  = mid - slope * math.floor(len / 2) + ((1 - (len % 2)) / 2) * slope
    endy = intercept  + slope * (len - 1) 
    dev = 0.0
    for x = 0 to len - 1
        dev := dev + math.pow(src[x] - (slope * (len - x) + intercept), 2)
    dev := math.sqrt(dev/len)
    [intercept, endy, dev, slope]

[y1_, y2_, dev, slope] = 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) != -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, math.round(math.max(math.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, math.round(math.max(math.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[1] ? "⇑" : "⇗" : slope < 0 ? slope < slope[1] ? "⇓" : "⇘" : "⇒"
stl = slope > 0 ? slope > slope[1] ? label.style_label_up : label.style_label_upper_right : slope < 0 ? slope < slope[1] ? 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 = math.sign(slope) != math.sign(slope[1]) and slope > 0
trendisdown = math.sign(slope) != math.sign(slope[1]) and slope < 0
alertcondition(trendisup, title='Up trend', message='Up trend')
alertcondition(trendisdown, title='Down trend', message='Down trend')

I have managed to change few functions as per version 5 of pine script. I believe thorough editing is required, which is frankly beyond my skill set. Please help me to resolve this issue.

Thanks & regards.

Upvotes: 0

Views: 643

Answers (1)

vitruvius
vitruvius

Reputation: 21342

For the source type inputs, you need to use the input.source() function.

You also have an issue here:

devlen = input.int(defval = 2., title = "Deviation", minval = 0.1, step = 0.1)

You are using float numbers but calling input.int() function. You should call the input.float() instead.

//@version=5
indicator(shorttitle="BB", title="Bollinger Bands", overlay=true)
length = input.int(20, minval=1)
src_bb = input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
basis = ta.sma(src_bb, length)
dev_bb = mult * ta.stdev(src_bb, length)
upper = basis + dev_bb
lower = basis - dev_bb
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

// TEMA
len1 = input.int(10, minval=1, title="Length 1")
len2 = input.int(20, minval=2, title="Length 2")
ema1 = ta.ema(close, len1)
ema11 = ta.ema(ema1, len1)
ema111 = ta.ema(ema11, len1)
tema1 = 3 * (ema1 - ema11) + ema111
ema2 = ta.ema(close, len2)
ema22 = ta.ema(ema2, len2)
ema222 = ta.ema(ema22, len2)
tema2 = 3 * (ema2 - ema22) + ema222
color_tema1 = color.new(color.black, 20)
color_tema2 = color.new(color.maroon, 20)
plot(tema1, color=color_tema1)
plot(tema2, color=color_tema2)


//LRC
src = input.source(defval = close, title = "Source")
len = input.int(defval = 100, title = "Length", minval = 10)
devlen = input.float(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.int(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 = math.sum(src, len) / len
    slope = ta.linreg(src, len, 0) - ta.linreg(src, len, 1)
    intercept  = mid - slope * math.floor(len / 2) + ((1 - (len % 2)) / 2) * slope
    endy = intercept  + slope * (len - 1) 
    dev = 0.0
    for x = 0 to len - 1
        dev := dev + math.pow(src[x] - (slope * (len - x) + intercept), 2)
    dev := math.sqrt(dev/len)
    [intercept, endy, dev, slope]

[y1_, y2_, dev, slope] = 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) != -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, math.round(math.max(math.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, math.round(math.max(math.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[1] ? "⇑" : "⇗" : slope < 0 ? slope < slope[1] ? "⇓" : "⇘" : "⇒"
stl = slope > 0 ? slope > slope[1] ? label.style_label_up : label.style_label_upper_right : slope < 0 ? slope < slope[1] ? 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 = math.sign(slope) != math.sign(slope[1]) and slope > 0
trendisdown = math.sign(slope) != math.sign(slope[1]) and slope < 0
alertcondition(trendisup, title='Up trend', message='Up trend')
alertcondition(trendisdown, title='Down trend', message='Down trend')

Upvotes: 0

Related Questions