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 变量都会如上表所示,返回 true 或 false。
timeframe.isdwm 的反义
timeframe.isintraday 与 timeframe.isdwm 变量在逻辑上是完全相反的,后者用于检查脚本是否运行在日线、周线或月线时间周期上。
因此,当 timeframe.isintraday 为 true 时,timeframe.isdwm 必定为 false。反之亦然:当 timeframe.isintraday 为 false 时,timeframe.isdwm 必定为 true。
这之所以行得通,是因为 TradingView 将时间周期分为两大类:日内周期 vs 日线及以上周期。任何图表总是属于这两者之一。所以,当一个图表不是日线或更高周期图时,它必定是一个日内图(反之亦然)。
我们可以用下面的 Pine Script 代码来表达这种关系:
timeframe.isintraday = not timeframe.isdwm
与其他时间周期变量的比较
Pine Script 提供了其他几个时间周期变量。当我们的脚本运行在一个日内图上时,其他变量的返回值如下:
| 变量 | 当 timeframe.isintraday 为 true 时 |
|---|---|
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.multiplier和timeframe.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 变量都会如上表所示,返回 true 或 false。
timeframe.isintraday 的反义
timeframe.isdwm 与 timeframe.isintraday 变量在逻辑上是完全相反的,后者用于检查脚本是否运行在日内时间周期上。
这意味着,当 timeframe.isdwm 为 true 时,timeframe.isintraday 必定为 false。反之亦然:当 timeframe.isdwm 为 false 时,timeframe.isintraday 必定为 true。
这是因为 TradingView 将时间周期分为两大类:日内周期 vs 日线及以上周期。任何图表总是属于这两者之一。所以,如果一个图表不是日内图,它必定是一个日线或更高周期图(反之亦然)。
在 Pine Script 代码层面,我们可以这样说:
timeframe.isdwm = not timeframe.isintraday
与其他时间周期变量的比较
Pine Script 提供了其他几个时间周期变量。当我们的脚本运行在一个日线、周线或月线时间周期上时,这些其他变量的返回值如下:
| 变量 | 当 timeframe.isdwm 为 true 时 |
|---|---|
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.isdaily、timeframe.isweekly 和 timeframe.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.isdaily、timeframe.isweekly和timeframe.ismonthly这些变量。 timeframe.isdwm只告诉我们时间周期的类型,但不会告诉我们图表使用的具体周期数值(时间间隔)。要获取后者,我们需要使用 Pine Script 的timeframe.multiplier和timeframe.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世纪:











