Pine Script指标开发:K线收于线上方后移除水平线
Pine Script 水平线突破后自动移除/变色问题解决
问题分析
原代码存在以下核心问题,导致无法在收盘价突破后正确处理线条:
- 语法错误:
Signal变量末尾多了一个右括号,脚本无法正常运行 - 数组初始化错误:存储线条和价格的数组被放在
if Signal块内,每次信号触发都会重新初始化数组,丢失之前的线条记录 - 缺乏线条遍历检查:仅在信号触发时处理线条创建,未在每个K线收盘后遍历所有已绘制线条,检查是否被收盘价突破
- 价格匹配错误:使用
ta.valuewhen仅获取最近一次信号的价格,无法对应每条线条的实际价格
修正后的代码
//@version=5 indicator("NHNHNHNH", overlay = true) Kol_Linii = input(2, "Количество линий") // 修正信号条件的语法错误 Signal = open[3] < close[3] and open[2] < close[2] and open[1] < close[1] and close < open and high[1] > high and high[1] > close[1] and high > open // 全局初始化线条数组和对应价格数组 var line_array = array.new_line() var line_price_array = array.new_float() // 信号触发时创建水平线 if Signal current_bar = bar_index current_high = high // 创建向右延伸的水平线 new_line = line.new(current_bar, current_high, current_bar + 1, current_high, extend = extend.right, color = color.fuchsia, width = 1) // 将线条和对应价格加入数组 array.push(line_array, new_line) array.push(line_price_array, current_high) // 超过设定数量时,删除最早的线条 if array.size(line_array) > Kol_Linii removed_line = array.shift(line_array) line.delete(removed_line) array.shift(line_price_array) // 同步移除对应价格 // 收盘后检查所有线条是否被突破 if barstate.islast // 倒序遍历避免删除元素时索引混乱 for i = array.size(line_array) - 1 downto 0 line_obj = array.get(line_array, i) line_p = array.get(line_price_array, i) // 检查收盘价是否收于线上方 if close > line_p // 方案1:删除线条 line.delete(line_obj) array.remove(line_array, i) array.remove(line_price_array, i) // 方案2:更改颜色(注释上方删除代码,启用此行) // line.set_color(line_obj, color.green)
关键修正说明
- 语法修复:移除
Signal条件末尾多余的右括号 - 全局数组初始化:用
var关键字在全局初始化线条和价格数组,确保数组在脚本运行期间持续保存数据 - 线条与价格绑定:创建线条时直接记录当前信号的高点价格,保证每条线条对应正确的突破阈值
- 收盘后遍历检查:使用
barstate.islast确保在K线收盘后执行突破检查,倒序遍历避免删除元素时出现索引错位 - 双处理逻辑:提供两种突破后的处理方式——直接删除线条,或修改线条颜色,可根据需求切换
内容的提问来源于stack exchange,提问作者Роман Костюк
相关产品推荐
相关产品推荐

