bar

语法

bar(X, interval, [closed=’left’])

相关函数:dailyAlignedBar

参数

X 是一个整型/时间类型的标量或向量。

interval 是一个非空且大于0的整型/DURATION 类型的标量或和 X 长度相同的向量。

interval 是 DURATION 类型时,支持以下时间单位(区分大小写):w, d, H, m, s, ms, us, ns。

注:由于 interval 不支持年(y)和月(M)的时间单位,如果需要对 X 以年或月进行分组时,可以调用 yearmonthX 进行转换后,指定 interval 为整数进行计算。可以参考 Example 2。

New in version 1.30.17: 参数 closed

closed 字符串,可选值为 ‘left’ 或 ‘right’, 表示分组的两种方式。默认值为 ‘left’。

其对应的分组计算公式和说明为(结果为每组的 tag):

  • closed = ‘left’: X-(X % interval),表示将余数为 0 的值作为一个分组的左边界,即余数为 0 的组为每组的第一个元素。

  • closed = ‘right’: iif((X % interval) == 0, X, X + (interval-(X % interval))),表示将余数为 0 的值作为一个分组的右边界,即余数为 0 的组为每组的最后一个元素。

详情

bar 基于 interval 指定的长度,对 X 进行分组。具体做法为:根据分组计算公式,将 X 中每一个元素映射到对应的组中。它返回一个和 X 具有相同长度的向量。

例子

$ bar(100,3);               // 100-(100%3)=100-1=99
99

$ bar(0..15, 3)
[0,0,0,3,3,3,6,6,6,9,9,9,12,12,12,15]

$ x=[7,4,5,8,9,3,3,5,2,6,12,1,0,-5,32]
$ bar(x, 5)
[5,0,5,5,5,0,0,5,0,5,10,0,0,-5,30]

$ t=table(2021.01.01T01:00:00..2021.01.01T01:00:29 as time, rand(1.0, 30) as x)
$ select max(x) from t group by bar(time,5s)

bar_time

max_x

2021.01.01T01:00:00

0.539024

2021.01.01T01:00:05

0.793327

2021.01.01T01:00:10

0.958522

2021.01.01T01:00:15

0.96987

2021.01.01T01:00:20

0.827086

2021.01.01T01:00:25

0.617353

下例中,以3个月进行分组,需要将 bar 函数中的 X 转为月份:

$ t=table(take(2018.01.01T01:00:00+1..10,10) join take(2018.02.01T02:00:00+1..10,10) join take(2018.03.01T08:00:00+1..10,10) join take(2018.04.01T08:00:00+1..10,10) join take(2018.05.01T08:00:00+1..10, 10) as time, rand(1.0, 50) as x)
$ select max(x) from t group by bar(month(time), 3);

bar

max_x

2018.01M

0.9868

2018.04M

0.9243

下例将日期按照周分组,计算每周的最大值。根据 closed 不同,计算结果有所区别。

$ t=table(2022.01.01 + 1..20  as time, rand(100, 20) as x)

time

x

2022.01.02

6

2022.01.03

29

2022.01.04

71

2022.01.05

56

2022.01.06

93

2022.01.07

34

2022.01.08

77

2022.01.09

18

2022.01.10

62

2022.01.11

33

2022.01.12

34

2022.01.13

64

2022.01.14

80

2022.01.15

63

2022.01.16

17

2022.01.17

66

2022.01.18

85

2022.01.19

27

2022.01.20

77

2022.01.21

27

$ select max(x) from t group by bar(time, 7d);

bar_time

max_x

2021.12.30

71

2022.01.06

93

2022.01.13

85

2022.01.20

77

$ print  select max(x) from t group by bar(time, 7d, closed='right');

bar_time

max_x

2021.01.06

93

2022.01.13

77

2022.01.20

85

2022.01.27

27

例3. 计算分钟 k 线时,n 需要转换为 NANOTIMESTAMP,此时若使用整型计算可能造成类型溢出,需要将数据类型转换成 LONG。

 1$ n = 1000000
 2$ nano = (09:30:00.000000000 + rand(long(6.5*60*60*1000000000), n)).sort!()
 3$ price = 100+cumsum(rand(0.02, n)-0.01)
 4$ volume = rand(1000, n)
 5$ symbol = rand(`600519`000001`600000`601766, n)
 6$ tradeNano = table(symbol, nano, price, volume).sortBy!(`symbol`nano)
 7$ undef(`nano`price`volume`symbol)
 8$ barMinutes = 7
 9$ itv = barMinutes*60*long(1000000000)
10
11$ OHLC_nano=select first(price) as open, max(price) as high, min(price) as low, last(price) as close, sum(volume) as volume from tradeNano group by symbol, bar(nano, itv) as barStart