Bollinger Bands、TEMA交叉、LRC整合TradingView Pine脚本报错求助
Pine Script v5指标报错修复方案
错误原因
报错完全由Linear Regression Channel部分的输入参数类型定义错误导致,不符合Pine Script v5的类型校验规则:
src是价格数据源,属于浮点序列类型,不能用input.int(仅支持整数常量)定义devlen需要支持0.1级别的小数取值,属于浮点类型,不能用input.int定义,同时参数的默认值、minval、step都为小数,和整数输入类型冲突
修复代码
仅需替换LRC模块开头的3行错误输入定义即可,其余代码无需修改:
// 原错误代码 // src = input.int(defval = close, title = "Source") // devlen = input.int(defval = 2., title = "Deviation", minval = 0.1, step = 0.1) // 修复后代码 src = input.source(defval = close, title = "LRC Source") devlen = input.float(defval = 2.0, title = "Deviation", minval = 0.1, step = 0.1)
完整可用脚本
//@version=5 indicator(shorttitle="BB_TEMA_LRC", title="Bollinger Bands + TEMA + Linear Regression Channel", overlay=true, timeframe="", timeframe_gaps=true) length = input.int(20, minval=1) src_bb = input(close, title="BB 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="TEMA Length 1") len2 = input.int(20, minval=2, title="TEMA 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, title="TEMA1") plot(tema2, color=color_tema2, title="TEMA2") //LRC src = input.source(defval = close, title = "LRC Source") len = input.int(defval = 100, title = "LRC Length", minval = 10) devlen = input.float(defval = 2.0, 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')
内容的提问来源于stack exchange,提问作者Krishnendu Bhattacharyya
相关产品推荐
相关产品推荐

