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

Pine Script(114):timeframe.isintraday与isdwm,显示图表日期范围

#Pine Script入门教学

timeframe.isintraday:判断是否为日内时间周期

Pine Script 的 timeframe.isintraday 变量,可以告诉我们一个指标或策略当前是否运行在一个日内时间周期上。

该变量会返回以下两个值之一:

  • true:当脚本运行在日内时间周期上时。这包括了分钟小时级别的时间周期,同时也包括等量图 (range charts),因为 TradingView 是使用分钟数据来构建等量图的。
  • false:当脚本运行在高于日内的时间周期上时。这指的是日线周线月线级别的图表。

timeframe.isintraday 在不同时间周期上的返回值

timeframe.isintraday 的值取决于图表的时间周期。下表展示了该变量针对不同 TradingView 时间周期的返回值:

图表时间周期 timeframe.isintraday 返回值
1 秒 true
5 秒 true
15 秒 true
30 秒 true
1 分钟 true
3 分钟 true
5 分钟 true
15 分钟 true
30 分钟 true
45 分钟 true
1 小时 true
2 小时 true
3 小时 true
4 小时 true
1 日 false
5 日 false
1 周 false
1 月 false
1 季度 (3 个月) false
1 年 (12 个月) false
10 等量图 (Ranges) true
100 等量图 (Ranges) true

timeframe.isintraday 的通用性

timeframe.isintraday 变量只告诉我们脚本是否运行在日内图上,但它并不会具体说明图表使用的是哪种日内数据(分钟或秒)。要做到这一点,需要使用其他更具体的时间周期变量

那些更专门的变量是:

  • timeframe.isminutes 变量:判断脚本是否运行在基于分钟的数据上(这包括了等量图、分钟图和小时图)。
  • timeframe.isseconds 变量:判断脚本是否运行在秒级的分辨率上。

事实上,timeframe.isintraday 的值就是上述两个变量的组合。在 Pine Script 中,我们可以这样来表达它们之间的关系:

timeframe.isintraday = timeframe.isseconds or timeframe.isminutes


依赖于时间间隔,而非图表类型

timeframe.isintraday 的值依赖于图表的时间间隔。也就是说,是底层数据的时间周期决定了图表是否为日内图。

实际的图表类型timeframe.isintraday 的值没有影响。即便是像砖块图 (Renko) 或平均K线图 (Heikin Ashi) 这样的特殊图表类型,其K线仍然是由分钟或秒级别的数据构建的。

因此,K线在图表上如何呈现,并不会改变 timeframe.isintraday 的值。无论是在棒图、K线图、平均K线图、砖块图、折线图、卡吉图还是点数图上,timeframe.isintraday 变量都会如上表所示,返回 truefalse

timeframe.isdwm 的反义

timeframe.isintradaytimeframe.isdwm 变量在逻辑上是完全相反的,后者用于检查脚本是否运行在日线、周线或月线时间周期上。

因此,当 timeframe.isintradaytrue 时,timeframe.isdwm 必定为 false。反之亦然:当 timeframe.isintradayfalse 时,timeframe.isdwm 必定为 true

这之所以行得通,是因为 TradingView 将时间周期分为两大类:日内周期 vs 日线及以上周期。任何图表总是属于这两者之一。所以,当一个图表不是日线或更高周期图时,它必定是一个日内图(反之亦然)。

我们可以用下面的 Pine Script 代码来表达这种关系:

timeframe.isintraday = not timeframe.isdwm


与其他时间周期变量的比较

Pine Script 提供了其他几个时间周期变量。当我们的脚本运行在一个日内图上时,其他变量的返回值如下:

变量 timeframe.isintradaytrue
timeframe.ismonthly 总是 false
timeframe.isweekly 总是 false
timeframe.isdaily 总是 false
timeframe.isminutes 可能true,也可能false
timeframe.isseconds 可能true,也可能false
timeframe.isdwm 总是 false

完整示例指标

