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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:18:52