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

Pine Script(92):熟悉input.timeframe,在1小时加载日线级均线

#Pine Script入门教学

在Pine Script的输入功能中,input.timeframe() 是实现多时间周期分析的核心工具。

它能为你的脚本设置面板,添加一个时间周期下拉菜单。

它的实战用途非常明确和强大,加载高周期数据是它最核心的用途。

比如你可以在1小时图表上,通过输入框选择日线,然后配合 request.security() 函数,加载并显示一条日线级别的EMA,这就是看长做短的实现基础。

你也可以用它来判断一个新周期的K线是否刚刚开始,比如新的一天或新的一周。

input.timeframe() 有两种形态:一种是显示默认周期的标准菜单;另一种是使用 options 参数,提供一个你自定义的周期列表,比如只允许选择 “60”, “240”, “D”。

input.timeframe() 的参数和其他输入函数类似,我帮你按实战重要性分了组:

1. 核心参数 (必用)
  • defval:(必填) 默认的时间周期字符串。你必须从一个固定的列表中选择,否则会出错。我们马上会讲。
  • title:(强烈建议) 输入项的名称,即显示在设置面板上的标签,如 "更高时间周期"
2. 特殊形态 (自定义菜单)
  • options:提供一个固定的时间周期字符串列表,用方括号括起来,如 ["60", "120", "240", "D"]。一旦使用 options,下拉菜单就只会显示这几个选项。
3. 布局与提示 (提升专业度)
  • tooltip:鼠标悬停在“i”图标上时,显示的详细帮助文本。
  • group:分组标题,用于组织多个相关的输入项。
  • inline:内联ID,用于将多个输入项显示在同一行。

所有这些参数(如 defval, title 等)的值,都必须是常量,不能是动态的变量。

defval 的固定菜单与返回值

这是 input.timeframe() 最重要的一个特性。

如果你不使用 options 自定义列表,那么 defval 必须是TV预设的标准值之一。

同时这个列表也告诉你:当用户在下拉菜单中选择一个易读的名称时,你的代码(input.timeframe() 函数)实际返回的是哪个字符串。

下拉菜单显示值 你的代码 defval 和返回值
Chart "" (空字符串)
1 minute "1"
3 minutes "3"
5 minutes "5"
15 minutes "15"
30 minutes "30"
45 minutes "45"
1 hour "60"
2 hours "120"
3 hours "180"
4 hours "240"
1 day "D"
1 week "W"
1 month "M"

避坑指南:

默认值陷阱,如果你设置的 defval不在这个标准列表里,也不在你自己收藏的周期列表里,那么输入框会自动默认为 "Chart",即空字符串,这可能会让你的逻辑失效。

为了让你的脚本能在所有人的电脑上正常工作,defval 最好只使用上表中的标准值,而不要用你个人收藏的特殊周期。

实战代码示例

基础示例:监控新周期的开始

我们先来看一个简单用法,用 input.timeframe() 来高亮显示新周期的K线。

// 1. 创建输入框,默认为 240
timeFrameTest = input.timeframe("240", title="Time Frame")

// 2. 检查K线是否为新周期的第一根
newPeriodStart = ta.change(time(timeFrameTest)) != 0

// 3. 应用
bgcolor(newPeriodStart ? color.new(color.orange, 80) : na)

这段代码会把每根4小时K线的第一根,比如1小时图上的 9:00, 13:00, 17:00,K线都涂上背景色,非常适合用于视觉定位。

进阶示例:带分组和提示的输入
// 创建一个输入项
otherTimeFrame = input.timeframe("D", title="Other Time Frame",
     tooltip="指定脚本需要额外计算的附加时间周期。",
     group="Additional Time Frames")

这个输入:默认值为 "D"(日线)。

在设置面板上,它会出现在一个名为“Additional Time Frames”的分组下面。

当用户鼠标悬停时,会显示 tooltip 里的详细说明。

避坑指南:input.timeframe() vs timeframe

这是新手必问的问题:input.timeframe("D") 和在 indicator() 函数里写 timeframe="D" 有什么区别?

indicator(..., timeframe="D"): 这是全局设置,它会强制你的整个脚本都运行在日线周期上,无论你当前打开的是什么图表,你的1小时图会变得惨不忍睹。

input.timeframe("D"): 这是局部输入。它本身什么也不做,只是返回一个字符串 "D",它的目的是把这个 "D" 传递给 request.security() 函数,让你可以在当前图表(如1小时)上,额外加载日线周期的计算结果。

完整示例脚本:加载高周期均线

这才是 input.timeframe() 的用法——为 request.security() 提供周期参数,实现多时间周期分析。

//@version=6
indicator(title="Time frame input example", overlay=true)

// --- 0. 定义加载函数 ---
BackgroundData(symbol, timeframe, data) =>
    isLive = barstate.isrealtime
    request.security(symbol, timeframe, data[isLive ? 1 : 0])[isLive ? 0 : 1]

// --- 1. 创建输入 ---
higherTimeFrame = input.timeframe("D", title="Higher Time Frame")
fastAvgLength   = input.int(20, title="Fast Average Length")
slowAvgLength   = input.int(60, title="Slow Average Length")

// --- 2. 计算均线 ---
fastAverage = BackgroundData(syminfo.tickerid, higherTimeFrame,
     ta.ema(close, fastAvgLength))
slowAverage = BackgroundData(syminfo.tickerid, higherTimeFrame,
     ta.ema(close, slowAvgLength))

// --- 3. 绘制 ---
plot(fastAverage, color=color.purple, linewidth=2, title="Fast EMA (HTF)")
plot(slowAverage, color=color.teal, linewidth=2, title="Slow EMA (HTF)")

下面拆解这段专业代码:

higherTimeFrame 变量: 它从 input.timeframe() 接收了用户选择的周期(默认为 "D")。

BackgroundData() 函数: 这是一个处理 request.security() 重绘(Repainting)问题的专业模式。它通过 barstate.isrealtime 判断,在历史回测和实时交易中采用不同的数据索引,确保你看到的数据是已确认的。

计算: fastAverage 的计算被 BackgroundData 包裹,并把 higherTimeFrame 变量传了进去。这意味着 ta.ema(close, fastAvgLength) 这个计算,是在 higherTimeFrame(日线)周期上完成的,然后才把结果带回到你当前的图表上。

总结

input.timeframe() 函数是 Pine Script 中实现多时间周期分析的钥匙,它本身只返回一个时间周期字符串(如 "D""60")。它必须和 request.security() 函数配合,才能真正加载高周期的数据,是构建看长做短交易系统的必备工具。

赞(0)
未经允许不得转载:图道交易 » Pine Script(92):熟悉input.timeframe,在1小时加载日线级均线
分享到

评论 抢沙发

登录

找回密码

注册