TradingView Pine Script v5 HAMI Pivot H/L指标Sma报错修复求助
问题根因
Pine Script v5 要求所有自定义计算函数必须在每根K线计算时被稳定调用,不能放在条件分支/三元运算符的分支里出现「部分K线调用、部分K线不调用」的情况。你遇到的报错来自Variance函数内的三元判断:当参数p=1时,分支直接返回0,不会执行内部的Sma函数调用,破坏了执行一致性,触发编译器校验报错。
修复方法
把Sma函数的调用从三元运算符的分支中提取出来,保证无论p取何值,Sma都会在每根K线执行,再根据条件返回对应计算结果即可,原有计算逻辑完全不变。
修复后完整代码
//@version=5 indicator('HAMI Pivot H/L ', overlay=true, max_bars_back=5000) //Basic length = input.int(30, group='Basic Settings', tooltip='Pivot length. Use higher values for having lines connected to more significant pivots') lookback = input.int(3, minval=1, group='Basic Settings', tooltip='Number of lines connecting a pivot high/low to display') Slope = input.float(1., minval=-1, maxval=1, step=0.1, group='Basic Settings', tooltip='Allows to multiply the linear regression slope by a number within -1 and 1') //Style ph_col = input.color(#2157f3, 'Pivot High Lines Color', group='Line Colors') pl_col = input.color(#ff1100, 'Pivot Low Lines Color', group='Line Colors') //────────────────────────────────────────────────────────────────────────────── Sma(src, p) => a = ta.cum(src) (a - a[math.max(p, 0)]) / math.max(p, 0) Variance(src, p) => // 提前提取Sma调用,保证每根K线都执行 sma_src_sq = Sma(src * src, p) sma_src = Sma(src, p) p == 1 ? 0 : sma_src_sq - math.pow(sma_src, 2) Covariance(x, y, p) => Sma(x * y, p) - Sma(x, p) * Sma(y, p) //────────────────────────────────────────────────────────────────────────────── n = bar_index ph = ta.pivothigh(length, length) pl = ta.pivotlow(length, length) //────────────────────────────────────────────────────────────────────────────── varip ph_array = array.new_float(0) varip pl_array = array.new_float(0) varip ph_n_array = array.new_int(0) varip pl_n_array = array.new_int(0) if ph array.insert(ph_array, 0, ph) array.insert(ph_n_array, 0, n) if pl array.insert(pl_array, 0, pl) array.insert(pl_n_array, 0, n) //────────────────────────────────────────────────────────────────────────────── val_ph = ta.valuewhen(ph, n - length, lookback - 1) val_pl = ta.valuewhen(pl, n - length, lookback - 1) val = math.min(val_ph, val_pl) k = n - val > 0 ? n - val : 2 slope = Covariance(close, n, k) / Variance(n, k) * Slope var line ph_l = na var line pl_l = na if barstate.islast for i = 0 to lookback - 1 by 1 ph_y2 = array.get(ph_array, i) ph_x1 = array.get(ph_n_array, i) - length pl_y2 = array.get(pl_array, i) pl_x1 = array.get(pl_n_array, i) - length ph_l := line.new(ph_x1, ph_y2, ph_x1 + 1, ph_y2 + slope, extend=extend.right, color=ph_col) pl_l := line.new(pl_x1, pl_y2, pl_x1 + 1, pl_y2 + slope, extend=extend.right, color=pl_col)
注:原代码末尾多余的孤立
pl_l语句无实际作用,已删除,不影响指标逻辑。
内容的提问来源于stack exchange,提问作者Rashid Alsuwaidi
相关产品推荐
相关产品推荐

