Pine Script导入CSV数据报错:csvData[i,1]语法错误求修复
问题修复方案
核心错误分析
你的代码存在三个关键问题:
- CSV数据获取错误:原代码用
request.security只获取了单个close值,不是二维数组,无法通过索引访问多行多列数据。 - 二维数组访问语法错误:Pine Script不支持
csvData[i,1]或csvData[i][1]的访问方式,必须用array.get(array.get(二维数组, 行索引), 列索引)。 - 语法结构混乱:
if not na(csvData)后未用大括号包裹代码块,导致else位置错误,编译器报错。
修复后的完整代码
//@version=5 indicator("Top 5 Prices", overlay=true) // 存储CSV二维数据、价格数组和水平线对象 var float[][] csvData = array.new_array() var float[] top5BidPrices = array.new_float(5) var float[] top5AskPrices = array.new_float(5) var line[] bidLines = array.new_line(5) var line[] askLines = array.new_line(5) // 获取CSV表格并转为二维数组 csv_table = request.security("MyCsvFilePath", "D", request.table.all()) if not na(csv_table) csvData := request.table.to_array(csv_table) // 确保CSV数据行数足够(至少5行) if array.size(csvData) >= 5 // 更新Top5 Bid价格(第1列,索引从0开始) for i = 0 to 4 row = array.get(csvData, i) if array.size(row) >= 2 array.set(top5BidPrices, i, array.get(row, 1)) // 更新Top5 Ask价格(第3列,索引从0开始) for i = 0 to 4 row = array.get(csvData, i) if array.size(row) >= 4 array.set(top5AskPrices, i, array.get(row, 3)) // 更新Bid水平线(避免重复创建) for i = 0 to 4 bid_price = array.get(top5BidPrices, i) if not na(bid_price) line_obj = array.get(bidLines, i) if na(line_obj) array.set(bidLines, i, line.new(bar_index[1], bid_price, bar_index, bid_price, width=1, color=color.blue)) else line.set_x2(line_obj, bar_index) // 更新Ask水平线(避免重复创建) for i = 0 to 4 ask_price = array.get(top5AskPrices, i) if not na(ask_price) line_obj = array.get(askLines, i) if na(line_obj) array.set(askLines, i, line.new(bar_index[1], ask_price, bar_index, ask_price, width=1, color=color.red)) else line.set_x2(line_obj, bar_index)
关键修复说明
- CSV数据获取:用
request.table.all()获取完整CSV表格,再转为二维数组,支持多行多列访问。 - 数组访问:通过嵌套
array.get访问指定行列的数据,符合Pine Script规范。 - 语法结构:所有条件代码块用大括号包裹,修复if-else语法错误。
- 性能优化:用
array.set更新价格数组,避免无限扩容;用var数组存储水平线对象,只创建一次,后续更新位置,防止内存泄漏。 - 容错处理:增加数组大小检查,避免因CSV格式异常导致的索引越界。
内容的提问来源于stack exchange,提问作者Arman Mcc
相关产品推荐
相关产品推荐

