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

Pine Script(127):时区名称与交易时段字符串详解

#Pine Script入门教学

Pine Script支持哪些时区名称

Pine Script的时间值总是基于一个特定的时区。几乎所有的变量和函数都使用与图表当前交易品种相同的时区。

但我们并非只能使用这个时区。有几个时区函数可以返回特定时区的数据,这要求我们向其传入一个包含我们想使用的时区信息的字符串。

在Pine Script中,有两种方式可以定义一个时区:

  • 时区名称:这个字符串指定一个地理位置,例如 "America/New_York"(美洲/纽约)、"Europe/Amsterdam"(欧洲/阿姆斯特丹)和 "Asia/Taipei"(亚洲/台北)。
  • 时区偏移量:这个字符串定义了与UTC或GMT标准时区的差异。例如:"UTC-5""GMT+0530"

后一种方法是方便地将一个时间值更改为不同时区偏移量的方式。但如果我们的代码需要在某个特定的地理区域处理时间,使用时区名称会更容易,尤其是当该地区实行夏令时(Daylight Saving)的时候。

让我们来看看Pine Script支持哪些时区名称。

按字母顺序排列的时区名称

Pine Script使用与IANA时区数据库相同的时区名称。这个行业标准包含了自1970年以来全球所有的时区名称(及其设置)。

因此,Pine Script可以使用的时区名称如下:

时区名称 UTC偏移量 标准时间 (夏令时)
“Africa/Abidjan” +00:00
“Africa/Accra” +00:00
“Africa/Addis_Ababa” +03:00
“Africa/Algiers” +01:00
“Africa/Asmara” +03:00
“Africa/Asmera” +03:00
“America/New_York” −05:00 (DST: −04:00)
“Asia/Taipei” +08:00
“Europe/London” +00:00 (DST: +01:00)
“Pacific/Auckland” +12:00 (DST: +13:00)
“US/Eastern” −05:00 (DST: −04:00)
“UTC” +00:00
“WET” +00:00 (DST: +01:00)
“Zulu” +00:00

(为了简洁,此处省略了完整的时区列表,仅展示部分示例)

上表中的第二列显示了该时区的标准时间(STD)相对于UTC的偏移量。当一个时区采用夏令时(Daylight Saving),括号内还会显示夏令时(DST)期间相对于UTC的偏移量。如果该时区不使用夏令时,那么全年都只有一个固定的UTC偏移量。

按UTC偏移量排列的时区

以下是Pine Script可以使用的相同时区列表,但这次是按UTC偏移量进行排序:

时区名称 UTC偏移量 标准时间 (夏令时)
“Etc/GMT+12” −12:00
“Etc/GMT+11” −11:00
“America/New_York” −05:00 (DST: −04:00)
“UTC” +00:00
“Asia/Taipei” +08:00
“Pacific/Auckland” +12:00 (DST: +13:00)
“Pacific/Kiritimati” +14:00

(为了简洁,此处省略了完整的时区列表,仅展示部分示例)

第二列显示了该时区的标准时间(STD)相对于UTC的偏移量。当一个时区采用夏令时,括号内会显示夏令时(DST)期间相对于UTC的偏移量。

总结

  • 有几个Pine Script函数可以返回特定时区的时间数据。有两种方式来定义这样一个时区。
    • 通过一个特定的时区名称,例如 "Europe/Paris""America/Argentina/Buenos_Aires"
    • 或者通过相对于UTC或GMT的偏移量,例如 "UTC-0830""GMT+2"
  • 然后,Pine Script会将时间值转换到指定的时区,并返回其结果。

用代码定义交易时段:时段字符串详解

在Pine Script中,我们可以设置自己的自定义交易时段。我们通过一种特殊的字符串来实现这一点。

所谓的 session string(时段字符串)是一段采用特定格式的文本,用于定义一个交易时段的开始和结束时间。作为可选项,该字符串也可以指定该时段在一周的哪几天是活跃的。

我们使用时段字符串来检测图表上的某个交易时段。这使得收集时段内的高低点、仅在特定时段内交易、以及仅在特定时间段内生成警报成为可能。

要成为一个有效的时段,时段字符串必须遵循一个特定的模式,否则Pine Script会产生一个错误。让我们来看看这个模式是什么,然后我们将探讨各种时段字符串的示例。

默认格式

