Pine Script神经网络训练二维数组构建报错求助
解决Pine Script中神经网络训练数据二维数组的构建问题
嘿,我之前在Pine Script里折腾神经网络训练数据的时候,也踩过一模一样的坑!你遇到的语法错误核心原因是:Pine Script不支持直接用[]初始化动态数组,而且神经网络要求的「输入-输出配对」嵌套结构,必须用特定的数组创建函数来实现。
错误根源
你写的trainingData = []在Pine Script里是非法的——Pine是强类型语言,所有数组必须通过array.new_*系列函数初始化,尤其是要存储嵌套数组的训练数据,得用array.new_array()来创建容器。
修正后的完整解决方案
我把你的代码改成符合Pine Script语法规范的版本,同时适配内置神经网络函数的要求:
第一步:先把K线序列转成可索引的静态数组
Pine的原生bar序列(比如close、volume)不能直接用[i]索引访问,得先把它们存入静态数组:
//@version=5 indicator("2-Input NN Training Data", overlay=true) // 用var声明,确保数组只初始化一次 var float[] closePrices = array.new_float() var float[] volumes = array.new_float() // 每根bar把最新的收盘价和成交量加入数组 array.push(closePrices, close) array.push(volumes, volume)
第二步:修正训练数据构建函数
下面的函数会生成符合要求的二维训练数组——每个元素是[输入数组(2个元素), 输出数组(1个元素)]的嵌套结构:
trainNN() => // 初始化能存储嵌套数组的训练数据容器 var array trainingData = array.new_array() // 确保数组有足够的数据(至少需要2根bar才能生成1组训练样本) if array.size(closePrices) > 1 // 记录最后处理的bar索引,避免重复生成训练数据 var int lastProcessed = 0 // 循环范围:从上次处理的位置到倒数第二根bar(要留i+1的收盘价) for i = lastProcessed to array.size(closePrices)-2 // 构建2个输入神经元的数组:收盘价+成交量 float[] inputPair = array.new_float(2, array.get(closePrices, i), array.get(volumes, i)) // 构建1个输出神经元的数组:下一根bar的收盘价 float[] outputVal = array.new_float(1, array.get(closePrices, i+1)) // 把输入-输出配对加入训练数组 array.push(trainingData, array.new_array(2, inputPair, outputVal)) // 更新最后处理的索引 lastProcessed := i + 1 // 返回训练数据,供后续nn.train()使用 trainingData
第三步:验证训练数据
你可以在最后一根bar上打印训练样本数量,确认数据生成正常:
// 获取训练数据 trainingDataset = trainNN() // 最后一根bar显示样本数 if barstate.islast label.new(bar_index, high, str.format("训练样本数: {0}", array.size(trainingDataset)), color=color.blue, textcolor=color.white, style=label.style_label_down)
关键注意事项
- 强类型要求:所有数组必须明确类型(比如
float[]),不能用无类型的字面量数组 - 循环边界:不能用
bar_index-1,要根据数组大小计算到array.size(closePrices)-2,避免访问越界 - 避免重复训练:用
var int lastProcessed记录处理位置,防止每根bar都重复生成相同的训练样本 - 内置NN函数适配:这个结构完全符合
nn.train()函数的要求,你可以直接把trainingDataset传入训练函数
内容的提问来源于stack exchange,提问作者Bunc Bunc
相关产品推荐
相关产品推荐