让我们通过一个完整的脚本来看看如何应用 timeframe.isintraday 变量。下方的指标会通过一个文本标签,显示关于日内时间周期的信息:

//@version=5
indicator(title="Intra-day time frame example", overlay=true)

// 在最后一根已确认的历史K线上,判断图表使用了
// 何种类型的时间周期
if barstate.islastconfirmedhistory
    // 判断要在标签中显示的文本
    labelText = if timeframe.isintraday
        "This is an\nintra-day chart!"
    else
        "This chart uses\na daily, weekly, or\nmonthly time frame"

    // 如果是日内时间周期,则进一步判断其具体分辨率
    if timeframe.isintraday
        if timeframe.isseconds
            labelText += "\n\n(It's a seconds time\nframe, to be precise.)"
        else if timeframe.isminutes
            labelText += "\n\n(It's a minutes time\nframe, to be precise.)"

    labelText += "\n\nChart period:\n" + timeframe.period

    // 创建实际的标签
    label.new(x=bar_index + 2, y=hl2, style=label.style_label_left,
         color=color.new(color.purple, 70), textcolor=color.black,
         size=size.large, text=labelText)

代码解析

这个指标首先使用 indicator() 函数来定义其设置。这行代码为脚本命名,并将其叠加显示在主图的交易品种上。

然后,一个 if 语句检查 barstate.islastconfirmedhistory 变量。在图表的最后一根历史K线上,该变量为 true。由于每张图表只有一根这样的K线,使用这个条件可以确保我们的 if 代码块只执行一次(这样我们就不会在图表上重复创建相同的标签)。

在这个 if 语句内部,我们做了两件事:决定标签的文本内容,以及创建标签本身。我们首先来构建标签的文本:

// 判断要在标签中显示的文本
labelText = if timeframe.isintraday
	"This is an\nintra-day chart!"
else
	"This chart uses\na daily, weekly, or\nmonthly time frame"

// 如果是日内时间周期,则进一步判断其具体分辨率
if timeframe.isintraday
	if timeframe.isseconds
		labelText += "\n\n(It's a seconds time\nframe, to be precise.)"
	else if timeframe.isminutes
		labelText += "\n\n(It's a minutes time\nframe, to be precise.)"

labelText += "\n\nChart period:\n" + timeframe.period

我们首先创建了 labelText 变量。通过一个 if/else 语句判断 timeframe.isintraday 变量,来为它设定初始值。if 部分的代码将变量更新为“这是一个日内图!”,而 else 部分则说明时间周期是日线、周线或月线。

到这里,我们只知道脚本是否运行在日内图上,但这还不够具体。所以,另一个 if 语句再次检查 timeframe.isintraday。当该变量为 true 时,我们就为 labelText 变量追加更精确的信息。

为此,我们使用了一个级联的 if 语句,它会依次评估当前是否为秒级 (timeframe.isseconds) 或分钟级 (timeframe.isminutes) 的时间周期。当其中一个测试为 true 时,我们便使用加法赋值运算符 (+=),向 labelText 变量添加一段文本,用以说明脚本所使用的具体时间周期类型。

我们最后添加到 labelText 的,是该时间周期的具体周期数值,我们通过 timeframe.period 变量来获取。这样,我们就能(举例来说)看到图表的分辨率是30分钟还是15秒了。

最后,我们使用 label.new() 函数来创建真正的文本标签:

// 创建实际的标签
label.new(x=bar_index + 2, y=hl2, style=label.style_label_left,
	 color=color.new(color.purple, 70), textcolor=color.black,
	 size=size.large, text=labelText)

这个标签被显示在K线的中点 (hl2) 处,并向右移动两根K线 (bar_index + 2) 的位置。它的箭头指向左边 (label.style_label_left),并拥有一个紫色 (color.purple) 的背景,通过 color.new() 函数设置了70%的透明度。标签的文字以黑色 (color.black) 和大号字体 (size.large) 显示。对于标签的文本,我们使用了 labelText 变量。

