保持敬畏之心
交易是一场持久战

Pine Script(93):input.time()函数详解,从时间戳到精准回测窗口

#Pine Script入门教学

在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 模式允许 x1x2 坐标直接使用时间戳。

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()(循环日内时段)是两个完全不同的工具。
赞(0)
未经允许不得转载:图道交易 » Pine Script(93):input.time()函数详解,从时间戳到精准回测窗口
分享到

评论 抢沙发

登录

找回密码

注册