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

Pine Script(111):判断分钟、小时与整小时时间周期

#Pine Script入门教学

判断脚本是否运行在纯分钟时间周期上

目前,Pine Script 还没有一个内置变量能直接告诉我们,代码当前是否运行在一个严格的“分钟”级别的时间周期上(即1到59分钟)。虽然有一个 timeframe.isminutes 变量,但它也会在小时图上返回 true——因为 TradingView 的小时图也是由分钟数据合成的。

然而,准确判断脚本是否运行在分钟图上非常有用。例如,我们可能有一个短线策略,希望它在分钟这样的小周期上使用更大的仓位;或者有一个指标,希望它在分钟图和小时图上使用不同的参数。因此,接下来就让我们用代码来实现这个判断。


自定义函数

要判断一个脚本是否运行在分钟图上,我们需要结合两个变量:

  1. timeframe.isminutes 变量必须为 true,表明该时间周期使用的是分钟数据。
  2. 并且 timeframe.multiplier 变量必须小于60。这样我们就能排除掉那些同样由分钟数据构成的小时图。

为了方便代码复用,我们将这两个变量组合成一个自定义函数。这个函数可以告诉我们脚本是否运行在分钟图上:

// 当脚本运行在分钟级别的时间周期上时,IsMinuteTF() 函数返回'true'。
// 对于秒级、1小时及以上的时间周期,它会返回'false'。
// 注意:该函数也适用于非标准图表(如砖块图和平均K线图)。
IsMinuteTF() =>
    timeframe.isminutes and timeframe.multiplier < 60

这个 IsMinuteTF() 自定义函数,对于分钟级别的时间周期(1分钟到59分钟)会返回 true,而在其他时间周期上则返回 false,这包括了秒级时间周期以及1小时和更高的周期。

在函数内部,我们比较了两个变量。第一个是 timeframe.isminutes,这个变量在所有由分钟数据构成的图表上都会返回 true。对于秒、日、周和月这些时间周期,该变量则返回 false

另一个变量是 timeframe.multiplier,它能让我们得到图表的时间周期数值。由于 TradingView 的小时图也是由分钟数据合成的,所以仅仅判断图表是否使用分钟数据是不够的。为了排除掉小时周期,时间周期的数值必须小于 (<) 60

我们通过 and 运算符将这两个表达式组合起来。这使得只有当时间周期使用了分钟数据,并且其周期数值小于60时,我们才会得到一个 true 值。当这两个条件不满足时,函数就会返回 false


函数特性

IsMinuteTF() 函数具有以下特性:

  • 该函数既适用于基于时间的图表,也适用于基于价格的图表。尽管后者(如砖块图、平均K线图等)没有明确的时间间隔,但 TradingView 在构建它们时,仍然会基于一个具有特定时间间隔的底层数据。这个底层数据的时间间隔,正是 timeframe.isminutestimeframe.multiplier 变量所检查的。
    • 对于平均K线图 (Heikin Ashi)砖块图 (Renko)折线图 (Line Break)卡吉图 (Kagi)点数图 (Point & Figure),该函数会基于图表的底层数据返回 truefalse。例如,在一张30分钟的平均K线图上,IsMinuteTF() 会返回 true
  • 等量图 (Range) 上,该函数返回的值总是 true。这是因为 TradingView 使用1分钟数据来构建所有的等量图。
  • IsMinuteTF() 不仅可以判断当前脚本是否运行在分钟图上,我们还可以将这个函数传递给 request.security() 函数。这样做可以让我们判断,在后台加载的那个数据是在何种时间周期上进行计算的。

函数应用示例

在我们将 IsMinuteTF() 函数复制粘贴到脚本代码中后,便可以通过多种方式来使用它。

场景一:判断是否为分钟图

要验证脚本当前是否运行在分钟图上,我们可以测试该函数是否返回 true。如果是,我们就可以(举例来说)创建一个文本标签来说明这是一个分钟图:

// 判断脚本是否运行在分钟周期的图表上
if IsMinuteTF()
    label.new(bar_index, high, text="This is a 1 to 59 minute chart!")

场景二:判断是否不是分钟图

另一种用法是,明确地测试图表不是一个分钟图。我们只需在函数前加上 not 逻辑运算符即可,就像这样:

// 测试脚本是否*没有*运行在分钟周期的图表上
if not IsMinuteTF()
    label.new(bar_index, high, text="This chart uses no minute data!")

除了 if 语句,我们也可以将该函数与 switch 语句和条件运算符 (?:) 结合使用,以及用在任何其他 Pine Script 接受布尔值的地方。

场景三:根据条件设置背景色

假设我们想在图表使用分钟数据时,为背景上色。为此,我们调用 bgcolor() 函数,然后在该函数内部,让条件运算符 (?:) 来评估 IsMinuteTF() 的返回值:

// 当图表使用分钟数据时,为背景上色
bgcolor(IsMinuteTF() ? color.new(color.teal, 90) : na)

完整示例脚本

让我们通过一个完整的脚本来看看如何应用 IsMinuteTF() 函数。下方的指标会创建一个文本标签,它能告诉我们当前图表是否使用了分钟数据。如果我们更改图表的时间周期,这个标签的内容也会随之改变。

该指标的完整代码如下:

//@version=5
indicator(title="Check for minute time frame", overlay=true)

// 当脚本运行在分钟级别的时间周期上时,IsMinuteTF() 函数返回'true'。
// 对于秒级、1小时及以上的时间周期,它会返回'false'。
// 注意:该函数也适用于非标准图表(如砖块图和平均K线图)。
IsMinuteTF() =>
    timeframe.isminutes and timeframe.multiplier < 60

// 创建一个标签,说明图表是否使用了分钟时间周期
if barstate.islastconfirmedhistory
    labelText = if IsMinuteTF()
        "This is a minute chart!"
    else
        "This isn't a minute chart"

    label.new(bar_index + 3, close, style=label.style_label_left,
         size=size.large, color=color.black, textcolor=color.white, 
         text=labelText)

代码解析

我们首先调用 indicator() 函数,这会为脚本命名并将其叠加在主图上。

然后,我们包含了 IsMinuteTF() 自定义函数。

接下来,一个 if 语句评估 barstate.islastconfirmedhistory 变量。该变量只在图表的最后一根已确认的历史K线上才为 true,这是一个确保 if 语句内的代码只执行一次的便捷方法。这个代码块做了两件事:

首先,它创建了 labelText 变量。一个 if/else 语句用于设定这个变量的值。它判断的条件就是 IsMinuteTF() 函数。当该函数返回 true 时,变量的值会变成一段说明脚本运行在分钟图上的字符串;当函数返回 false 时,字符串的内容则会说明相反的情况。

然后,label.new() 函数创建一个文本标签。这个标签会显示在未来三根K线的位置 (bar_index + 3),价格坐标则与收盘价 (close) 对齐。它的样式使其箭头指向左边 (label.style_label_left),背景为黑色 (color.black),文字为白色 (color.white),并使用了大号字体 (size.large)。我们使用 labelText 变量来设置标签的文本。

让我们看看脚本的实际效果。在一个分钟级别的时间周期上,该指标会识别出这个图表周期:

当脚本运行在一个不同于1至59分钟的时间周期上时,标签也能正确地识别出这一点:


内容总结

我们通过两个 Pine Script 变量来判断一个脚本是否运行在分钟图(1至59分钟)上:

  1. timeframe.isminutes 变量:告诉我们图表是否使用分钟数据。这包括了分钟时间周期,但也包括了小时时间周期。
  2. timeframe.multiplier 变量:获取图表的时间周期数值。这是我们用来区分分钟和小时时间周期的关键。

判断脚本是否运行在小时级时间周期上