让我们看看脚本在图表上的效果。当我们将它添加到一个3小时的以太坊 (ETH/USD) 图表上时,标签会告诉我们这是一个日内时间周期,其周期为180(即180分钟,也就是3小时):

在一个高于日内的时间周期上,该脚本会告诉我们图表使用的是日线、周线或月线时间周期。例如,在这张3日图上:

如何应用 timeframe.isintraday

有以下几种方式可以应用 timeframe.isintraday 变量:

  • 为不同周期使用不同参数。例如,在日内图上我们可能想使用一个更长的随机指标周期,而在大周期上则使用一个较短的周期。
  • 在日内图上使用时段过滤器。由于日线及以上的K线没有小时的概念,所以使用自定义时段来过滤信号只可能在日内图上实现。
  • 根据时间周期改变计算逻辑。例如,在日内图上,我们可能希望使用比日线(及以上)图表更窄的止损。
  • 检查脚本是否运行在合适的周期上。例如,如果我们编写的是一个长线策略,我们可能不希望它在日内时间周期上生成低价值的信号。

一个需要处理时间周期信息的脚本,通常会用到不止一个时间周期变量。这使得我们可以进行更精确的判断,例如,针对分钟小时这几种不同的时间周期,实现特定的脚本行为。


timeframe.isintraday 的特性

  • timeframe.isintraday 只说明了时间周期的类型(是否为日内),但它并不会告诉我们该时间周期的具体数值(时间间隔)。要获取后者,我们需要使用 timeframe.multipliertimeframe.period 变量。
  • 虽然我们可以对 timeframe.isintraday 使用历史引用运算符 ([]),但这没有什么意义,因为该变量在每一根K线上的返回值都是相同的。
  • 每一个 TradingView 指标或策略都可以使用 timeframe.isintraday。并且,这个变量在任何时间周期和图表类型上都可用。
  • 在 Pine Script 的第3版及更早版本中,timeframe.isintraday 变量曾被命名为 isintraday

内容总结

  • 如果脚本运行在一个等量图、秒、分钟或小时时间周期上,timeframe.isintraday 变量就会返回 true。这些是 TradingView 的日内时间周期。
  • 当脚本运行在一个1天及更高的时间周期上时(即日线、周线和月线),timeframe.isintraday 则为 false
  • timeframe.isintraday 的判断结果独立于图表类型。它在像卡吉图 (Kagi)折线图 (Line Break) 这样不常见的图表上,也同样以相同的方式工作。

timeframe.isdwm:判断是否为日线、周线或月线周期

Pine Script 的 timeframe.isdwm 变量,可以告诉我们一个指标或策略当前是否运行在一个日线 (Daily)、周线 (Weekly) 或月线 (Monthly) 时间周期上。

该变量会返回以下两个值之一:

  • true:当脚本在一个日线、周线或月线时间周期上计算时。
  • false:当脚本运行在一个不同的时间周期上时,即所有的日内时间周期

timeframe.isdwm 在不同时间周期上的返回值

timeframe.isdwm 返回的值取决于图表的时间周期。下表展示了该变量针对不同 TradingView 时间周期的返回值:

图表时间周期 timeframe.isdwm 返回值
1 秒 false
5 秒 false
15 秒 false
30 秒 false
1 分钟 false
3 分钟 false
5 分钟 false
15 分钟 false
30 分钟 false
45 分钟 false
1 小时 false
2 小时 false
3 小时 false
4 小时 false
1 日 true
5 日 true
1 周 true
1 月 true
1 季度 (3 个月) true
1 年 (12 个月) true
10 等量图 (Ranges) false
100 等量图 (Ranges) false

timeframe.isdwm 的通用性

timeframe.isdwm 变量为 true 时,我们只知道脚本运行在日线、周线或月线这三种时间周期之一,但无法确定具体是哪一种。要做到这一点,需要使用其他更具体的时间周期变量

