You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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线周期动态更新的逐值数据

原始代码的错误点:

  1. 用autocorrelation[i]直接索引数组是错误语法,Pine Script必须用array.get()访问数组元素
  2. 循环缩进错误,内层循环未嵌套在外层循环中,导致逻辑完全偏离预期
  3. 绘图时直接在循环中调用plot(),不符合Pine Script的绘图规则

解决方案

核心修正点

  1. 用array.get()正确获取数组元素,确保运算时类型一致
  2. 修复循环缩进,保证Burg算法的迭代逻辑正确
  3. 将数组转换为序列后再绘图,避免循环绘图的错误

修正后的完整代码

//@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:16:06