Pine Script绘制每日水平线时For循环覆盖原有线条问题求助
问题根源
当前代码存在两个核心问题:
- 未使用
var关键字存储已创建的线条对象,Pine Script每根K线刷新时都会重新执行所有非var定义的逻辑,每次循环都会新建线条,旧线条没有被持久化保留,导致原有线条消失、重复生成。 - 全局共用的
l和c_color变量在循环中被反复覆盖,不同日期的高低值计算互相干扰,导致线条位置错误、不连续。
修改后完整代码
//@version=4 study(title = "每日高低水平线", shorttitle = "DailyLine", overlay = true) // 配置参数:需要绘制的历史天数 draw_days = input(2, minval=1, title="绘制历史天数", type=input.integer) // 用数组存储已创建的线条对象,var修饰保证数组不会每次刷新重置 var line[] daily_lines = array.new_line() // 计算指定日期的K线涨跌和对应画线点位 get_line_level(target_date) => // 取当日的日K维度的开高低收,避免逐根K线匹配的误差 day_open = security(syminfo.tickerid, "D", open, gaps=barmerge.gaps_on) day_close = security(syminfo.tickerid, "D", close, gaps=barmerge.gaps_on) day_high = security(syminfo.tickerid, "D", high, gaps=barmerge.gaps_on) day_low = security(syminfo.tickerid, "D", low, gaps=barmerge.gaps_on) // 返回(画线点位,线条颜色) [day_close > day_open ? day_high : day_low, day_close > day_open ? color.teal : color.maroon] // 历史K线加载阶段清空旧线条,避免重复生成 if barstate.isfirst array.clear(daily_lines) // 仅在最后一根K线执行画线逻辑,减少重复计算 if barstate.islast current_day_start = timestamp("GMT", year(timenow), month(timenow), dayofmonth(timenow), 0, 0, 0) for i = 0 to draw_days - 1 target_date = current_day_start - 86400000 * i [level, line_color] = get_line_level(target_date) // 新建线条并存入数组持久化,避免被系统回收 new_line = line.new( x1=target_date, y1=level, x2=time, y2=level, xloc=xloc.bar_time, extend=extend.right, color=color.new(line_color, 80), style=line.style_solid, width=1 ) array.push(daily_lines, new_line)
关键修改说明
- 用
var修饰的line类型数组存储所有已创建的线条,保证K线刷新时线条不会被系统自动回收,彻底解决原有线条消失的问题 - 单独封装
get_line_level函数通过security直接取日K维度的涨跌、高低值,无需手动处理时间戳匹配,避免点位计算错误导致的线条不连续 - 仅在最后一根K线时执行循环创建逻辑,避免每根K线都重复生成冗余线条
- 新增可配置的绘制天数参数,可根据需求调整要显示的历史线条数量
修改后效果和预期一致:
内容的提问来源于stack exchange,提问作者user16213232
相关产品推荐
相关产品推荐