这些更专门的变量是:

  • timeframe.isdaily 变量:判断脚本是否运行在日线图上。
  • timeframe.isweekly 变量:判断脚本是否在周线数据上执行。
  • timeframe.ismonthly 变量:判断脚本是否在一个月线分辨率的K线上运行。

事实上,timeframe.isdwm 的值就是上述三个变量的组合。在 Pine Script 代码中,我们可以这样来表达它们之间的关系:

timeframe.isdwm = timeframe.isdaily or timeframe.isweekly or timeframe.ismonthly


依赖于时间间隔,而非图表类型

图表的时间间隔决定了 timeframe.isdwm 的值。当K线是由日线、周线或月线数据构成时,timeframe.isdwm 就为 true

但图表的样式timeframe.isdwm 无关。即便是像折线图 (Line Break) 这样不常见的图表样式,其K线仍然是由日线、周线或月线数据构建的。

因此,对于 timeframe.isdwm 而言,K线在图表上如何呈现并不重要。无论是在棒图、K线图、平均K线图、砖块图、折线图、卡吉图还是点数图上,timeframe.isdwm 变量都会如上表所示,返回 truefalse


timeframe.isintraday 的反义

timeframe.isdwmtimeframe.isintraday 变量在逻辑上是完全相反的,后者用于检查脚本是否运行在日内时间周期上。

这意味着,当 timeframe.isdwmtrue 时,timeframe.isintraday 必定为 false。反之亦然:当 timeframe.isdwmfalse 时,timeframe.isintraday 必定为 true

这是因为 TradingView 将时间周期分为两大类:日内周期 vs 日线及以上周期。任何图表总是属于这两者之一。所以,如果一个图表不是日内图,它必定是一个日线或更高周期图(反之亦然)。

在 Pine Script 代码层面,我们可以这样说:

timeframe.isdwm = not timeframe.isintraday


与其他时间周期变量的比较

Pine Script 提供了其他几个时间周期变量。当我们的脚本运行在一个日线、周线或月线时间周期上时,这些其他变量的返回值如下:

变量 timeframe.isdwmtrue
timeframe.ismonthly 可能true,也可能false
timeframe.isweekly 可能true,也可能false
timeframe.isdaily 可能true,也可能false
timeframe.isminutes 总是 false
timeframe.isseconds 总是 false
timeframe.isintraday 总是 false

完整示例指标

让我们通过一个完整的脚本来看看如何应用 timeframe.isdwm 变量。下方的指标会在一个文本标签中显示时间周期的信息:

//@version=5
indicator(title="Daily, weekly, or monthly time frame example", overlay=true)

// 在最后一根已确认的历史K线上,判断
// 图表使用了何种时间周期
if barstate.islastconfirmedhistory
    // 判断要在标签中显示的文本
    labelText = if timeframe.isdwm
        "This is a daily,\nweekly, or monthly chart"
    else
        "This is an intra-day chart!"

    // 如果图表是日线、周线或月线之一,
    // 则进一步判断具体是哪一种
    if timeframe.isdwm
        if timeframe.isdaily
            labelText += "\n\n(To be precise, it's\na daily chart.)"
        else if timeframe.isweekly
            labelText += "\n\n(To be precise, it's\na weekly chart.)"
        else if timeframe.ismonthly
            labelText += "\n\n(To be precise, it's\na monthly chart.)"

    labelText += "\n\nChart period:\n" + timeframe.period

    // 创建实际的文本标签
    label.new(x=bar_index, y=high, style=label.style_label_down,
         color=color.new(color.orange, 65), textcolor=color.black,
         size=size.large, text=labelText)

代码解析

这个指标首先使用 indicator() 函数来定义其设置。这行代码为脚本命名,并将其叠加显示在主图的交易品种上。

然后,一个 if 语句检查 barstate.islastconfirmedhistory。这个变量只在图表的最后一根历史K线上才为 true。由于任何图表只有一根这样的K线,使用这个条件可以确保我们的代码只执行一次(这样我们就不会在图表上重复创建标签)。

