绘制垂直线时遭遇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)
问题解析
- bars的含义:在Pine Script中,"bar"指图表上的单根K线,单位是K线数量。比如日线图上1个bar代表1天,1小时图上1个bar代表1小时。
- 报错原因:
- 原代码的
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
相关产品推荐
相关产品推荐