一个时段字符串最多包含两个部分:

  • 开始和结束时间(例如 "0900-1730"),
  • 以及,可选地,该时段活跃的星期几,用数字表示(":23456" 代表周一到周五)

组合起来,就构成了一个像 "0900-1730:23456" 这样的时段字符串。

每个时段字符串都遵循这个特定的格式:

session_start-session_end[,sessionN_start-sessionN_end][:days]
  • session_startsession_end 是时段的开始和结束时间。
    • 这些时间采用24小时制的 hhmm 格式。所以,下午3点表示为 1500
    • 小时和分钟之间没有冒号(:);10:30变为 1030
    • 单位数的小时前需要加一个零;9:00表示为 0900
    • 单位数的分钟前也需要加一个零;12:05表示为 1205
    • 午夜 (0:00) 用四个零表示:0000
    • 一个短横线(-)用于分隔开始和结束时间;0930-1600 代表从9:30到16:00的时段。
    • 要指定多个时段,我们用逗号(,)将它们分开;0800-1700,1830-2300 代表一个从8:00到17:00的时段,然后休息到18:30,之后交易继续直到23:00。
  • days 是一个可选的数字集合,用于指定该时段在一周的哪几天活跃。
    • 每一天都有自己的编号:
      • 1代表星期日,
      • 2代表星期一,
      • 3代表星期二,
      • 4代表星期三,
      • 5代表星期四,
      • 6代表星期五,
      • 7代表星期六。
    • 为了将日期数字与时间分开,我们使用一个冒号(:)字符。所以我们有:"start-end:days",例如 "0900-2200:23456"
    • 默认情况下,一个时段在一周的所有七天都活跃(所以是 1234567)。如果我们想要一个时段只用于某些天,那么我们需要自己指定那些天。
    • 一个在工作日活跃的时段表示为:23456
    • 对于一个只在周末活跃的时段,我们使用 7117 代表星期六 (7) 和星期日 (1)。
    • 以递增顺序列出天数可以使时段字符串更易于阅读,但并非强制:426 仍然会创建一个在星期三 (4)、星期一 (2) 和星期五 (6) 活跃的时段。
  • Pine Script将隔夜时段匹配到它们结束的那一天,而不是它们开始的那一天。
    • 所以 2300-0700:23456 是一个在周一 (2) 早上7:00结束的隔夜时段(但它实际上在周日晚上开盘,尽管我们没有使用代表周日的数字1)。

我们主要通过三个Pine Script函数来使用时段字符串:

  • input.session() 函数,其中时段字符串用于定义输入项的默认时段。
  • time() 函数,它检查K线的开盘时间是否落在时段字符串定义的时间段内。
  • 以及 time_close() 函数,用于查看K线的收盘时间是否发生在时段字符串定义的时间间隔内。

交易时段的类型

时段字符串非常灵活,并提供了大量的自定义选项。我们可以使用它们以四种不同的方式来定义交易时间:

  • 一个每日时段"0900-1630"
  • 一个带有交易休息的每日时段"0900-1630,1800-2200"
  • 一个隔夜时段"2200-0730"
  • 一个带有交易暂停的隔夜时段"2200-0730,0830-1630"

每种时段类型也都可以定义它在一周的哪几天是活跃的。如果我们不设置这些天,该时段默认在一周的所有七天都活跃。

时段字符串范例

让我们看看可以用上面讨论的默认格式创建什么样的时段字符串。

单个时段字符串

  • "0800-2200" 一个从早上8:00开始到晚上22:00(晚上10点)结束的时段。它适用于一周的所有七天。
  • "0000-0000" 一个7天、24小时的时段,在午夜开始和结束。它在一周的所有七天都活跃。
  • "2100-0830" 一个在21:00开始并在第二天8:30结束的隔夜时段。它适用于一周的所有日子。

带日期的单个时段

  • "0930-1700:23456" 一个在9:30开始并在当天17:00结束的交易时段,适用于所有工作日(周一到周五)。
  • "0000-0000:1234567" 一个在午夜开始(和结束)的24小时时段。它适用于周日到周六。由于时段默认在所有星期几都运行,"0000-0000" 是等效的时段。
  • "1600-1600:23456" 一个在16:00开始和结束的24小时时段。它从周一到周五活跃。
  • "0800-2200:456" 一个在星期三 (4)、星期四 (5) 和星期五 (6) 的8:00开始并在22:00点结束的时段。
  • "1705-1700:1234567" 一个在17:05开始并持续到第二天17:00的隔夜时段。交易然后停止5分钟,之后一个新时段开始。它适用于一周的所有日子。
  • "2200-1700:23456" 一个在22:00开盘并在第二天17:00结束的隔夜时段。星期一的时段在周日晚上22:00开始并在周一17:00结束。这些时段一周发生五次,从星期一 (2) 到星期五 (6)。