在这个 if 语句内部,我们做了两件事:构建标签的文本内容,然后创建标签本身。第一步是创建标签的文本:

// 判断要在标签中显示的文本
labelText = if timeframe.isdwm
	"This is a daily,\nweekly, or monthly chart"
else
	"This is an intra-day chart!"

// 如果图表是日线、周线或月线之一,
// 则进一步判断具体是哪一种
if timeframe.isdwm
	if timeframe.isdaily
		labelText += "\n\n(To be precise, it's\na daily chart.)"
	else if timeframe.isweekly
		labelText += "\n\n(To be precise, it's\na weekly chart.)"
	else if timeframe.ismonthly
		labelText += "\n\n(To be precise, it's\na monthly chart.)"

labelText += "\n\nChart period:\n" + timeframe.period

我们定义了 labelText 变量,并通过一个 if/else 语句为其赋值。判断的条件是 timeframe.isdwm。如果图表的时间周期是日线、周线或月线,我们就赋予变量一段相应的文本。否则,else 部分的代码会说明这是一个日内图。

到这里,我们只知道脚本是运行在日内图还是日线及以上周期图上,这还不够具体。所以,我们再通过一个 if 语句进一步判断。我们首先检查 timeframe.isdwm 是否为 true

如果是,一个级联的 if 语句会开始寻找具体的时间周期。为此,它会依次评估 timeframe.isdailytimeframe.isweeklytimeframe.ismonthly 变量。当其中一个测试为 true 时,我们便使用加法赋值运算符 (+=),向 labelText 变量追加一段文本,用以说明脚本所运行的具体时间周期类型。

我们还向 labelText 变量追加了图表的时间周期数值,这是通过 timeframe.period 变量获取的。这样,我们的标签就能提供更完整的信息。

最后,我们使用 label.new() 函数来创建这个文本标签:

// 创建实际的文本标签
label.new(x=bar_index, y=high, style=label.style_label_down,
	 color=color.new(color.orange, 65), textcolor=color.black,
	 size=size.large, text=labelText)

这个标签被显示在最后一根历史K线的最高价处 (bar_index, high)。它的箭头指向下方 (label.style_label_down),并以橘色 (color.orange) 显示,通过 color.new() 函数为其添加了透明度。标签的文字以黑色 (color.black) 和大号字体 (size.large) 显示。对于标签的文本内容,我们使用了 labelText 变量。

当这个脚本在一个日线、周线或月线图上运行时,标签会告诉我们三件事:首先,这是一个日、周、月级别图表;其次,具体是这三者中的哪一种;第三,图表的周期数值是多少。例如,在这张3周的美元指数图上,我们看到:

当我们切换图表时,标签内容也会随之改变。这是该脚本在一个30分钟图上显示的内容:

如何应用 timeframe.isdwm

在我们的脚本中,有以下几种方式可以应用 timeframe.isdwm

  • 调整计算逻辑:根据时间周期调整脚本的计算。例如,在日线、周线和月线图上,我们可以将止盈目标设置得比在日内图上更远。
  • 检查运行环境:确保脚本运行在适合其交易逻辑的时间周期上。例如,如果我们编写的是一个短线剥头皮策略,我们可能希望在日线、周线和月线这些大周期上禁用交易信号。
  • 使用不同参数:根据不同的时间周期使用不同的脚本设置。例如,在日线、周线和月线图上,我们可以使用与日内图上不同的MACD参数。
  • 禁用时段过滤器:在日线、周线和月线时间周期上,禁用交易时段过滤器。由于日线及以上的K线没有日内时间的概念,我们无法在这些时间周期上应用自定义的交易时段。

通常,我们会将多个时间周期变量组合在一个脚本中使用,这样我们就能更精确地为不同的时间周期,实现特定的脚本行为。


