获取交易时段内的最高价
当我们编写一个自定义时段时,有时我们需要知道该时段内的最高价。这些信息在多种情况下都很有用。
例如,我们可能希望绘制出这个最高价以进行视觉分析,或者用它来计算时段内的枢轴点。我们还可能模拟基于最高价突破的交易,或者将这个高点用作止盈目标。
这些功能都要求我们的脚本能够知道一个时间段内的最高高点。让我们来看看如何用代码实现这一点。
自定义函数
我们通过两步来获取一个时段的高点。首先,我们判断当前的K线是否发生在该时段内。然后,对于时段内的每一根K线,我们追踪其高点。随着时段的推进,我们最终就能得到最高的那个高点。
以下是如何在一个自定义的Pine Script函数中实现这种方法:
// SessionHigh() 函数返回指定时段内的最高价,
// 可选地为给定的时区进行校正。
// 当时段尚未开始或不在图表上时,返回 'na'。
SessionHigh(sessionTime, sessionTimeZone=syminfo.timezone) =>
insideSession = not na(time(timeframe.period, sessionTime, sessionTimeZone))
var float sessionHighPrice = na
if insideSession and not insideSession[1]
sessionHighPrice := high
else if insideSession
sessionHighPrice := math.max(sessionHighPrice, high)
sessionHighPrice
这个 SessionHigh() 函数有两个参数。sessionTime 需要一个时段字符串来告知要寻找哪个交易时段。sessionTimeZone 是一个用于定义该时段时区的时区字符串。如果我们不设置后者,它会默认使用交易品种的时区(syminfo.timezone)。
在函数内部,我们首先判断当前K线是否落在指定的时段内。这使用了前面判断K线是否落在时段内的相同代码。我们将这个真/假结果存入 insideSession 变量中,该变量告诉我们脚本是否正在处理一根处于时段内的K线。
为了追踪该时段内的高点,我们创建了 sessionHighPrice 变量。这个变量以空值 (na) 开始。如果我们使用标准的0.0作为默认值,那么在图表开始时,函数会返回0作为时段高点。
为了更新该变量,我们使用了一个 if/else 语句。if 部分判断时段是否在当前K线开始。这种情况在 insideSession 为 true 且其前一根K线的值为 false 时成立,这只适用于时段的第一根K线。在该K线上,我们将 sessionHighPrice 设置为该K线的高点,这使得该变量以时段的第一个高点开始。
else if 部分则判断当前K线是否处于时段内。如果是,我们就使用 math.max() 函数更新 sessionHighPrice 变量,将其设置为其当前值或当前K线高点中的较大者。这就在整个时段内追踪了高点的变化。
该函数的最后一条语句是 sessionHighPrice 变量,这就是函数返回该变量值的方式。
函数特性
该自定义函数有以下几个值得注意的特性:
- 当交易时段覆盖了图表上的所有K线时,该函数无法识别这些时段的高点。这是因为它需要一根在时段外的K线来知道时段何时开始。
- 该函数可能在整个图表上都找不到一个时段高点。当设置的时段没有出现在图表上时,这种情况就会发生。例如,时区差异可能会将时段置于交易品种的隔夜时间段内。
- 由于该函数是逐根K线地追踪时段高点,我们必须在每一根K线上都调用它。如果我们不这样做,它会错过一些K线(以及那些K线上发生的高点)。
- 该函数可能会识别出时间戳在我们配置的时段之外的K线。当该时段使用的时区与图表显示的时区不同时,就会发生这种情况。
- 在日线及更高的图表上,
SessionHigh()函数总是返回na。因为这些图表缺少时段信息,所以该函数无法找到时段高点。
函数范例
把上述函数加入脚本后,我们可以通过多种方式来使用它。
- 首先,我们可能想获取9:30到16:00股市时段的最高高点。为此,我们可以像这样使用该函数:
// 获取9:30-16:00时段的最高价 stockSessHigh = SessionHigh("0930-1600") - 将
SessionHigh()的输出存储在一个变量中很方便,但并非强制——我们可以在任何Pine Script接受数值的地方使用该函数。 - 要在图表上绘制GMT+1时区9:30-16:00时段的最高高点,我们可以调用
plot()函数并像这样向其传递SessionHigh()函数:// 在图表上绘制9:30-16:00 GMT+1时段的高点 plot(SessionHigh("0930-1600", "GMT+1"), color=color.green, title="Session High") SessionHigh()在每一根K线上都会返回一个值。当我们将它的当前值与前一个值进行比较时,就可以看到时段高点是如何发展的。- 比方说,我们想在22:00-6:00的隔夜时段内,每当出现新高时就为价格K线上色。在这种情况下,我们可以这样做:
// 当出现新的时段高点时将K线涂成绿色 overnightHigh = SessionHigh("2200-0600") barcolor(overnightHigh > overnightHigh[1] ? color.green : na)
脚本范例
让我们来探究一个完整的脚本如何使用 SessionHigh() 函数。下面的指标追踪8:00到17:00时段内的最高高点。
为了观察该值随时间的变化,我们在图表上将其绘制出来。通过高亮的背景,我们可以看到哪些K线处于时段内,这样就能轻松地发现时段高点可能在哪些K线上发生变化。
该指标的完整代码如下:
//@version=5
indicator(title="Session high", overlay=true)
// SessionHigh() 函数返回指定时段内的最高价,
// 可选地为给定的时区进行校正。
// 当时段尚未开始或不在图表上时,返回 'na'。
SessionHigh(sessionTime, sessionTimeZone=syminfo.timezone) =>
insideSession = not na(time(timeframe.period, sessionTime, sessionTimeZone))
var float sessionHighPrice = na
if insideSession and not insideSession[1]
sessionHighPrice := high
else if insideSession
sessionHighPrice := math.max(sessionHighPrice, high)
sessionHighPrice
// 当当前K线发生在指定的时段内时,InSession() 函数返回 'true',
// 并为给定的时区进行校正(可选)。
// 当K线不发生在该时间段内,或当图表时间周期为1天或更高时,
// 返回 'false'。
InSession(sessionTimes, sessionTimeZone=syminfo.timezone) =>
not na(time(timeframe.period, sessionTimes, sessionTimeZone))
// 通过输入项配置时段
session = input.session("0800-1700", title="Trading Session")
timeZone = input.string("GMT", title="Time Zone")
// 获取时段高点
sessHigh = SessionHigh(session, timeZone)
// 在图表上显示时段高点
plot(sessHigh, color=color.green, title="Session High")
// 为了视觉验证,高亮时段K线的背景
bgcolor(InSession(session, timeZone) ? color.new(color.orange, 90) : na)
首先,我们用 indicator() 函数来配置脚本,通过 title 命名脚本,并使用 overlay 使其显示在主图的交易品种上。
然后,我们引入了上面讨论过的自定义 SessionHigh() 函数。我们还添加了自定义的 InSession() 函数,用它来高亮显示时段内的K线背景。
接下来,我们创建了两个输入项。时段输入项定义了从8:00到17:00的交易时段,它是通过 input.session() 函数创建的。字符串输入项则用于设置时段的时区(GMT),它是通过 input.string() 函数创建的。我们将这两个输入项的值分别存储在 session 和 timeZone 变量中。
然后,我们为该时段和时区收集时段内的高点:
// 获取时段高点
sessHigh = SessionHigh(session, timeZone)
这里,我们使用 session 和 timeZone 变量作为参数来调用 SessionHigh() 函数。这会返回在8:00-17:00 GMT时段内的最高高点。我们暂时将这个值存储在 sessHigh 变量中。
下一步,plot() 函数将这个时段高点显示为一条绿色的 (color.green) 实线图:
// 在图表上显示时段高点
plot(sessHigh, color=color.green, title="Session High")
在这之后,指标使用 bgcolor() 函数为图表背景上色,但并非为每一根K线上色。相反,InSession() 函数会测试当前K线是否发生在通过输入项指定的时段内。
当K线处于该时间范围内时,条件运算符(?:)会返回一个透明的橙色(color.orange)作为背景色。对于时段外的K线,该运算符则返回 na 值来关闭背景色。
该指标在图表上的效果如下:
当时段开始时,时段高点会重置为第一根K线的高点。在时段期间,当价格走高时,高点会随之更新。而当时段结束后,时段高点会保持其值(直到下一个时段开始)。
总结
SessionHigh()函数返回特定时区内某个时段的最高高点。- 当时段开始时,
SessionHigh()以第一根K线的高点作为初始值。在时段期间,当出现更高的价格时,它会更新该值。 - 当图表和时段使用不同的时区时,该函数追踪的可能是那些看起来在时段之外的K线的最高高点。但这其实是由时区差异造成的。
获取交易时段内的最低价
TradingView脚本可以通过自定义时段来定义自己的交易时间。这对于那些几乎全天24小时交易的品种尤其有用。但当我们使用这样一个自定义的时间段时,我们如何获取其最低低点呢?
这个价格在多种情况下都很有用。我们可能希望在图表上绘制该值以进行视觉检查,或者让代码判断价格何时跌破最低低点,又或者可能将这个低点用作止损位。
这些功能都要求我们的脚本能够知道一个时间段内的最低低点。让我们来看看如何用代码实现这一点。
自定义函数
我们通过两步来获取一个时段的低点。首先,我们判断当前的K线是否发生在该时段内。然后,我们追踪该时段内每一根K线的低点。通过这种方式,随着时段的推进,我们就能得到最低的那个低点。
以下是如何在一个自定义的Pine Script函数中实现这种方法:
// SessionLow() 函数返回给定交易时段内的最低价,
// 可选地为指定的时区进行校正。
// 当时段尚未开始或不在图表上时,返回 'na'。
SessionLow(sessionTime, sessionTimeZone=syminfo.timezone) =>
insideSession = not na(time(timeframe.period, sessionTime, sessionTimeZone))
var float sessionLowPrice = na
if insideSession and not insideSession[1]
sessionLowPrice := low
else if insideSession
sessionLowPrice := math.min(sessionLowPrice, low)
sessionLowPrice
这个 SessionLow() 函数最多接受两个参数。sessionTime 是一个用于定义交易时段的时段字符串。sessionTimeZone 是一个用于设定该时段时区的时区字符串。后一个参数是可选的;如果我们不设置它,该函数会默认使用交易品种的时区(syminfo.timezone)。
该函数的代码首先会判断当前K线是否发生在自定义时段内。这使用了前面判断K线是否落在时段内的相同代码。我们将这个真/假结果存储在 insideSession 变量中,当K线在时段内时,该变量为 true,在时段外则为 false。
为了追踪时段内的低点,我们创建了 sessionLowPrice 这个持久性变量(var)。它的初始值是空值 (na)。我们不使用典型的默认值 0.0,因为那会导致函数在图表开始时返回0作为时段低点。
我们使用一个 if/else 语句来更新该变量。if 条件判断时段是否在当前K线开始。这种情况在 insideSession 变量为 true 而其前一根K线的值为 false 时成立。在该第一根K线上,我们将 sessionLowPrice 设置为该K线的低点,这使得该变量以时段开盘K线的低点作为初始值。
else if 部分则判断当前K线是否处于时段内。如果是,我们就使用 math.min() 函数更新 sessionLowPrice 变量,将其设置为其当前值或当前K线低点中的较小者。由于我们在时段内的每一根K线上都这样做,这就实现了在整个时段内追踪低点。
该函数的最后一条语句是 sessionLowPrice 变量,这就是函数返回该变量值的方式。
函数特性
该自定义函数有以下几个值得注意的特性:
- 当设置的时段包含了图表上的所有K线时,
SessionLow()将无法识别这些时段的低点。这是因为它需要至少一根在时段之外的K线来判断时段的开始。 SessionLow()可能在整个图表上都找不到任何一个时段低点。当设置的时段没有出现在图表上时,这种情况就会发生。例如,时区差异可能会将时段置于交易品种的隔夜时间段内。- 该函数可能会使用那些时间戳在我们指定的时段之外的K线。当图表和时段使用不同的时区时,就会发生这种情况。
- 我们必须在每一根K线上都调用该函数。该函数逐根K线地追踪最低低点。如果它错过了某根K线,它也就无法获知那根K线的低点。
- 在日线及更高的时间周期上,
SessionLow()总是返回na。因为那些图表没有时段信息,所以Pine Script无法找到那些周期内的最低低点。
函数范例
把上述函数加入脚本后,我们可以通过多种方式来使用它。
- 首先,假设我们想获取9:30到16:00时段的最低低点。要获取该值,我们可以这样做:
// 获取在9:30到16:00股市时段内达到的低点 stockSessLow = SessionLow("0930-1600") - 虽然将函数的结果存储在一个变量中可能很有用,但这并非必要——我们可以在任何Pine Script接受数值的地方直接使用它。
- 让我们假设我们想在图表上绘制GMT-8时区9:30-16:00时段的最低低点。因此,我们调用
plot()函数并像这样向其传递SessionLow()函数:// 在图表上显示9:30-16:00 GMT-8时段的低点 plot(SessionLow("0930-1600", "GMT-8"), color=color.red, title="Session Low") - 由于
SessionLow()函数在每一根K线上都会返回一个值,我们可以比较它的当前值与前一个值,这会告诉我们时段低点自那时以来的变化情况。 - 比方说,我们想在23:05到4:45的隔夜时段内,每当出现更低的时段低点时就为价格K线上色。在这种情况下,我们可以这样做:
// 当出现新的时段低点时将K线涂成紫红色 overnightLow = SessionLow("2305-0445") barcolor(overnightLow < overnightLow[1] ? color.fuchsia : na)
脚本范例
让我们看看一个完整的脚本如何使用 SessionLow() 函数。下方的指标获取9:30到16:00时段内的最低低点。
为了追踪这些低点,我们在图表上将其绘制出来。我们还高亮显示了时段内K线的背景,这样我们就能轻松地分辨出时段低点可能在何时发生变化。
该指标的完整代码如下:
//@version=5
indicator(title="Session low", overlay=true)
// SessionLow() 函数返回给定交易时段内的最低价,
// 可选地为指定的时区进行校正。
// 当时段尚未开始或不在图表上时,返回 'na'。
SessionLow(sessionTime, sessionTimeZone=syminfo.timezone) =>
insideSession = not na(time(timeframe.period, sessionTime, sessionTimeZone))
var float sessionLowPrice = na
if insideSession and not insideSession[1]
sessionLowPrice := low
else if insideSession
sessionLowPrice := math.min(sessionLowPrice, low)
sessionLowPrice
// 当当前K线发生在指定的时段内时,InSession() 函数返回 'true',
// 并为给定的时区进行校正(可选)。
// 当K线不发生在该时间段内,或当图表时间周期为1天或更高时,
// 返回 'false'。
InSession(sessionTimes, sessionTimeZone=syminfo.timezone) =>
not na(time(timeframe.period, sessionTimes, sessionTimeZone))
// 通过输入项配置时段
session = input.session("0930-1600", title="Trading Session")
timeZone = input.string("GMT", title="Time Zone")
// 获取时段低点
sessLow = SessionLow(session, timeZone)
// 在图表上显示时段低点
plot(sessLow, color=color.red, title="Session Low")
// 为了视觉检查,高亮时段的背景
bgcolor(InSession(session, timeZone) ? color.new(color.aqua, 90) : na)
首先我们调用 indicator() 函数,它为脚本命名并将其放置在主图的交易品种之上。
然后,我们添加了上面讨论过的自定义 SessionLow() 函数,我们还添加了自定义的 InSession() 函数,稍后用它来高亮时段内的K线背景。
接着,我们创建了两个输入项。时段输入(input.session())设置脚本的自定义交易时段,其默认值为9:30到16:00。字符串输入(input.string())则说明该时段使用的时区,其标准值为GMT。我们用 session 和 timeZone 变量来追踪这两个输入的值。
然后我们获取时段低点:
// 获取时段低点
sessLow = SessionLow(session, timeZone)
我们用两个参数来调用 SessionLow() 函数:session 和 timeZone 输入变量。当输入使用其默认值时,我们得到9:30-16:00 GMT时段的最低低点。我们暂时将这个低点存储在 sessLow 变量中。
下一步,plot() 函数将这个时段低点显示为一条红色的(color.red)实线图:
// 在图表上显示时段低点
plot(sessLow, color=color.red, title="Session Low")
该指标的最后一行代码使用 bgcolor() 函数为背景上色,但并非为每一根K线上色。相反,InSession() 函数会判断当前K线是否发生在时段内。如果是,条件运算符(?:)会返回一个透明的水绿色(color.aqua)作为背景色,否则该运算符返回 na 值来禁用背景。最终效果是只在交易时段期间才会有彩色的背景。
该指标在图表上的效果如下:
当一个新时段开始时,时段低点会重置为该第一根时段K线的低点。在时段期间,当出现新的低点时,它会随之更新。而一旦时段结束,时段低点会保持其值,直到下一个时段开始。
总结
SessionLow()函数返回特定时区内某个时段的最低低点。- 当时段开始时,
SessionLow()以第一根K线的低点作为初始值。在时段期间,当出现更低的价格时,它会更新该值。 - 当图表和时段使用不同的时区时,该函数追踪的可能是那些看起来在时段之外的K线的低点。这不是一个bug,而是由时区差异造成的。