多个时段

  • "0900-1600,1700-2200" 一个在9:00开始并在16:00暂停的时段。然后在17:00恢复交易并在当天22:00最终关闭。它适用于一周的每一天。
  • "0800-1530,1630-2300:23456" 一个在8:00开始并在15:30停止,在16:30恢复直到23:00点的时段。它在工作日活跃,但在星期六 (7) 和星期日 (1) 不活跃。

不常见的时段字符串

  • "24x7" 一个在午夜 (0:00点) 开始的7天、24小时时段。这等同于 "0000-0000""0000-0000:1234567"。注意 "24x5" 不是一个有效的时段字符串。
  • "2000-2001:246" 一个奇怪的时段,只在星期一 (2)、星期三 (4) 和星期五 (6) 持续一分钟。

时段字符串的特性

  • 时段字符串不依赖于交易所为该交易品种定义的交易时段。通过时段字符串,我们可以选择任何我们想要的交易时间,而不受该交易品种常规和延长交易时间的限制。
  • 一个时段字符串不必是一个固定的字面字符串。我们也可以通过使用 + 运算符来拼接字符串片段或变量,从而动态地构建一个时段字符串。例如,通过这种方式,一个时段输入(session input)可以用来设置交易时间,而一个字符串输入(string input)则可以用来指定交易日。当我们将这两者结合起来时,就得到了一个完整的时段字符串。
  • 在Pine Script版本4及更早的版本中,一个时段字符串的默认生效日期是周一到周五(23456)。在Pine Script 5中,这个默认值改为了每周的所有天(1234567)。要恢复到之前的行为,我们需要在时段字符串中明确地指定所有的工作日。例如:"0900-1730:23456"

时段字符串的局限性

  • 一个时段的最大长度是24小时。我们不能定义比这更长的交易间隔。
  • 一个时段字符串本身无法指定其时区。这需要使用另一种字符串,即时区字符串。然后,我们将时段字符串时区字符串一起用于 time()time_close() 函数,来判断当前K线是否发生在给定交易时区的指定时段内。

使用时段输入时的局限性

当我们使用由 input.session() 函数创建的时段输入时,还有两个额外的局限性。我们来看一下。

无法设置星期几

要为一个时段输入设置默认值,我们使用时段字符串,就像我们上面讨论的那样。但如果一个时段字符串指定了星期几,它将无法正常工作。

最初,作为默认值,这样一个带日期的时段字符串是有效的。但当用户更改时段输入时,它会自动应用到一周的所有天。

一个好的替代方案是创建一个额外的输入项,并使用该输入来指定时段活跃的星期几。然后我们的代码可以将该输入与时段输入结合,从而得到一个指定了星期几的完整时段字符串。下一节我们就来实现这样一个带日期输入的时段。

无法处理多个时段

虽然一个时段字符串可以指定每天的多个时段(例如 "0900-1600,1700-2300"),但一个时段输入却无法做到这一点。相反,一个时段输入只有一个用于开始时间的输入字段和一个用于结束时间的输入字段。

从技术上讲,我们可以将一个时段输入的默认值设置为多个时段。但一旦用户更改该输入,它就会变为每天一个时段。因此,我们最好为每天不同的时段创建多个时段输入。

总结

  • 我们通过遵循特定格式的字符串来指定自定义的Pine Script时段。
  • 该字符串有一个开始时间,一个短横线(-),和一个结束时间,两者都采用24小时制的 HHmm 格式。例如:"0800-2200"
  • 我们也可以说明该时段在一周的哪几天活跃。我们为此使用数字,从星期日的 1 开始,到星期六的 7 结束。为了分隔时间和日期,我们使用冒号(:),像这样:"0930-1600:23456"
赞(0)
未经允许不得转载:图道交易 » Pine Script(127):时区名称与交易时段字符串详解
分享到

评论 抢沙发

登录

找回密码

注册