timeframe.isdwm 的特性

  • 虽然 timeframe.isdwm 能判断我们的代码是否运行在日线、周线或月线时间周期上,但它并不会告诉我们具体是这三种中的哪一种。要获取更精确的信息,我们需要使用 timeframe.isdailytimeframe.isweeklytimeframe.ismonthly 这些变量。
  • timeframe.isdwm 只告诉我们时间周期的类型,但不会告诉我们图表使用的具体周期数值(时间间隔)。要获取后者,我们需要使用 Pine Script 的 timeframe.multipliertimeframe.period 变量。
  • 虽然我们可以对 timeframe.isdwm 使用历史引用运算符 ([]),但这没什么用,因为该变量在每一根K线上的返回值都是相同的。
  • 我们可以将 timeframe.isdwm 用于 TradingView 的指标和策略,并且这个变量在所有时间周期上都可用。
  • 在 Pine Script 的第3版及更早版本中,timeframe.isdwm 变量曾被命名为 isdwm

内容总结

  • 如果脚本运行在一个日线、周线或月线时间周期上,timeframe.isdwm 变量就会返回 true。这包括了从1天到12个月的所有时间周期。
  • 当脚本运行在一个更低的时间周期上时(即日内分辨率),timeframe.isdwm 则会返回 false
  • timeframe.isdwm 的判断结果不依赖于图表类型。它在像点数图 (Point & Figure)卡吉图 (Kagi) 这样不常见的图表上,也同样以相同的方式工作。

在图表上显示数据的起始与结束日期

当我们打开一个图表时,TradingView 会自动加载一定数量的K线。这些K线所覆盖的日期范围,我们无法在图表上一目了然,至少不通过大量的滚动是看不到的。

那么,我们如何才能方便地显示出当前图表的日期范围呢?接下来,就让我们编写一个 Pine Script 指标来实现这个功能。


显示图表日期范围的脚本

有几种方法可以显示图表的日期范围,下面的这个脚本会通过创建一个文本标签来显示这些信息:

//@version=5
indicator(title="Display date range of chart", overlay=true)

// 在第一根K线上,将变量初始化为那根K线的开盘时间
var chartStartTime = time

// 创建一个标签,用于显示图表的日期范围
var rangeLabel = label.new(x=na, y=na, style=label.style_label_left,
     color=color.black, textcolor=color.white, size=size.large)

// 在最后一根K线上,生成包含日期范围的文本,并更新文本标签
if barstate.islast
    labelText = "This " + syminfo.ticker + " chart\nstarts on " + 
         str.format("{0,date,d-M-YYYY}", chartStartTime) + 
         "\nand ends on " + str.format("{0,date,d-M-YYYY}", time)

    label.set_xy(id=rangeLabel, x=bar_index + 1, y=close)
    label.set_text(id=rangeLabel, text=labelText)

这个脚本主要做了五件事:配置脚本设置、采集第一根K线的日期时间、创建文本标签、确定日期范围,最后更新文本标签。让我们逐一解析每个动作。

首先,我们使用 indicator() 函数来设置脚本的选项,这行代码为脚本命名,并将其叠加显示在主图的交易品种上。

然后,我们采集第一根K线的时间:

// 在第一根K线上,将变量初始化为那根K线的开盘时间
var chartStartTime = time

这段代码创建了 chartStartTime 变量,并为其赋予当前K线的日期和时间 (time)。因为我们使用了 var 关键字来声明,这个变量只会在图表的第一根K线上被创建和初始化一次。

var 的这个特性对我们非常有帮助。因为我们想获取的就是第一根K线的日期时间,这个变量会自动捕获图表第一根K线的开盘时间。如果我们之后不在代码中更新这个变量,它就会一直保持这个初始值。

接下来,我们使用 label.new() 函数来创建一个文本标签:

// 创建一个标签,用于显示图表的日期范围
var rangeLabel = label.new(x=na, y=na, style=label.style_label_left,
     color=color.black, textcolor=color.white, size=size.large)

