TradingView Pine Script 5编译报错:float[]转series float求助
Pine Script 5中Burg算法自回归函数的类型不匹配问题解决
问题描述
编写Burg算法自回归函数时出现编译报错:
Cannot call 'operator *' with argument 'expr0'='call 'operator SQBR' (float[])'. An argument of 'float[]' type was used but a 'series float' is expected
问题出在以下两行代码:
forward_error += autocorrelation[i] * array.get(ar_coefficients, i - iter) backward_error += autocorrelation[i - iter] * array.get(ar_coefficients, i)
原因是直接用数组索引方式(autocorrelation[i])获取的数组元素类型为float,但运算上下文需要series float类型,导致类型不匹配。
完整原始代码:
// Autoregressive function using Burg method source = input.source(close, "Source") order = input.int(2, "Order") lookback = input.int(100, "Lookback", minval = 2) // Step 1: Calculate Autocorrelation Function (ACF) autocorrelation = array.new_float(lookback) for lag = 0 to lookback - 1 correlation = ta.correlation(close, source[lag], lengthBB) array.push(autocorrelation, correlation) // Step 2: Initialize Coefficients ar_coefficients = array.new_float(order + 1) array.push(ar_coefficients, 1.0) // Initialize first coefficient as 1 // Step 3: Iterative Calculation (Burg algorithm) for iter = 1 to order forward_error = 1.0 backward_error = -1.0 for i = iter to lookback - 1 forward_error += autocorrelation[i] * array.get(ar_coefficients, i - iter) backward_error += autocorrelation[i - iter] * array.get(ar_coefficients, i) // Avoid division by zero if backward_error != 0.0 reflection_coefficient = -2.0 * forward_error / backward_error // Update coefficients using Burg recursion formula temp_coefficients = array.new_float(order + 1) array.push(temp_coefficients, 1.0) // First coefficient remains 1 for i = 1 to iter coefficient = array.get(ar_coefficients, i) + reflection_coefficient * array.get(ar_coefficients, iter - i + 1) array.push(temp_coefficients, coefficient) ar_coefficients := temp_coefficients // Calculate autoregressive values hlc3_series = (hlc3) autoregressive_values = array.new_float(lookback) for i = 0 to lookback - 1 value = 0.0 for j = 1 to order // Perform element-wise multiplication and addition value += array.get(ar_coefficients, j) * hlc3_series[i - j] array.push(autoregressive_values, value) // Plot autoregressive values for i = 0 to lookback - 1 // Plot individual autocorrelation values plot(array.get(autocorrelation, i), color=color.purple, title="Autocorrelation Values")
问题分析
Pine Script中存在两类核心数据类型:
float[]:静态数组,用于批量存储固定数量的数值series float:序列值,随K线周期动态更新的逐值数据
原始代码的错误点:
- 用
autocorrelation[i]直接索引数组是错误语法,Pine Script必须用array.get()访问数组元素 - 循环缩进错误,内层循环未嵌套在外层循环中,导致逻辑完全偏离预期
- 绘图时直接在循环中调用
plot(),不符合Pine Script的绘图规则
解决方案
核心修正点
- 用
array.get()正确获取数组元素,确保运算时类型一致 - 修复循环缩进,保证Burg算法的迭代逻辑正确
- 将数组转换为序列后再绘图,避免循环绘图的错误
修正后的完整代码
//@version=5 indicator("Burg AR Algorithm", overlay=true) source = input.source(close, "Source") order = input.int(2, "Order") lookback = input.int(100, "Lookback", minval = 2) lengthBB = input.int(100, "Correlation Length", minval=2) // 补充定义缺失的lengthBB // Step 1: Calculate Autocorrelation Function (ACF) autocorrelation = array.new_float() for lag = 0 to lookback - 1 correlation = ta.correlation(close, source[lag], lengthBB) array.push(autocorrelation, correlation) // Step 2: Initialize Coefficients ar_coefficients = array.new_float() array.push(ar_coefficients, 1.0) // 初始化第一个系数为1 // Step 3: Iterative Calculation (Burg algorithm) for iter = 1 to order forward_error = 1.0 backward_error = -1.0 // 内层循环必须嵌套在外层迭代循环中 for i = iter to lookback - 1 // 用array.get()正确获取数组元素,避免类型不匹配 acf_val = array.get(autocorrelation, i) ar_coeff_val = array.get(ar_coefficients, i - iter) forward_error += acf_val * ar_coeff_val acf_val_back = array.get(autocorrelation, i - iter) ar_coeff_val_back = array.get(ar_coefficients, i) backward_error += acf_val_back * ar_coeff_val_back // 避免除以零 if backward_error != 0.0 reflection_coefficient = -2.0 * forward_error / backward_error // 用Burg递归公式更新系数 temp_coefficients = array.new_float() array.push(temp_coefficients, 1.0) // 第一个系数保持为1 for i = 1 to iter coefficient = array.get(ar_coefficients, i) + reflection_coefficient * array.get(ar_coefficients, iter - i + 1) array.push(temp_coefficients, coefficient) ar_coefficients := temp_coefficients // 计算自回归值 autoregressive_values = array.new_float() for i = 0 to lookback - 1 value = 0.0 for j = 1 to order if i >= j // 避免索引越界 value += array.get(ar_coefficients, j) * hlc3[i - j] array.push(autoregressive_values, value) // 将数组转换为序列以便绘图 ar_series = array.to_series(autoregressive_values) plot(ar_series, color=color.blue, title="Autoregressive Values") // 绘制自相关序列(取最近lookback个值) acf_series = array.to_series(autocorrelation) plot(acf_series, color=color.purple, title="Autocorrelation Values", display=display.data_window)
关键注意事项
- Pine Script中数组的访问必须使用
array.get()/array.set(),不支持直接索引语法 - 序列与数组是完全不同的类型,运算时必须保证类型一致
- 循环缩进直接影响逻辑正确性,必须严格嵌套
- 绘图时需将数组转换为序列(
array.to_series()),不能在循环中调用plot()
内容的提问来源于stack exchange,提问作者Artuhan
相关产品推荐
相关产品推荐

