在Pine Script的输入功能中,input.time() 是实现精准时间点控制的核心工具,它能为你的脚本设置面板,添加一个日期和时间选择器。
它的实战用途非常明确和强大:
- 定义回测窗口: 这是它最核心的用途。通过两个
input.time()输入(一个开始,一个结束),你可以让用户自由定义策略的回测区间,这是评估策略健壮性的必备功能。 - 标记关键事件: 在图表上某个特定时间点(比如美联储决议)绘制一条垂直线,用于视觉分析。
- 设定计算起点: 指定某个指标从哪个精确的时间点开始累积计算。
input.time() 的必填参数 defval,需要的是一个毫秒时间戳,一个巨大的、无法阅读的整数。
你总不能让用户去手算这个数字,这时timestamp() 函数就登场了。
它就是你的时间戳翻译官,能把你写的人话转换成机器需要的毫秒时间戳。
正确用法:
// 使用 timestamp() 来设置一个易于阅读的默认日期
input.time(timestamp("1 Feb 2022 12:00"), title="Line Location")
input.time() 的参数
defval:(必填) 默认的日期时间。强烈建议始终使用timestamp()函数来设置,如timestamp("1 Jan 2022")。title:(强烈建议) 输入项的名称,即显示在设置面板上的标签,如"回测开始时间"。tooltip:(推荐) 鼠标悬停在“i”图标上时,显示的详细帮助文本。group:分组标题,用于组织多个相关的输入项(比如把“开始时间”和“结束时间”放在一个组里)。inline:内联ID,用于将多个输入项显示在同一行。confirm:设置为true时,添加脚本到图表时会强制用户在图表上“点击”来选择一个时间。不常用。
提醒: 所有这些参数(如 defval, title 等)的值,都必须是常量,不能是动态的变量。
input.time() vs input.session()
这是新手必问的问题,它们俩到底有什么区别?
input.session()(时段): 是循环的。比如"0930-1600",它指的是每一天的 09:30 到 16:00。它没有“日期”的概念。input.time()(时间点): 是唯一的。比如"1 Feb 2022 12:00",它指的是有史以来唯一的那一个时刻。它包含了完整的“日期和时间”。- 做日内交易时段过滤,用
input.session()。 - 做回测窗口过滤(比如从2020年到2022年),用两个
input.time()。
实战代码示例
基础示例:在指定时间点绘制垂直线
我们来看如何在一个用户指定的时间点画一条线。
// 1. 创建
lineDate = input.time(timestamp("1 Feb 2022 12:00"), title="Line Location")
// 2. 执行一次绘图
if barstate.islastconfirmedhistory
line.new(x1=lineDate, y1=high, x2=lineDate, y2=low, extend=extend.both,
color=color.orange, width=2, xloc=xloc.bar_time)
line.new() 这个函数非常强大,它的 xloc=xloc.bar_time 模式允许 x1 和 x2 坐标直接使用时间戳。
lineDate 变量返回的正是毫秒时间戳,两者完美配合。当用户修改输入框里的时间时,lineDate 变量的值会更新,这条垂直线也会自动移动到新的位置。
进阶示例:为回测设置开始日期
我们来创建一个更专业的输入,用于定义回测的开始时间。
// 创建一个时间输入项
startDateTime = input.time(timestamp("1 Feb 2022 12:45"),
title="Start Date", group="Strategy Date Range",
tooltip="指定策略从哪个日期和时间开始" +
"模拟买卖交易。")
这个输入:
- 默认值为 2022年2月1日 12:45。
- 在设置面板上,它会出现在一个名为“Strategy Date Range”的分组下面。
- 当用户鼠标悬停时,会显示
tooltip里的详细说明。 - 在策略中,你就可以用
if time >= startDateTime来过滤交易信号了。
完整示例脚本:可设置起点的 VWAP
VWAP(成交量加权平均价)是一个典型的需要“计算起点”的指标。我们就用 input.time() 来让这个起点变得可配置。
//@version=6
indicator(title="Time input example", overlay=true)
// --- 1. 创建输入 ---
vwapStartDate = input.time(timestamp("1 Jan 2022"), title="VWAP Start Date")
vwapData = input.source(hlc3, title="VWAP Data Source")
// --- 2. 声明用于累加的持久性变量 ---
var sumPrices = 0.0
var sumVolume = 0.0
var powVolume = 0.0
// --- 3. 核心逻辑 ---
if time >= vwapStartDate
sumPrices += vwapData * volume
sumVolume += volume
powVolume += volume * math.pow(vwapData, 2) // 用于计算标准差
// --- 4. 计算 ---
vwapValue = sumVolume == 0 ? na : sumPrices / sumVolume
vwapVariance = sumVolume == 0 ? na : math.max(powVolume / sumVolume - math.pow(vwapValue, 2), 0)
vwapStdDev = math.sqrt(vwapVariance)
// --- 5. 绘制 ---
plot(vwapValue, color=color.blue, title="VWAP")
plot(vwapValue + vwapStdDev, color=color.orange, title="Upper Band")
plot(vwapValue - vwapStdDev, color=color.orange, title="Lower Band")
这个脚本的精髓在于 if time >= vwapStartDate 这一行。time 是 Pine Script 的内置变量,代表当前K线的开盘时间(也是一个毫秒时间戳)。
vwapStartDate 是我们输入框返回的毫秒时间戳,通过 if time >= vwapStartDate,我们就构建了一个完美的时间过滤器:只有当K线的时间晚于(或等于)我们设定的起始时间时,才开始执行累加计算。
总结
input.time() 函数是 Pine Script 中实现精确时间点控制的利器。
- 它必须和
timestamp()函数配合使用,才能设置一个易于阅读的默认值。 - 它返回的是一个毫秒时间戳,可以直接与
time变量进行>或<比较。 - 它的核心用途是定义回测窗口(通过两个
input.time())和设置计算起点(如 VWAP)。 - 切记: 它和
input.session()(循环日内时段)是两个完全不同的工具。


