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

Pine Script(128):制作带星期几输入的交易时段

#Pine Script入门教学

制作带星期几输入的交易时段

TradingView脚本通过 input.session() 函数来创建时段输入项。通过这个自定义设置,脚本用户可以轻松地配置一个交易时段的开始和结束时间。

不过,这里有一个问题:一个时段输入项无法设置该时段在一周的哪几天生效,它只会简单地在所有7天都运行。但这可能不是我们想要的,这样也不够灵活。而且,如果我们想快速地在特定的某几天测试脚本该怎么办呢?

所以我们需要更好的方法。解决方案是什么呢?创建额外的输入项来指定时段在哪几天生效。然后我们通过代码将这些星期几输入项与时段输入项结合起来,这样就得到了一个只在特定日期生效的时段。之后,我们的脚本就可以将这个 session string(时段字符串)用于其他任务,例如测试一根K线是否是该时段的第一根。

有两种方法可以创建一个带星期几输入的时段:

  • 使用一个字符串输入来设置星期几。
  • 为每周的每一天使用一个复选框。

两个选项都是很好的解决方案。第一个需要更少的代码,但第二个对脚本用户来说更方便。让我们来逐一了解。

使用字符串输入来指定星期几

Pine Script的时段字符串使用数字来指定星期几:1代表星期日,直到7代表星期六。要选择一个时段使用哪几天,我们首先使用 input.string() 函数创建一个字符串输入项。在这个文本输入框中,我们可以输入我们希望时段生效的星期所对应的数字。

要将时段输入与星期几输入结合起来,我们将这两个输入的字符串拼接在一起。其结果就是一个指定了一周中特定日期的交易时段的 session string

然后我们就可以将这个组合后的字符串用于其他任务,例如查看一根K线是否落在某个时段内。

以下是如何将时段与星期几输入结合起来:

// 创建时段和字符串输入
sessionInput = input.session("0900-1730", title="Session Times", 
     group="Trading Session")
daysInput = input.string("23456", title="Session Days", group="Trading Session",
     tooltip="指定时段在一周的哪一天\n是活跃的。 " +
     "\n该时段必须至少在\n一天内活跃。" +
     "\n\n可选值与日期的对应关系:\n1 - 星期日\n2 - 星期一" + 
     "\n3 - 星期二\n4 - 星期三\n5 - 星期四\n6 - 星期五\n7 - 星期六")

// 创建 session string
tradingSession = sessionInput + ":" + daysInput

我们在这里创建了两个输入项。首先,input.session() 函数创建了一个时段输入。其默认值是 "0900-1730",这是一个指定了从9:00到17:30时段的 session string。我们使用 sessionInput 变量来追踪这个输入的值。

接下来,input.string() 函数创建了一个字符串输入。这个输入用于控制该时段在一周的哪几天生效。其默认值是 "23456",代表星期一(2)到星期五(6)。tooltip 参数解释了哪个数字对应哪一天。当用户将鼠标悬停在输入项的工具提示图标上时,这些信息就会显示出来。我们将这个输入的值存储在 daysInput 变量中。

至此,我们有了一个包含时段的变量和一个包含日期的变量。下一步,我们将这两者结合起来,并用一个冒号(:)分隔,这就创建了一个指定了星期几的 session string

为此,我们使用 + 运算符将 sessionInput 变量和 daysInput 变量拼接起来,并在它们之间放置 ":"。我们将结果存储在 tradingSession 变量中。

现在,这个包含了完整时段字符串的 tradingSession 变量,就可以被代码用于其他地方了,例如,判断一根K线是否落在某个时段内。

以下是这两个输入项在脚本设置中的样子:

脚本范例

让我们在一个完整的脚本中使用上述方法。下面的指标会创建两个输入项,其方式与我们上面讨论的相同。

然后,脚本会寻找在指定日期上、在该时段期间发生的K线。当它找到处于该时间段内的K线时,便会为它们的图表背景从上到下进行着色。

该指标的完整代码如下:

//@version=5
indicator(title="Session with days input", overlay=true)

// 当当前K线发生在指定的时段内时,InSession() 函数返回 'true',
// 并为给定的时区进行校正(可选)。
// 当K线不发生在该时间段内,或当图表时间周期为1天或更高时,
// 返回 'false'。 
InSession(sessionTimes, sessionTimeZone=syminfo.timezone) =>
    not na(time(timeframe.period, sessionTimes, sessionTimeZone))

// 创建时段和字符串输入
sessionInput = input.session("0900-1730", title="Session Times", 
     group="Trading Session")
daysInput = input.string("23456", title="Session Days", group="Trading Session",
     tooltip="指定时段在一周的哪一天\n是活跃的。 " +
     "\n该时段必须至少在\n一天内活跃。" +
     "\n\n可选值与日期的对应关系:\n1 - 星期日\n2 - 星期一" + 
     "\n3 - 星期二\n4 - 星期三\n5 - 星期四\n6 - 星期五\n7 - 星期六")

// 创建 session string
tradingSession = sessionInput + ":" + daysInput

// 高亮指定时段内K线的背景
bgcolor(InSession(tradingSession) ? color.new(color.teal, 80) : na)

我们以 indicator() 函数开始,用于命名该脚本并将其叠加显示在主图的交易品种上。

然后,我们引入 InSession() 函数。这个函数将用于判断一根K线是否落在特定日期的指定时段内。

之后,我们创建两个输入项,正如我们上面所讨论的。第一个输入用于指定时段时间,另一个用于指定时段日期。我们将它们组合后的 session string 存储在 tradingSession 变量中。

最后,bgcolor() 函数为该时段内的K线背景上色。为此,条件运算符(?:)会评估一个条件。这个条件就是用 tradingSession 变量调用 InSession() 函数。当当前K线发生在指定日期的时段内时,该函数返回 true,否则返回 false

当K线处于时段内时(即 true),条件运算符会返回一个透明的青色(color.teal),然后 bgcolor() 函数便使用这个颜色来为背景上色。否则,当值为 false 时,运算符会返回 na 值,这会关闭背景色。

在图表上,该指标高亮了周一到周五的交易时段。由于‘Session Days’(时段日期)输入项默认不使用数字‘1’和‘7’,因此周日和周六的时段没有被着色:

使用复选框来指定星期几

第二种可能性是,将一个时段输入与一组用于控制星期几的复选框结合起来。

这种方法需要更多的代码,但对用户来说更方便:不再需要用数字来代表日期,取而代之的是为每一天使用开关式的复选框。

实现此方法的代码如下:

// 创建输入项
sessionInput = input.session("0900-1730", title="Session Times", 
     group="Trading Session", tooltip="使用下方的复选框来选择" + 
     "该时段在一周的哪几天生效。该时段" +
     "必须至少在一天内生效。")
monSession = input.bool(true, title="周一 ", group="Trading Session", inline="d1")
tueSession = input.bool(true, title="周二 ", group="Trading Session", inline="d1")
wedSession = input.bool(true, title="周三 ", group="Trading Session", inline="d1")
thuSession = input.bool(true, title="周四 ", group="Trading Session", inline="d1")
friSession = input.bool(true, title="周五   ", group="Trading Session", inline="d2")
satSession = input.bool(false, title="周六  ", group="Trading Session", inline="d2")
sunSession = input.bool(false, title="周日 ", group="Trading Session", inline="d2")

// 基于复选框的值,创建一个代表星期几的字符串
sessionDays = ""
if sunSession
    sessionDays += "1"
if monSession
    sessionDays += "2"
if tueSession
    sessionDays += "3"
if wedSession
    sessionDays += "4"
if thuSession
    sessionDays += "5"
if friSession
    sessionDays += "6"
if satSession
    sessionDays += "7"

// 通过拼接时间与日期来创建完整的时段字符串
tradingSession = sessionInput + ":" + sessionDays

这段代码中发生了四件事。我们来逐一了解。

  1. input.session() 函数创建了一个时段输入。这个‘Session Times’输入的默认值是 "0900-1730"。我们使用 sessionInput 变量来追踪其值。
  2. input.bool() 函数为每周的每一天都创建了一个真/假(true/false)复选框。工作日默认被启用(true),而周六和周日则默认关闭(false)。Pine Script的 inline 输入参数将复选框分成了两行,以获得更好的视觉效果。我们使用Unicode的‘四分之一全角空格’字符来使输入项整齐地对齐。
  3. 我们必须将这些真/假复选框转换为星期几的数字。因此,我们首先创建一个空的 sessionDays 字符串变量。然后创建一系列 if 语句。每一个 if 语句都检查一个复选框是否被勾选(true)。如果是,该语句就会将对应的星期几数字追加到 sessionDays 变量中。这样,当Pine Script执行完所有 if 语句后,该变量就包含了所有时段应生效的日期的数字。
  4. 我们将时段与其应生效的星期几连接起来。因此,我们使用 + 运算符将 sessionInput 变量和 sessionDays 变量拼接起来,并在它们之间用一个冒号(:)分隔,从而得到一个有效的时段字符串。我们将这个组合的结果存储在 tradingSession 变量中。

带有星期几复选框的时段输入看起来是这样的:

脚本范例

让我们在一个完整的脚本中使用复选框方法。下方的指标会寻找在特定星期几的某个时段内发生的K线。

找到后,我们会为这些K线赋予一个紫红色的背景。通过这种方式,我们可以轻松地看到配置的时段何时是活跃的。

该指标的完整代码如下:

//@version=5
indicator(title="Session with days input", overlay=true)

// 当当前K线发生在指定的时段内时,InSession() 函数返回 'true',
// 并为给定的时区进行校正(可选)。
// 当K线不发生在该时间段内,或当图表时间周期为1天或更高时,
// 返回 'false'。 
InSession(sessionTimes, sessionTimeZone=syminfo.timezone) =>
    not na(time(timeframe.period, sessionTimes, sessionTimeZone))

// 创建输入项
sessionInput = input.session("0900-1730", title="Session Times", 
     group="Trading Session", tooltip="使用下方的复选框来选择" + 
     "该时段在一周的哪几天生效。该时段" +
     "必须至少在一天内生效。")
monSession = input.bool(true, title="周一 ", group="Trading Session", inline="d1")
tueSession = input.bool(true, title="周二 ", group="Trading Session", inline="d1")
wedSession = input.bool(true, title="周三 ", group="Trading Session", inline="d1")
thuSession = input.bool(true, title="周四 ", group="Trading Session", inline="d1")
friSession = input.bool(true, title="周五   ", group="Trading Session", inline="d2")
satSession = input.bool(false, title="周六  ", group="Trading Session", inline="d2")
sunSession = input.bool(false, title="周日 ", group="Trading Session", inline="d2")

// 基于复选框的值,创建一个代表星期几的字符串
sessionDays = ""
if sunSession
    sessionDays += "1"
if monSession
    sessionDays += "2"
if tueSession
    sessionDays += "3"
if wedSession
    sessionDays += "4"
if thuSession
    sessionDays += "5"
if friSession
    sessionDays += "6"
if satSession
    sessionDays += "7"

// 通过拼接时间与日期来创建完整的时段字符串
tradingSession = sessionInput + ":" + sessionDays

// 当K线发生在指定时段内时高亮背景
bgcolor(InSession(tradingSession) ? color.new(color.fuchsia, 85) : na)

我们以 indicator() 函数开始这个指标,title 用于命名脚本,overlay 则使其显示在主图的交易品种上。

然后我们引入了自定义的 InSession() 函数,这个函数将告诉我们当前K线是否落在某个时段内。

为了指定该时段及其日期,我们创建了几个输入项。这与我们上面讨论的代码相同。这段代码的结果是 tradingSession 变量,它持有时段时间和星期几信息。

最后,bgcolor() 函数为图表背景上色,但并非一直如此。它通过一个条件运算符(?:)来判断当前K线是否发生在指定时段内。即 InSession() 函数在传入 tradingSession 变量后,是否返回 true

在这种情况下,条件运算符会返回一个透明的紫红色(color.fuchsia),bgcolor() 随即使用这个颜色为图表背景上色。当 InSession() 返回 false 时,表示K线在时段之外,此时条件运算符会返回 na 值,这会关闭背景色。

在图表上,处于时段内的K线会获得紫红色的背景。由于周六和周日的复选框默认是关闭的,因此在这些天,时段是不活跃的:

你可以亲自试用该指标,看看调整输入项会如何修改被高亮的时间和日期。

总结

  • 一个时段输入项(session input)可以设置一个开始和结束时间,但它会应用于一周的每一天。
  • 要手动配置这些日期,我们需要更多的输入项。
    • 一个选择是使用字符串输入(string input),这需要用户输入代表星期几的数字。
    • 或者,我们为该时段应生效的每一天创建一个复选框输入(checkbox input)。
赞(0)
未经允许不得转载:图道交易 » Pine Script(128):制作带星期几输入的交易时段
分享到

评论 抢沙发

登录

找回密码

注册