实时K线收盘倒计时:还剩多少秒、多少分钟
基于时间的TradingView图表,通常会显示当前实时K线收盘的倒计时。有时,如果我们的指标或策略也能获得该信息,将会非常有用。下面我们来看看如何在TradingView Pine中用代码实现这一点。
让代码获知实时K线的收盘剩余时间
TradingView实时图表上的倒计时功能,可以帮助我们为新K线的开始做好准备。例如,我们可能希望在预期将出现买卖信号时提前准备好订单。一旦指标和策略知道了当前实时K线收盘还剩多少时间,它们也可以做类似的事情。
要计算距离K线收盘的分钟或秒数,我们的脚本必须使用三个代码元素:
time_close变量,用于获取K线收盘的时间。timenow变量,用于获取当前时间(与time_close处于相同的时区)。barstate.isrealtime变量,当脚本处理实时K线时,该变量为true。这种情况发生在图表的最后一根K线 且 市场正在交易时。通过这种方式,我们避免了在已经收盘的历史K线上进行倒计时。
注意事项
在TradingView脚本中处理时间的一个重要特性是,时间值仅在脚本进行计算时才会更新。而脚本的计算是由传入的价格更新所触发的。因此,如果我们交易的品种不那么活跃,我们的倒计时也不会频繁更新。
不幸的是,time_close 变量在基于价格的图表上会返回 na。所以我们无法为Renko图和Range图实现倒计时功能。
但我们可以在基于时间的图表上(例如分钟、小时和秒图)制作一个倒计时。让我们看看该怎么做。
计算距离当前实时K线收盘的秒数
要计算图表当前实时K线收盘前所剩余的秒数,我们可以这样做:
// 获取距离当前K线收盘的秒数
secondsLeft = barstate.isrealtime ?
(time_close - timenow) / 1000 :
na
// 在图表上显示倒计时
plot(secondsLeft, title="Seconds left")
我们在这里创建的 secondsLeft 变量会得到两个可能值中的一个,我们使用条件运算符(?:)来进行选择。当 barstate.isrealtime 变量为 true 时,我们的变量将保存距离实时K线收盘的秒数。
为了得到这个秒数,我们用K线的预期收盘时间(time_close)减去当前时间(timenow)。这会返回一个以毫秒为单位的时间跨度,因此我们将其除以1000来得到秒数。
如果 barstate.isrealtime 为 false,那么我们的脚本正在处理一根已收盘的价格K线。由于倒计时在这种K线上无效,我们使用 na 值来表示倒计时缺失。
然后,我们让 plot() 函数在图表上将这些秒数绘制为一条常规的线图。
注意事项
timenow 和 time_close 都是以毫秒尺度来报告时间的。但这并不意味着它们具有毫秒级的测量精度。
目前,它们只报告以整1000为间隔的时间,这为我们提供了秒级的精度。这就是为什么我们无法以毫秒为单位倒计时到K线收盘的原因。
计算K线收盘剩余秒数的函数
上面的代码可以封装成一个拿来即用的函数,如下所示:
// SecsLeft() 函数返回当前实时K线收盘
// 前的秒数(整数)。
// (对于历史K线和非时间图表,返回 `na`)
SecsLeft() =>
if barstate.isrealtime
(time_close - timenow) / 1000
要使用这个函数,只需调用 SecsLeft() 即可得到距离当前实时K线收盘的秒数。
一个选择是用 if 语句来检查该值。然后,当距离K线收盘还剩不到30秒时,使用 strategy.close_all() 函数平掉策略的所有仓位:
// 当K线收盘前剩余时间不足30秒时
// 平掉所有仓位
if SecsLeft() <= 30
strategy.close_all()
计算距离当前K线收盘的分钟数
我们使用一个类似的过程来查看距离当前实时K线收盘还剩多少分钟:
// 获取距离K线收盘的分钟数
minutesLeft = barstate.isrealtime ?
(time_close - timenow) / 60000 :
na
// 在图表上显示倒计时
plot(minutesLeft, title="Minutes left")
这里,我们首先检查脚本是否正在处理一根实时K线。如果是,我们就计算出到K线结束还剩下多少分钟。
为此,我们用基于时间的K线预期收盘时间(time_close)减去当前时间(timenow)。这会给我们一个以毫秒为单位的时间差。所以我们将其除以60000,从而将一个TradingView时间值转换为分钟。我们将结果存储在 minutesLeft 变量中。
如果当前K线不是实时K线,或者图表不是基于时间的,那么该变量将得到一个 na 值。无论如何,我们都用 plot() 函数来绘制它的值。
请注意,当剩余的分钟数不是整数时,我们会得到一个浮点值,例如剩余85秒时为1.333,或剩余10秒时为0.167。
计算K线收盘剩余分钟数的函数
当我们需要重复这些计算时,将代码封装在一个自定义函数中会更方便。代码如下所示:
// MinsLeft() 函数返回当前实时K线收盘
// 前的分钟数(浮点数)。
// (对于历史K线和非时间图表,返回 `na`)
MinsLeft() =>
if barstate.isrealtime
(time_close - timenow) / 60000
要使用这个函数,只需在你想知道距离K线收盘的分钟数时调用 MinsLeft() 即可。例如,以下是我们如何在图表上绘制这些值:
// 在图表上绘制剩余的分钟数
plot(MinsLeft(), color=color.black)
计算距离K线收盘的小时数
当然,我们也可以计算出距离当前实时K线收盘还有多少小时。方法如下:
// 计算直到当前实时K线结束还剩的小时数
hoursLeft = barstate.isrealtime ?
(time_close - timenow) / 3600000 :
na
// 在图表上显示倒计时
plot(hoursLeft, title="Hours left")
这个 hoursLeft 变量会得到两个可能值中的一个。当脚本在实时K线上计算时 (barstate.isrealtime),我们计算到K线收盘的小时数。否则,条件运算符(?:)返回 na。
要计算出这些小时数,我们用K线的收盘时间(time_close)减去当前时间(timenow)。要将这个时间差转换为小时,我们将其除以3600000。这个值3,600,000是一小时内的毫秒数(60分钟 × 60秒 × 1000毫秒)。
以小时为单位进行K线收盘倒计时的函数
为了方便地重用上述代码,这里是一个拿来即用的自定义函数:
// HrsLeft() 函数返回当前实时K线收盘
// 前的小时数(浮点数)。
// (对于历史K线和非时间图表,返回 `na`)
HrsLeft() =>
if barstate.isrealtime
(time_close - timenow) / 3600000
要使用这个函数,只需在你想知道距离K线收盘的剩余小时数时执行 HrsLeft() 即可。例如,下面的代码就用该信息编码了一个警报条件:
// 如果剩余时间不足30分钟,则生成警报
alertcondition(condition=HrsLeft() <= 0.50,
message="Less than 30m left!")
范例指标:绘制TradingView K线收盘的剩余时间
我们有多种方式来使用上面计算出的倒计时。一个选择是在图表上和数据窗口中显示这些数据。下面的这个指标就实现了这一点:
//@version=5
indicator(title="Time till bar closes", precision=4)
// 计算剩余的秒、分、小时
secondsLeft = barstate.isrealtime ?
(time_close - timenow) / 1000 :
na
minutesLeft = barstate.isrealtime ?
(time_close - timenow) / 60000 :
na
hoursLeft = barstate.isrealtime ?
(time_close - timenow) / 3600000 :
na
// 在图表上和图表的'数据窗口'中显示剩余时间
plot(secondsLeft, color=color.black, title="Seconds left")
plot(minutesLeft, color=color.black, title="Minutes left")
plot(hoursLeft, color=color.black, title="Hours left")
这里,我们首先计算距离K线收盘的秒数、分钟数和小时数。然后我们用 plot() 将这些数据绘制在图表上。
这些被绘制的数据也会显示在图表的‘数据窗口’中。这使得我们可以轻松地读出距离当前实时K线收盘还有多少秒、分钟或小时:
价格轴上的K线倒计时显示,当前实时K线在1小时3分43秒后收盘。而我们的‘数据窗口’中计算出的值则显示,K线在3,820秒后收盘。这相当于1小时3分40秒。(或63.6667分钟,或1.0611小时。)
这几秒钟的差异是很常见的。这是因为我们的脚本仅在有新的价格更新时才会更新,而图表自身的倒计时则是每秒更新一次。
总结
- 要计算距离当前实时K线收盘还有多长时间,我们比较
timenow变量和time_close变量。前者返回当前时间,后者则告知K线何时收盘。 - 当我们在进行该计算之前检查
barstate.isrealtime变量时,我们确保了计算是在适当的上下文中完成的。否则,我们可能会在历史K线或休市时进行倒计时。 - 有两点需要牢记。第一,我们脚本的倒计时仅在有新的价格更新时才会更新。第二,
time_close在基于价格的图表上不起作用,在这些图表上该变量会返回na,因为K线的收盘时间是未知的。
K线收盘倒计时:分钟和秒的组合显示
在基于时间的图表上,我们可以预先知道一根价格K线将在何时收盘。但我们如何在自己的TradingView指标和策略中获取这些信息呢?让我们来看看。
让TradingView脚本实现K线收盘倒计时
大多数TradingView的时间图表都会在价格轴上显示一个倒计时。这有助于我们预判价格K线何时结束,从而可以提前对可能出现的交易信号或警报做好准备。
为了让我们的指标或策略能够计算这个时间,我们必须使用三个代码元素:
time_close变量,用于告知K线将于何时关闭。timenow变量,用于返回当前时间(与time_close处于相同的时区)。barstate.isrealtime变量,用于告知我们的脚本是否正在处理一根实时K线。该变量在历史K线上为false(我们利用此信息来避免在这些K线上进行倒计时)。
注意事项
脚本的时间值仅在脚本进行计算时才会更新。而脚本的计算需要由传入的价格更新来触发。因此,如果我们交易的品种不活跃,我们的倒计时也不会频繁更新。
time_close 变量的一个不幸之处在于,它在基于价格的图表上会返回 na。所以我们无法为Range图和Renko图实现基于时间的倒计时。但它在基于时间的图表上(秒、分、时等)则工作良好。让我们看看如何实现。
注意事项
本文展示了如何创建一个具有多个时间单位的K线倒计时,例如1分30秒。如果你只想要单一的时间单位(例如总分钟数或总秒数),参考上一节的做法即可。
计算距离K线收盘的分钟和秒数
要查看距离K线收盘还剩多少分钟和秒,我们分两步走。首先,我们计算当前实时K线还剩下多少时间。然后,我们将这个时间间隔转换为分钟和秒的组合。
实现该功能的TradingView代码如下:
// 获取距离K线收盘的秒数
timeLeft = barstate.isrealtime ?
(time_close - timenow) / 1000 :
na
// 将剩余秒数转换为分钟和秒
minsLeft = math.floor(timeLeft / 60)
secsLeft = timeLeft % 60
// 在图表上显示剩余时间
plot(minsLeft, title="Minutes left")
plot(secsLeft, title="Seconds left")
我们首先创建 timeLeft 变量。该变量通过条件运算符(?:)来获取两个可能值中的一个。当 barstate.isrealtime 变量为 true 时,意味着脚本正在处理一根接收实时价格数据的K线,在这种情况下,我们计算距离K线收盘的时间。但如果K线是一根已收盘的历史K线,那么我们返回 na 来表示数据缺失。
要计算K线的剩余时间,我们用K线的结束时间(time_close)减去当前时间(timenow)。这会得到一个以毫秒为单位的TradingView时间值。我们将其除以1000得到秒数,并将该值存入 timeLeft 变量。
然后,我们将这个总秒数转换为分钟和秒的组合。分钟的计算很简单:我们将 timeLeft(秒数)除以60,并在 math.floor() 函数内部执行此操作,以便向下取整为完整的分钟。
对于秒数,我们做一些不同的处理。由于我们已经得到了分钟数,现在我们需要找到剩余的秒数。为此,我们使用取模运算符(%)。该运算符可以找到一个数被另一个数整除后的余数。
所以,通过 timeLeft % 60,我们得到总秒数除以一分钟(60秒)后的余数。这个余数就是那些没能凑成一整分钟的秒数。
函数:计算K线收盘的剩余分钟和秒数
如果我们的脚本需要重复计算距离K线收盘的分钟和秒数,使用自定义函数会更方便。以下是一个包含了前一步所有必需代码的函数:
// MinsSecsLeft() 函数返回一个包含分钟和秒数的元组,
// 代表距离当前实时K线收盘的时间。
// (对于历史K线和非时间图表,返回 `na`)
MinsSecsLeft() =>
if barstate.isrealtime
secLeft = (time_close - timenow) / 1000
[math.floor(secLeft / 60), secLeft % 60]
要在你的TradingView指标或策略中使用这个函数,你只需这样做:
// 获取距离最后一根K线收盘的分钟和秒数
[minsLeft, secsLeft] = MinsSecsLeft()
// 在图表上显示剩余时间
plot(minsLeft, title="Minutes left")
plot(secsLeft, title="Seconds left")
计算距离K线收盘的时、分、秒
虽然分钟和秒在较低的时间周期上很有用,但在较高的时间周期上,了解剩余的小时数也很有帮助。
要计算距离当前实时K线收盘的小时、分钟和秒,我们可以这样做:
// 获取距离K线收盘的秒数
timeLeft = barstate.isrealtime ?
(time_close - timenow) / 1000 :
na
// 然后计算剩余的小时、分钟、秒
hoursLeft = math.floor(timeLeft / 3600)
minutesLeft = math.floor((timeLeft % 3600) / 60)
secondsLeft = timeLeft % 60
// 在图表上显示剩余时间
plot(secondsLeft, title="Seconds left")
plot(minutesLeft, title="Minutes left")
plot(hoursLeft, title="Hours left")
我们首先计算出距离当前K线结束还剩多少秒。我们使用 timeLeft 变量来计算这个值的方式与本文前面所做的一样,它的值就是当前实时K线收盘前的总秒数。
然后我们计算这个时间间隔包含多少个完整的小时。为此,我们将 timeLeft 除以3600(一小时的秒数),并使用 math.floor() 函数向下取整结果。这样我们就得到了完整的小时数,并将其存入 hoursLeft 变量。
接下来我们处理分钟数。但由于我们已经计算了小时数,所以我们现在需要看有多少分钟是在扣除整小时后剩余的。我们使用取模运算符(%)来计算 timeLeft 除以3600后的余数。由于这个结果是秒数,我们再将其除以60来得到分钟数。
对于距离K线收盘的秒数,我们则看在扣除分钟数后剩余的时间。我们通过 timeLeft % 60 表达式来实现这一点。我们将该值存储在 secondsLeft 变量中。然后,我们用 plot() 函数在图表上绘制所有这三个变量。
计算K线收盘剩余时、分、秒的函数
当我们需要重复计算距离K线收盘的小时、分钟和秒数时,一个独立的函数会更易于使用。这样你在任何需要的地方直接调用即可。
以下是这样一个函数:
// MinsSecsHrsLeft() 函数返回一个包含时、分、秒的元组,
// 代表距离当前实时K线收盘的时间。
// (对于历史K线和非时间图表,返回 `na`)
MinsSecsHrsLeft() =>
if barstate.isrealtime
secLeft = (time_close - timenow) / 1000
[math.floor(secLeft / 3600),
math.floor((secLeft % 3600) / 60),
secLeft % 60]
要使用这个函数,我们只需这样做:
// 从函数获取剩余的小时、分钟和秒数
[hoursLeft, minsLeft, secsLeft] = MinsSecsHrsLeft()
// 在图表上显示剩余时间
plot(secsLeft, title="Seconds left")
plot(minsLeft, title="Minutes left")
plot(hoursLeft, title="Hours left")
范例指标:绘制K线收盘的剩余时间
上面我们讨论了多种计算实时K线剩余时间的方法。我们有多种方式来使用这些信息。一个基本的方法是绘制这些值,然后从图表的‘数据窗口’中读取它们。
下面的这个指标就实现了这一点:
//@version=5
indicator(title="Hours, minutes, seconds till close")
// 计算距离收盘的剩余时、分、秒
timeLeft = barstate.isrealtime ?
(time_close - timenow) / 1000 :
na
hoursLeft = math.floor(timeLeft / 3600)
minutesLeft = math.floor((timeLeft % 3600) / 60)
secondsLeft = timeLeft % 60
// 在图表上和图表的'数据窗口'中绘制剩余时间
plot(hoursLeft, color=color.black, title="Hours left")
plot(minutesLeft, color=color.black, title="Minutes left")
plot(secondsLeft, color=color.black, title="Seconds left")
这里,我们首先用 indicator() 函数设置指标属性。然后我们计算距离实时K线结束的小时、分钟和秒数。
我们用三个 plot() 语句在图表上绘制这些数据。这些绘图仅在当前K线是实时K线时才会显示,这是因为包含剩余时间的三个变量(hoursLeft、minutesLeft 和 secondsLeft)在其他情况下会返回 na。我们让这些绘制的值在图表和‘数据窗口’上都以黑色(color.black)显示。
该指标在图表上看起来是这样的:
在这里我们可以看到,图表官方的倒计时显示K线将在56分16秒后收盘。另一方面,我们的指标值所在的‘数据窗口’显示,K线将在56分13秒后收盘。
这样微小的差异是很常见的。原因之一是指标仅在有新的价格更新时才进行计算,而图表自身的倒计时则是每秒更新一次。
总结
- 当我们比较
timenow和time_close变量时,我们就能知道当前K线何时收盘。第一个变量返回当前时间;第二个则告知K线的预期收盘时间。 - 这当然要求我们的脚本正在处理一根接收实时市场数据的K线。我们可以通过
barstate.isrealtime变量来检查是否是这种情况。 - 请注意,由脚本计算的倒计时仅在脚本进行计算时才会更新,这种情况发生于接收到新的实时价格更新时。此外,
time_close在基于价格的图表上不起作用,在这些图表上该变量会返回na,因为我们无法预知这些K线将在何时收盘。