目前,Pine Script 还没有一个内置变量能直接告诉我们,代码当前是否运行在一个小时级别的时间周期上。但在多种场景下,获取这个信息会非常有帮助。

例如,我们可能有一个日内策略,它在小时间周期上表现不佳;或者我们想在小时图和分钟图上使用不同的参数;又或者我们有些计算逻辑依赖于每根K线必须代表特定的小时数。

因此,接下来就让我们编写一段自定义的 Pine Script 代码,来判断当前是否为小时图。


自定义函数

要判断一个脚本是否使用小时级别的时间周期,我们需要结合两个时间周期变量:

  1. timeframe.isminutes 变量必须为 true。TradingView 使用分钟数据来构建小时图,所以如果一个图表不使用分钟数据,它就不可能是小时图。
  2. 并且 timeframe.multiplier 变量的数值需要大于或等于60。因为小时图是由分钟构成的,所以它们的周期数值必须至少是60。

为了方便代码复用,下面的这个自定义函数结合了这两个变量,用以识别小时级别的时间周期:

// IsHourlyTF() 函数用于判断脚本是否运行在小时级别的时间周期上
// (即 >= 60分钟且低于1天)。如果是,则返回'true',否则返回'false'。
// 注意:该函数适用于所有图表类型,包括基于价格的图表。
IsHourlyTF() =>
	timeframe.isminutes and timeframe.multiplier >= 60

IsHourlyTF() 函数对于1小时及以上(但低于天)的时间周期会返回 true。这包括了3小时、12小时,也包括了像1:30(90分钟)和2:20(140分钟)这样的非标准小时周期。而在分钟级别以及日线和更高的时间周期上,该函数则会返回 false

函数的代码首先检查 timeframe.isminutes。这个变量在所有由分钟数据构成的时间周期上都会返回 true。而在秒、日、周和月这些时间周期上,它会返回 false

接着,我们检查 timeframe.multiplier,它会返回时间周期的数值。对于由分钟数据构成的小时图,这个周期数值必须大于或等于 (>=) 60

我们使用 and 运算符将这两个表达式组合起来。这使得只有当图表使用了分钟数据,并且其周期数值大于或等于60时,我们才会得到一个 true 值。如果这两个条件不满足,该自定义函数则会返回 false


函数特性

IsHourlyTF() 函数具有以下几个值得了解的特性:

  • 该函数同样适用于基于价格的图表。虽然这些图表(如平均K线图、砖块图等)的K线没有固定的时间间隔,但 TradingView 在构建它们时,仍然会基于一个具有特定时间间隔的底层数据。这个底层数据的时间间隔,正是 timeframe.isminutestimeframe.multiplier 变量所检查的。
    • 因此,对于平均K线图 (Heikin Ashi)砖块图 (Renko)折线图 (Line Break)卡吉图 (Kagi)点数图 (Point & Figure),该函数会基于其图表的底层数据来返回 truefalse
  • 等量图 (Range) 上,该函数总是返回 false。这是因为无论我们如何配置,TradingView 都是使用1分钟数据来构建等量图的,所以它们不可能使用到小时数据。
  • IsHourlyTF() 不仅可以判断当前脚本是否运行在小时图上,我们还可以将这个函数传递给 request.security() 函数。这样做可以让我们判断,在后台加载的那个数据是在何种时间周期上进行计算的。

函数应用示例

在我们将 IsHourlyTF() 函数复制粘贴到脚本代码中后,便可以通过多种方式来使用它。接下来看几个例子。

场景一:判断是否为小时图

要测试脚本当前是否运行在小时图上,我们可以评估该函数是否返回 true。如果是,我们就可以(举例来说)创建一个文本标签:

// 判断脚本是否运行在小时级别的时间周期上
if IsHourlyTF()
	label.new(bar_index, high, text="This is an hourly chart!")

场景二:判断是否不是小时图