这个箭头指向左边的标签 (label.style_label_left) 拥有黑色的背景 (color.black) 和白色的文字 (color.white),其尺寸比常规要大 (size.large)。

我们将这个标签的ID储存在一个同样用 var 关键字创建的变量 rangeLabel 中。这样做的结果是,这段代码也只会执行一次,确保我们的标签只被创建一次,避免在图表上重复创建而造成混乱。

我们稍后会在代码中更新标签的位置,所以它的初始时间 (x) 和价格 (y) 坐标暂时都设为 na(不可用)。

之后,我们来确定图表的日期范围:

if barstate.islast
    labelText = "This " + syminfo.ticker + " chart\nstarts on " + 
         str.format("{0,date,d-M-YYYY}", chartStartTime) + 
         "\nand ends on " + str.format("{0,date,d-M-YYYY}", time)

这个 if 语句评估 barstate.islast 变量,该变量只在图表的最后一根K线上才为 true。当条件成立时,我们创建一段包含了图表日期范围的文本。

这个文本由一些固定的字符串和动态的值拼接而成。它的第一部分告诉我们脚本运行在哪个品种上,我们通过 syminfo.ticker 变量来获取其交易代码。

然后,我们包含了图表的开始日期。之前我们已经将一个日期时间值存入了 chartStartTime 变量。现在,我们需要将它转换成一个字符串,这通过 str.format() 函数来实现。

这个函数需要两个东西:一个用于说明生成字符串格式的模板,以及要转换成文本的。对于模板,我们使用了 d-M-YYYY 这个格式化字符串,它们分别代表数字形式的日(d)、月(M)和四位数的年(YYYY)。要转换的值就是我们之前创建的 chartStartTime 变量。

为了包含图表的结束日期,我们再次调用 str.format()。我们使用相同的模板,但这次传入的是 time 变量。该变量返回K线的开盘时间。由于这段代码在最后一根K线上运行 (barstate.islast),所以它代表的就是图表的最后一个时间戳。

(我们也可以改用 time_close 变量,它返回K线的收盘时间,那才是图表真正的结束日期。但那个变量只在基于时间的图表上有效。为了与等量图等非时间图表兼容,本指标使用了 time。)

代码的最后一部分用于更新标签:

if barstate.islast
	// ...

    label.set_xy(id=rangeLabel, x=bar_index + 1, y=close)
    label.set_text(id=rangeLabel, text=labelText)

这里,label.set_xy() 函数更新了标签的时间和价格坐标。它的新位置被设在下一根K线 (bar_index + 1) 和当前K线的收盘价 (close) 处。

通过 label.set_text() 函数,我们将标签的文本设置为我们刚刚创建的、包含了日期范围的字符串。


显示图表日期范围

现在,让我们看看这个指标在图表上的效果。在一张1分钟的LTCUSD图表上,脚本告诉我们这张图加载了超过2周的1分钟数据:

在更高的时间周期上,TradingView 图表会加载更多的数据。例如,当我们将图表切换到1周线时,LTCUSD 的价格数据可以覆盖将近5年的时间:


不同的品种有不同的日期范围

并非每个 TradingView 图表都拥有相同的K线数量,因此也就没有相同的日期范围。一张图表具体能加载多少根K线,取决于交易品种时间周期以及你的 TradingView 账户等级

举一个不同品种之间差异的例子,我们来看看标普500指数 (S&P 500 index)。这个品种比加密货币要古老得多,因此拥有更长的历史数据。

例如,在一张2小时周期的SPX图表上,数据覆盖了超过7年的时间:

而在日线图上,标普500指数的数据甚至可以追溯到1871年:

顺便一提,年份1871并非脚本代码的错误。TradingView 提供的标普500指数价格数据,确实可以追溯到19世纪:

赞(0)
未经允许不得转载:图道交易 » Pine Script(114):timeframe.isintraday与isdwm,显示图表日期范围
分享到

评论 抢沙发

登录

找回密码

注册