Pine Script函数中Color参数不响应if条件的问题排查
Pine Script线条更新函数颜色参数异常问题
编写Pine Script时遇到以下问题:
- 自定义了用于更新数组内线条的
updateLine方法,传入_color参数时线条正常显示并更新; - 不传
_color参数时,线条会在推进K线(使用bar replay)后消失,无法保留初始设置的紫色; - 已验证
_color参数初始化为na的写法合规,但问题仍出在该参数相关逻辑中。
附可复现代码(包含有效/无效调用注释):
//@version=5 indicator("Latest Swing and Direction Finder", "Swing Direction", true) // VARIABLES //+-----------------------------------------------------+ //{ type lineShape line ln int arrIndex //} // FUNCTIONS //+-----------------------------------------------------+ //{ f_nearestSwing(int barsBack) => float extremePrice = high int extremeTime = time[1] int indx = 1 while indx <= barsBack if high[indx] > extremePrice extremePrice := high[indx] extremeTime := time[indx] indx += 1 [extremeTime, extremePrice] method newLine(array<lineShape> _lineArr, lineShape _lineObj, int x1, float y1, int x2, float y2, string extend=extend.none, color _color=color.white, string style=line.style_solid, int width=1) => _lineObj.ln := line.new(x1, y1, x2, y2, xloc.bar_time, extend, _color, style, width) _lineObj.arrIndex := na(array.size(_lineArr)) ? 0 : array.size(_lineArr) array.push(_lineArr, _lineObj) _lineObj // this function accepts the shape array that always only has one entry. method updateLine(array<lineShape> _lineArr, int _lineArrID, int _x1=na, float _y1=na, int _x2=na, float _y2=na, color _color=na) => for [x, item] in _lineArr if x == _lineArrID target = item.ln if _x1 line.set_x1(target, _x1) if _y1 line.set_y1(target, _y1) if _x2 line.set_x2(target, _x2) if _y2 line.set_y2(target, _y2) if not na(_color) line.set_color(target, _color) item //} // EXECUTION //+-----------------------------------------------------+ var bool init = false var lineArray = array.new<lineShape>() var highLine = lineShape.new() if barstate.islast [highBarTime, swingHighPrice] = f_nearestSwing(20) if not init lineArray.newLine(highLine, highBarTime, swingHighPrice, time, swingHighPrice, _color = color.purple) init := true else // This code will not work //lineArray.updateLine(highLine.arrIndex, highBarTime, swingHighPrice, time, swingHighPrice) // This code works lineArray.updateLine(highLine.arrIndex, highBarTime, swingHighPrice, time, swingHighPrice, color.purple)
问题原因分析
- 方法返回值错误:
updateLine方法最后返回item(单个lineShape对象),而不是原数组_lineArr。当调用lineArray.updateLine(...)时,Pine Script会将lineArray变量替换为返回的item,导致后续lineArray不再是数组类型,无法正确访问和更新线条对象,最终线条消失。 - 参数传递的隐性影响:当传入
_color参数时,第一次调用后lineArray被破坏,但由于barstate.islast仅在最后一根K线执行,线条暂时还能显示;不传_color时,后续推进K线后,破坏后的数组无法完成更新逻辑,线条直接消失。
修复方案
修改updateLine方法,移除错误的返回语句,返回原数组以保持变量类型正确:
method updateLine(array<lineShape> _lineArr, int _lineArrID, int _x1=na, float _y1=na, int _x2=na, float _y2=na, color _color=na) => for [x, item] in _lineArr if x == _lineArrID target = item.ln if _x1 line.set_x1(target, _x1) if _y1 line.set_y1(target, _y1) if _x2 line.set_x2(target, _x2) if _y2 line.set_y2(target, _y2) if not na(_color) line.set_color(target, _color) // 返回原数组,保持lineArray的数组类型 _lineArr
修复后,即使不传_color参数,线条也会保留初始设置的紫色,推进K线时正常更新而不消失。
内容的提问来源于stack exchange,提问作者Xalladus
相关产品推荐
相关产品推荐

