Pine Script v5指定日期间隔垂直线绘制问题及优化问询
在TradingView的Pine Script v5中优化日期间隔垂直线绘制
我需要在TradingView中使用Pine Script v5实现以下功能:基于通过input confirm参数选择的起始日期,按照数组内设定的天数偏移量(如5、10、15天等)绘制垂直线。例如起始日期选6月1日,则需在6月6日、11日等对应日期绘制垂直线。
最初编写的代码仅能绘制起始日期的垂直线,将时间戳调整为毫秒格式后代码可正常运行,但希望找到无需遍历数组的更优实现方式。
初始代码(仅绘制起始日期)
//@version=5 indicator("Vertical lines on Dates", overlay = true) // 交互式起始日期 start_date = input.time(timestamp("1 Jul 2021 00:00 +0000"), "Start Date",inline = "01",group = grp1,confirm = true) // 定义天数数组 days = array.new_int(21) array.set(days, 0, 5) array.set(days, 1, 10) array.set(days, 2, 15) for i = 0 to (array.size(days) == 0 ? na : array.size(days) - 1) var time_unix=(start_date+array.get(days,i)*86400) if time == time_unix line.new(time_unix,high,time_unix,low,xloc = xloc.bar_time)
调整后可运行代码(遍历数组实现)
//@version=5 indicator("Vertical lines on Dates", overlay = true) grp1 = "设置" start_date = input.time(timestamp("1 Jul 2021 00:00 +0000"), "起始日期",inline = "01",group = grp1,confirm = true) // 定义天数数组 days = array.new_int(3) array.set(days, 0, 5) array.set(days, 1, 55) array.set(days, 2, 105) var lastOccurance_ = start_date for i = 0 to (array.size(days) == 0 ? na : array.size(days) - 1) lastOccurance_ := start_date + array.get(days,i)*60*60*24*1000 if lastOccurance_ == time line.new(bar_index,high * 2,bar_index,low * 0.5,color = color.black)
优化方案(无需遍历数组)
核心思路是计算当前K线时间与起始日期的天数差,直接判断该差值是否存在于设定的偏移天数数组中,避免循环遍历:
//@version=5 indicator("优化版日期偏移垂直线", overlay=true) // 分组设置 grp1 = "参数设置" // 可确认的起始日期输入 start_date = input.time(timestamp("1 Jul 2021 00:00 +0000"), "起始日期", inline="01", group=grp1, confirm=true) // 直接初始化偏移天数数组(支持任意数量的天数) offset_days = array.new_int(3, 5, 10, 15) // 计算当前K线时间与起始日期的整数天数差 days_since_start = math.floor((time - start_date) / (86400 * 1000)) // 当天数差在数组中,且是该日期的第一根K线时绘制垂直线 if array.includes(offset_days, days_since_start) and ta.change(time("D")) // 垂直线覆盖近期高低点范围,避免因当前K线高低限制显示不全 line.new(bar_index, ta.highest(high, 20), bar_index, ta.lowest(low, 20), color=color.new(color.blue, 0), width=2, style=line.style_solid)
优化点说明
- 避免数组遍历:使用
array.includes()直接判断天数差是否在目标数组中,代码更简洁高效 - 防止重复画线:通过
ta.change(time("D"))确保每个日期仅在第一根K线绘制一次垂直线 - 更灵活的数组初始化:直接用
array.new_int()的多参数形式初始化数组,省去多次array.set()的冗余操作 - 自适应垂直线范围:用近期高低点定义垂直线的上下端点,避免因当前K线高低导致线条显示不全
内容的提问来源于stack exchange,提问作者Manish Singh
相关产品推荐
相关产品推荐

