You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

绘制垂直线时遭遇Study Error问题求助

Pine Script v5 绘制指定日期垂直线报错问题

报错信息

Error on bar 0: Objects positioned using xloc.bar_index cannot be drawn further than 500 bars into the future.

原代码

//@version=5
indicator("ESPP MAY/NOV", overlay = true)

// Inputs for the user to select dates
var date1 = input.time(timestamp("2014-05-01 00:00"), "Select Date 1")
var date2 = input.time(timestamp("2014-11-01 00:00"), "Select Date 2")
var date3 = input.time(timestamp("2015-05-01 00:00"), "Select Date 3")
var date4 = input.time(timestamp("2015-11-01 00:00"), "Select Date 4")
var date5 = input.time(timestamp("2016-05-01 00:00"), "Select Date 5")
var date6 = input.time(timestamp("2016-11-01 00:00"), "Select Date 6")
var date7 = input.time(timestamp("2017-05-01 00:00"), "Select Date 7")
var date8 = input.time(timestamp("2017-11-01 00:00"), "Select Date 8")
var date9 = input.time(timestamp("2018-05-01 00:00"), "Select Date 9")
var date10 = input.time(timestamp("2018-11-01 00:00"), "Select Date 10")
var date11 = input.time(timestamp("2019-05-01 00:00"), "Select Date 11")
var date12 = input.time(timestamp("2019-11-01 00:00"), "Select Date 12")
var date13 = input.time(timestamp("2020-05-01 00:00"), "Select Date 13")
var date14 = input.time(timestamp("2020-11-01 00:00"), "Select Date 14")
var date15 = input.time(timestamp("2021-05-01 00:00"), "Select Date 15")
var date16 = input.time(timestamp("2021-11-01 00:00"), "Select Date 16")
var date17 = input.time(timestamp("2022-05-01 00:00"), "Select Date 17")
var date18 = input.time(timestamp("2022-11-01 00:00"), "Select Date 18")
var date19 = input.time(timestamp("2023-05-01 00:00"), "Select Date 19")
var date20 = input.time(timestamp("2023-11-01 00:00"), "Select Date 20")
var date21 = input.time(timestamp("2024-05-01 00:00"), "Select Date 21")
var date22 = input.time(timestamp("2024-11-01 00:00"), "Select Date 22")
var date23 = input.time(timestamp("2025-05-01 00:00"), "Select Date 23")
var date24 = input.time(timestamp("2025-11-01 00:00"), "Select Date 24")


// Function to draw vertical lines on the specified dates
draw_vertical_line(date) =>
    line.new(x1 = time, y1 = high, x2 = time, y2 = low, color = color.red, width = 6)

// Draw vertical lines on the selected dates
draw_vertical_line(date1)
draw_vertical_line(date2)
draw_vertical_line(date3)
draw_vertical_line(date4)
draw_vertical_line(date5)
draw_vertical_line(date6)
draw_vertical_line(date7)
draw_vertical_line(date8)
draw_vertical_line(date9)
draw_vertical_line(date10)
draw_vertical_line(date11)
draw_vertical_line(date12)
draw_vertical_line(date13)
draw_vertical_line(date14)
draw_vertical_line(date15)
draw_vertical_line(date16)
draw_vertical_line(date17)
draw_vertical_line(date18)
draw_vertical_line(date19)
draw_vertical_line(date20)
draw_vertical_line(date21)
draw_vertical_line(date22)
draw_vertical_line(date23)
draw_vertical_line(date24)

问题解析

  1. bars的含义:在Pine Script中,"bar"指图表上的单根K线,单位是K线数量。比如日线图上1个bar代表1天,1小时图上1个bar代表1小时。
  2. 报错原因:
    • 原代码的draw_vertical_line函数未使用传入的目标日期,而是固定用time(当前K线时间)绘制直线,导致每次运行都在当前K线重复创建24条直线。
    • TradingView默认使用xloc.bar_index模式定位对象,不允许绘制超过当前K线之后500个bar的对象,原代码的重复绘制操作触发了这个限制。

修复后的代码

//@version=5
indicator("ESPP MAY/NOV", overlay = true)

// 用数组存储所有日期,简化代码结构
var dates_array = array.new_time(0)
array.push(dates_array, timestamp("2014-05-01 00:00"))
array.push(dates_array, timestamp("2014-11-01 00:00"))
array.push(dates_array, timestamp("2015-05-01 00:00"))
array.push(dates_array, timestamp("2015-11-01 00:00"))
array.push(dates_array, timestamp("2016-05-01 00:00"))
array.push(dates_array, timestamp("2016-11-01 00:00"))
array.push(dates_array, timestamp("2017-05-01 00:00"))
array.push(dates_array, timestamp("2017-11-01 00:00"))
array.push(dates_array, timestamp("2018-05-01 00:00"))
array.push(dates_array, timestamp("2018-11-01 00:00"))
array.push(dates_array, timestamp("2019-05-01 00:00"))
array.push(dates_array, timestamp("2019-11-01 00:00"))
array.push(dates_array, timestamp("2020-05-01 00:00"))
array.push(dates_array, timestamp("2020-11-01 00:00"))
array.push(dates_array, timestamp("2021-05-01 00:00"))
array.push(dates_array, timestamp("2021-11-01 00:00"))
array.push(dates_array, timestamp("2022-05-01 00:00"))
array.push(dates_array, timestamp("2022-11-01 00:00"))
array.push(dates_array, timestamp("2023-05-01 00:00"))
array.push(dates_array, timestamp("2023-11-01 00:00"))
array.push(dates_array, timestamp("2024-05-01 00:00"))
array.push(dates_array, timestamp("2024-11-01 00:00"))
array.push(dates_array, timestamp("2025-05-01 00:00"))
array.push(dates_array, timestamp("2025-11-01 00:00"))

// 绘制垂直线的函数,使用时间定位模式避开未来bar限制
draw_vertical_line(target_date) =>
    // 仅在目标日期对应的K线绘制一次直线
    if time == target_date
        line.new(
            x1=target_date, 
            y1=ta.highest(high, 100), 
            x2=target_date, 
            y2=ta.lowest(low, 100), 
            color=color.red, 
            width=6, 
            xloc=xloc.time  // 指定基于时间定位
        )

// 遍历数组绘制所有日期的垂直线
for i from 0 to array.size(dates_array)-1
    draw_vertical_line(array.get(dates_array, i))

关键修复点

  • 使用数组存储日期,避免重复定义24个变量,代码更简洁易维护。
  • 在line.new中指定xloc=xloc.time,基于时间戳定位直线,不受500个未来bar的限制。
  • 增加time == target_date判断,确保每条直线只在目标日期对应的K线绘制一次,避免重复创建对象。
  • 使用ta.highest和ta.lowest设置直线的上下端点,让直线覆盖更多价格区间,显示更清晰。

内容的提问来源于stack exchange,提问作者Robert Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:09:54