Pine Script v5:看涨吞没蜡烛水平线无法按需停止绘制求助
问题分析与代码修正
你的代码核心问题在于单变量存储线条导致覆盖、无判断调用线条方法引发隐性错误,以及穿越判断逻辑不够严谨,以下是具体修正方案:
原代码问题点
- 单个
_Line变量会被新的看涨吞没信号覆盖,旧线条失去引用无法被更新,永远停在100根K线的位置 - 初始状态或线条已停止时,调用
_Line.get_y2()会触发隐性运行错误,导致穿越判断失效 - 仅用
open判断穿越覆盖场景有限,未考虑线条到期的终止逻辑
修正后的代码
//@version=5 indicator("Engulfment Stop Line", overlay = true) // 蜡烛形态基础判断 _White = close >= open _Black = close <= open _Body = math.abs(close - open) // 用绝对值避免阴线实体为负的计算问题 // 看涨吞没形态修正(确保实体比较的正确性) _Engulf = _Black[2] and _White[1] and close[1] >= high[2] and _Body[1] >= 2 * _Body[2] // 用数组存储所有活跃线条,避免新信号覆盖旧线条 var line[] activeLines = array.new_line() // 生成新的水平线 if _Engulf _Level = open[1] // 创建初始延伸100根K线的线条 newLine = line.new(bar_index[1], _Level, bar_index + 100, _Level, width = 1) array.push(activeLines, newLine) // 遍历处理所有活跃线条 var int i = 0 while i < array.size(activeLines) currentLine = array.get(activeLines, i) lineLevel = line.get_y1(currentLine) // 判断是否穿越线条或线条到期 hasCrossed = ta.crossover(close, lineLevel) or ta.crossunder(close, lineLevel) hasExpired = bar_index >= line.get_x2(currentLine) if hasCrossed or hasExpired // 更新线条终点为当前K线 line.set_x2(currentLine, bar_index) // 从活跃数组移除,避免重复处理 array.remove(activeLines, i) else i += 1
关键修改说明
- 数组存储线条:用
line[]数组保存所有生成的线条,确保每条线条都能被跟踪和修改,不会被新信号覆盖 - 实体计算修正:使用
math.abs()处理蜡烛实体长度,避免阴线实体为负数导致的形态判断错误 - 严谨的终止逻辑:同时处理价格穿越线条和线条到期(达到100根K线)两种终止场景
- 遍历处理线条:逐个检查每条活跃线条的状态,触发终止条件后立即更新并移除,避免重复操作
内容的提问来源于stack exchange,提问作者Exlord
相关产品推荐
相关产品推荐