另一个选项是,测试图表不是一个小时时间周期。为此,我们只需在函数前加上 not 运算符即可。例如:

// 验证代码没有运行在基于小时的时间周期上
if not IsHourlyTF()
	label.new(bar_index, close, text="This chart doesn't use hourly data")

除了 if 语句,该函数也适用于 switch 语句和条件运算符 (?:)。实际上,我们可以在任何 Pine Script 接受布尔值的地方使用它。

场景三:根据条件设置背景色

假设我们想为小时图设置一个特定的背景颜色。我们可以调用 bgcolor() 函数,然后在该函数内部,让条件运算符 (?:) 来评估 IsHourlyTF() 函数的返回值,就像这样:

// 将小时图的背景设为橘色,其他时间周期则使用蓝色。
bgcolor(IsHourlyTF() ? color.new(color.orange, 90) :
	 color.new(color.blue, 85))

完整示例脚本

让我们通过一个完整的脚本来看看如何应用 IsHourlyTF() 函数。下方的指标会绘制一个文本标签,用以说明当前图表是否使用了小时级别的时间周期。当我们更改图表的时间周期时,这个标签的内容也会随之改变。

该指标的完整代码如下:

//@version=5
indicator(title="Hourly time frame", overlay=true)

// IsHourlyTF() 函数用于判断脚本是否运行在小时级别的时间周期上
// (即 >= 60分钟且低于1天)。如果是,则返回'true',否则返回'false'。
// 注意:该函数适用于所有图表类型,包括基于价格的图表。
IsHourlyTF() =>
	timeframe.isminutes and timeframe.multiplier >= 60

