Pine Script v5按日期列表绘制图表垂直线报错如何修复
报错原因
两个报错本质是Pine Script v5的类型规则和作用域规则与写法不匹配导致:
timestamp()函数接收日期字符串入参的重载版本,要求参数必须是const string类型(编译阶段就能确定值的常量字符串),通过array.get()从数组中取出的字符串属于series string类型(运行时动态计算的序列值),类型不匹配触发第一个报错input.time()属于脚本初始化阶段就要完成注册的配置项,必须声明在全局作用域,写在while循环内部会导致全局作用域无法识别变量,触发第二个变量找不到的报错;同时input.time()的默认时间参数也要求是const类型常量,同样不支持传入动态取到的series值。
修复后可运行代码
核心调整点:把所有input声明移到全局作用域,直接用常量字符串传入timestamp()作为默认值,数组只用来存储已经生成好的time类型时间戳做批量遍历:
//@version=5 indicator("自定义日期垂直线", overlay=true) // 全局作用域注册时间配置项,直接传入常量字符串作为默认值 lineDate1 = input.time(timestamp("11 Jul 2022 12:00"), title="第一条线位置") lineDate2 = input.time(timestamp("13 Jul 2022 12:00"), title="第二条线位置") if barstate.islastconfirmedhistory // 把配置好的时间点存入数组统一遍历 lineDates = array.new<time>(2, lineDate1, lineDate2) for dateVal in lineDates line.new(x1=dateVal, y1=high, x2=dateVal, y2=low, extend=extend.both, color=color.blue, width=2, xloc=xloc.bar_time)
替代实现方案
如果不需要给每个日期提供可手动调整的输入配置,只是要给固定日期组绘制垂直线,可以直接用time类型数组存常量时间戳,代码更简洁:
//@version=5 indicator("固定日期垂直线", overlay=true) // 直接初始化存储常量时间戳的数组 var targetDates = array.new<time>( timestamp("11 Jul 2022 12:00"), timestamp("13 Jul 2022 12:00") ) // 最后一根已确认K线上批量画线 if barstate.islastconfirmedhistory for t in targetDates line.new(x1=t, y1=high, x2=t, y2=low, extend=extend.both, color=color.blue, width=2, xloc=xloc.bar_time)
编写注意事项
- 所有
input.*系列函数必须声明在全局作用域,不能放在循环、条件判断等局部代码块内,否则会出现作用域注册失败的问题 - 标注参数类型为
const的内置函数,不支持传入运行时动态生成的series类型值,必须传入编译阶段就能确定值的常量 - 批量处理时间点时,优先直接存储time类型的时间戳值,不要存储字符串后再动态调用
timestamp()做转换
内容的提问来源于stack exchange,提问作者igel322
相关产品推荐
相关产品推荐

