Pine Script v6全局变量修改报错求助:无法在函数中修改newLevel
Pine Script v6 枢轴策略错误解决方案
1. 解决「Cannot modify global variable 'newLevel' in function」错误
Pine Script v6 默认禁止函数直接修改全局变量,可通过以下两种方式解决:
方案一:给全局变量添加mutable关键字
修改全局变量声明,允许函数直接修改:
var mutable float newLevel = na // 新增mutable关键字
方案二:通过函数返回值更新全局变量(更推荐,符合函数设计原则)
调整函数逻辑,让函数返回目标枢轴价格,再在全局作用域完成赋值:
var float newLevel = na // 修改函数,返回找到的P级价格 drawNewPivots(startTime) => var float foundPLevel = na newGraphics = array.new<pivotGraphic>() for [index, coord] in pivotPointsArray // 先做索引合法性检查,避免越界 if index < array.size(graphicSettingsArray) levelSettings = graphicSettingsArray.get(index) if levelSettings.levelName == "P" foundPLevel := coord // 其余绘制逻辑保持不变 drawnGraphics.add_row(array_id = newGraphics) // 其余清理逻辑保持不变 foundPLevel // 返回找到的价格 // 在全局作用域调用函数并更新newLevel newLevel := drawNewPivots(startTime)
2. 解决「array.get()索引越界」错误
报错根源是graphicSettingsArray.get(index)中,index超出了graphicSettingsArray的有效索引范围,大概率是pivotPointsArray与graphicSettingsArray长度不匹配。
解决步骤:
- 循环时先判断索引是否在
graphicSettingsArray的有效范围内:
for [index, coord] in pivotPointsArray // 新增索引合法性检查 if index >= 0 and index < array.size(graphicSettingsArray) levelSettings = graphicSettingsArray.get(index) // 后续逻辑保持不变
- 确保
pivotPointsArray和graphicSettingsArray的元素数量始终同步,比如初始化或添加元素时统一操作。
完整修正后的核心代码示例
var float newLevel = na var array<array<pivotGraphic>> drawnGraphics = array.new<array<pivotGraphic>>() drawNewPivots(startTime) => var float foundPLevel = na newGraphics = array.new<pivotGraphic>() for [index, coord] in pivotPointsArray if index < array.size(graphicSettingsArray) levelSettings = graphicSettingsArray.get(index) if levelSettings.levelName == "P" foundPLevel := coord if not na(coord) and levelSettings.showLevel lineEndTime = startTime + timeframe.in_seconds(pivotTimeframe) * 1000 * pivotYearMultiplier pivotLine = line.new(startTime, coord, lineEndTime, coord, xloc = xloc.bar_time, color=levelSettings.levelColor, width=linewidthInput) pivotLabel = label.new(x = positionLabelsInput == "Left" ? startTime : lineEndTime, y = coord, text = (showLabelsInput ? levelSettings.levelName + " " : "") + (showPricesInput ? "(" + str.tostring(coord, format.mintick) + ")" : ""), style = positionLabelsInput == "Left" ? label.style_label_right : label.style_label_left, textcolor = levelSettings.levelColor, color = #00000000, xloc=xloc.bar_time) newGraphics.push(pivotGraphic.new(pivotLine, pivotLabel)) drawnGraphics.add_row(array_id = newGraphics) if drawnGraphics.rows() > maxHistoricalPivotsInput oldGraphics = drawnGraphics.remove_row(0) for graphic in oldGraphics graphic.delete() foundPLevel // 全局更新newLevel newLevel := drawNewPivots(startTime)
内容的提问来源于stack exchange,提问作者Alex Kasprzak
相关产品推荐
相关产品推荐