// 在最后一根已确认的历史K线上,显示图表是否使用了
// 小时级别的时间周期
if barstate.islastconfirmedhistory
    labelText = if IsHourlyTF()
        "This chart uses an\nhourly time frame!"
    else
        "This chart's is below 1 hour\nor 1 day and higher"

    label.new(bar_index + 2, hl2, style=label.style_label_lower_left,
         color=#D0F0C0, size=size.large, text=labelText)

代码解析

我们首先调用 indicator() 函数,这会为脚本命名,并将其叠加在主图的交易品种上。

然后,我们包含了上文讨论过的 IsHourlyTF() 自定义函数。

接下来,一个 if 语句评估 barstate.islastconfirmedhistory 变量。该变量只在图表的最后一根已确认的历史K线上才为 true。这个检查确保了 if 语句内的代码只执行一次,而不是在每根K线上都重复执行。这个代码块做了两件事:

首先,一个 if/else 语句用于决定标签的文本内容。我们判断的条件就是 IsHourlyTF() 函数。当该函数返回 true 时,文本会说明图表使用的是小时周期;否则,else 部分的代码会告诉我们时间周期是其他类型。我们将选定的文本存入 labelText 变量,以备后用。

然后,label.new() 函数创建标签本身。这个绘图对象会显示在未来两根K线的位置 (bar_index + 2),其价格坐标则位于K线的中点 (hl2)。它的样式使其箭头指向左下方 (label.style_label_lower_left)。标签的背景色是 #D0F0C0,即茶绿色的十六进制颜色代码。对于文本,我们使用 labelText 变量,并以大号字体 (size.large) 显示。

让我们看看脚本在图表上的实际效果。在一个小时图上,该指标会识别出这个时间周期:

如果我们把图表切换到一个1小时以上的时间周期,该指标也会如实地告诉我们:


内容总结

我们通过两个 Pine Script 变量来判断脚本是否使用小时级别的时间周期:

  1. timeframe.isminutes 变量:说明时间周期是否使用分钟数据。这是必需的,因为 TradingView 使用分钟数据来构建小时图。
  2. timeframe.multiplier 变量:其值必须大于或等于60。这是我们用来区分分钟图和小时图的关键。

判断脚本是否运行在整小时时间周期上

目前,Pine Script 还没有一个内置变量能直接告诉我们,脚本当前是否运行在一个整点小时级别的时间周期上,例如1小时、2小时、3小时、4小时等等。

然而,获取这个信息在多种场景下会非常有帮助。例如,脚本的分析逻辑可能依赖于小时K线之间的时间关系;或者我们想在整点小时图上,使用与日线或更高周期图表上不同的参数(比如移动平均线长度)。

因此,接下来就让我们编写一段自定义的 Pine Script 代码,来判断当前是否为整点小时图。


自定义函数

要判断一个脚本是否运行在整点小时图上,我们需要结合两个时间周期变量:

  1. 首先,timeframe.isminutes 变量必须为 true。这是因为 TradingView 使用分钟数据来构建小时图,所以如果一个图表不使用分钟数据,它就不可能是小时图。
  2. 其次,timeframe.multiplier 变量必须是60的整数倍。这个变量返回图表的时间周期数值。如果它的值不是60、120、180、240、300等(以分钟为单位),那么该图表就不是一个整点小时图。

为了方便代码复用,下面的这个自定义函数结合了这两个变量,用以识别整点小时级别的时间周期:

// IsFullHourTF() 函数用于判断脚本的当前时间周期是否为
// 整点小时(1H, 2H, 3H, 4H等)。如果是,则返回'true',否则返回'false'。
// 注意:该函数适用于所有图表类型,包括基于价格的图表。
IsFullHourTF() =>
	timeframe.isminutes and timeframe.multiplier % 60 == 0

这个 IsFullHourTF() 自定义函数,对于整点小时的时间周期会返回 true。而对于非整点小时(如2小时30分、1小时45分)、低于1小时以及日线或更高的时间周期,它则会返回 false

函数的代码结合了两个表达式。首先是 timeframe.isminutes,这个变量在由分钟数据构成的时间周期上会返回 true

然而,并非所有基于分钟数据的时间周期都是整点小时,这就需要用到第二部分的代码。timeframe.multiplier 变量能获取时间周期的数值,例如30分钟图对应 30,2小时图对应 120

由于我们寻找的是整点小时,我们使用模数运算符 (%) 来测试 timeframe.multiplier 是否能被 60 整除。也就是说,用该变量的值除以 60 后的余数是否为零 (0)。如果是,那么该时间周期就是60的整数倍,这包括了60、120、180分钟,但排除了10、145、181分钟这样的时间周期。

当我们使用 and 运算符,将“图表使用分钟数据” (timeframe.isminutes) 和“其周期是60的倍数” (timeframe.multiplier % 60 == 0) 这两个条件组合起来时,就能准确判断出当前图表是否为整点小时图。此时,IsFullHourTF() 函数返回 true,否则返回 false


函数特性

IsFullHourTF() 函数具有以下几个值得了解的特性:

  • 该函数同样适用于基于价格的图表(如平均K线图、砖块图等)。这是因为 TradingView 在构建它们时,仍然会基于一个具有特定时间间隔的底层数据,而这个底层数据的时间间隔,正是 timeframe.isminutestimeframe.multiplier 变量所检查的。
  • 等量图 (Range) 上,该函数总是返回 false。因为 TradingView 使用1分钟数据来构建所有的等量图,所以其周期不可能是一个整点小时。
  • 当我们将这个自定义函数传递给 Pine Script 的 request.security() 函数时,可以判断在后台加载的那个数据是否在整点小时图上进行计算。

函数应用示例

在我们将上述函数复制粘贴到脚本中后,便可以通过多种方式来使用它。

场景一:判断是否为整点小时图

我们可以测试 IsFullHourTF() 是否返回 true 来判断图表是否为整点小时图,如果是,就可以创建一个文本标签来显示这个信息:

// 评估图表是否使用了整点小时时间周期
if IsFullHourTF()
	label.new(bar_index, high, text="Chart is a full hour time frame!")

场景二:判断是否不是整点小时图

反之,要明确测试时间周期不是整点小时,我们可以在函数前加上 not 逻辑运算符。它会反转函数的布尔结果:

// 测试图表是否没有使用整点小时时间周期
if not IsFullHourTF()
	label.new(bar_index, high, text="This isn't a full hour chart!")

当然,我们也可以将 IsFullHourTF() 用于 switch 语句或条件运算符 (?:)

场景三:根据条件设置背景色

假设我们想在时间周期是整点小时的时候,为图表背景上色。我们可以这样使用 bgcolor() 函数:

// 为整点小时图的背景上色
bgcolor(IsFullHourTF() ? color.new(color.teal, 85) : na)

完整示例脚本

让我们通过一个完整的脚本来看看如何应用 IsFullHourTF() 函数。下方的指标会绘制一个文本框,用以说明当前图表是否使用了整点小时的时间周期。当我们更改图表的时间周期时,这个文本框的内容也会随之改变。

该指标的完整代码如下:

//@version=5
indicator(title="Full hour time frame check", overlay=true)

// IsFullHourTF() 函数用于判断脚本的当前时间周期是否为
// 整点小时(1H, 2H, 3H, 4H等)。如果是,则返回'true',否则返回'false'。
// 注意:该函数适用于所有图表类型,包括基于价格的图表。
IsFullHourTF() =>
	timeframe.isminutes and timeframe.multiplier % 60 == 0

// 在最后一根已确认的历史K线上,测试图表是否使用了整点小时
// 时间周期,并在一个文本框中显示这个结果。
if barstate.islastconfirmedhistory
    boxText = if IsFullHourTF()
        "This chart uses a\nfull hour time frame"
    else
        "This chart doesn't\nuse an even\nhourly time frame"

    box.new(bar_index + 3, close * 1.03, bar_index + 23, close * 0.97, 
         bgcolor=#FFE4C4, border_color=color.orange, text=boxText)

我们首先调用 indicator() 函数,这会为脚本命名并将其叠加在主图的交易品种上。

然后,我们包含了上文讨论过的 IsFullHourTF() 自定义函数。

接下来,一个 if 语句评估 barstate.islastconfirmedhistory 变量。该变量只在图表的最后一根已确认的历史K线上才为 true。这个检查确保了 if 语句内的代码只执行一次,而不是在每根K线上都重复执行。这个代码块做了两件事:

首先,一个 if/else 语句用于决定文本框的显示内容。我们判断的条件就是 IsFullHourTF() 函数。当该自定义函数返回 true 时,我们将 boxText 变量设为一个说明图表使用整点小时周期的文本。否则,else 部分的代码会告诉我们图表没有使用整点小时周期。

然后,box.new() 函数创建了实际的文本框。它的左上角坐标被设在未来3根K线、比当前收盘价高3%的位置 (bar_index + 3, close * 1.03)。右下角坐标则在再往后20根K线、比收盘价低3%的位置 (bar_index + 23, close * 0.97)。

文本框的背景色是 #FFE4C4,即 bisque(一种淡橙色)的十六进制颜色代码,其边框则是常规的橘色 (color.orange)。对于文本框的内容,我们使用了刚才创建的 boxText 变量。

当该指标在一个整点小时图(例如3小时图)上运行时,它的显示效果如下:

在一个非整点的小时图上,例如1小时45分钟(105分钟)图,该指标的文本框显示如下:


内容总结

要判断一个时间周期是否为整点小时(1小时、2小时、3小时等),我们需要满足两个条件:

  1. timeframe.isminutes 变量必须为 true,因为 TradingView 使用分钟数据来构建小时图。
  2. 并且,timeframe.multiplier 变量的数值需要是 60 的整数倍。我们通过模数运算符 (%) 来进行这个判断。
赞(0)
未经允许不得转载:图道交易 » Pine Script(111):判断分钟、小时与整小时时间周期
分享到

评论 抢沙发

登录

找回密码

注册