Pine Script V2转V5求助:变量自引用代码转换问题
转换Pine Script v2自引用变量代码到v5版本
原v2代码中第9行的k变量存在自引用(声明时直接调用自身的历史值k[length]),这在v5中会触发循环引用错误——v5的变量赋值逻辑不允许这种直接自引用结构,需通过数组存储历史值来解决。以下是完整的v5转换代码及关键改动说明:
转换后的v5代码
//@version=5 indicator("Pseudo Polynomial Channel", overlay=true) length = input.int(14), morph = input.float(0.9, minval=0, maxval=1), mult = input.float(1.), flatten = input.float(1.) //---- x = bar_index // 替代v2中的n y = close m(a, b) => morph * a + (1 - morph) * b // 用数组存储k的历史值,规避自引用问题 var float[] k_array = array.new_float() // 初始化前length*2根K线的k值 if bar_index < length * 2 array.push(k_array, y) else // 获取length和length*2周期前的k值 k_length = array.get(k_array, bar_index - length) k_length2 = array.get(k_array, bar_index - length * 2) // 计算当前k值 current_k = nz(m(k_length, y), y) + (x - x[length]) / (x[length*2] - x[length]) * (nz(m(k_length2, y), y) - nz(m(k_length, y), y)) / flatten array.push(k_array, current_k) // 提取当前bar的k值 k = array.get(k_array, bar_index) k1 = ta.sma(k, length) er = ta.cum(math.abs(y - k1)) / bar_index * mult //---- a = k1 + er b = k1 - er //---- A = plot(a, color=#2196f3, linewidth=2, transp=0) plot(k1, color=#e65100, linewidth=2, transp=0) B = plot(b, color=#ff1100, linewidth=2, transp=0) fill(A, B, #2196f3, transp=95)
关键改动说明
替换核心函数与变量:
- 用
indicator替代v2的study,这是v5的标准声明方式 - 用
bar_index替代v2的n,统一表示当前K线的索引
- 用
解决自引用问题:
- 声明
var float[] k_array:var确保数组仅初始化一次,避免每次K线都重建 - 前
length*2根K线直接填充close值,保证有足够历史数据后再执行计算 - 通过
array.get获取指定周期前的k值,彻底规避直接自引用的循环报错
- 声明
适配v5命名规范:
- 输入参数细分
input.int和input.float,明确参数类型 - 技术指标函数(
sma/cum)归到ta命名空间,数学函数(abs)归到math命名空间
- 输入参数细分
内容的提问来源于stack exchange,提问作者Babu Ramasamy
相关产品推荐
相关产品推荐

