1
+ -- 1 day candle
2
+ CREATE MATERIALIZED VIEW one_day_candle
3
+ WITH (timescaledb .continuous ) AS
4
+ SELECT
5
+ time_bucket(' 1 day' , timestamp ) AS bucket,
6
+ pair_id,
7
+ FIRST(price, timestamp ) AS " open" ,
8
+ MAX (price) AS high,
9
+ MIN (price) AS low,
10
+ LAST(price, timestamp ) AS " close"
11
+ FROM entries
12
+ GROUP BY bucket, pair_id
13
+ WITH NO DATA;
14
+
15
+
16
+ SELECT add_continuous_aggregate_policy(' one_day_candle' ,
17
+ start_offset => INTERVAL ' 3 days' ,
18
+ end_offset => INTERVAL ' 1 day' ,
19
+ schedule_interval => INTERVAL ' 1 day' );
20
+
21
+ -- 1 hour candle
22
+ CREATE MATERIALIZED VIEW one_hour_candle
23
+ WITH (timescaledb .continuous ) AS
24
+ SELECT
25
+ time_bucket(' 1 hour' , timestamp ) AS bucket,
26
+ pair_id,
27
+ FIRST(price, timestamp ) AS " open" ,
28
+ MAX (price) AS high,
29
+ MIN (price) AS low,
30
+ LAST(price, timestamp ) AS " close"
31
+ FROM entries
32
+ GROUP BY bucket, pair_id
33
+ WITH NO DATA;
34
+
35
+ SELECT add_continuous_aggregate_policy(' one_hour_candle' ,
36
+ start_offset => INTERVAL ' 3 hours' ,
37
+ end_offset => INTERVAL ' 1 hour' ,
38
+ schedule_interval => INTERVAL ' 1 hour' );
39
+
40
+ -- 15 minute candle
41
+ CREATE MATERIALIZED VIEW fifteen_minute_candle
42
+ WITH (timescaledb .continuous ) AS
43
+ SELECT
44
+ time_bucket(' 15 minutes' , timestamp ) AS bucket,
45
+ pair_id,
46
+ FIRST(price, timestamp )::numeric AS " open" ,
47
+ MAX (price)::numeric AS high,
48
+ MIN (price)::numeric AS low,
49
+ LAST(price, timestamp )::numeric AS " close"
50
+ FROM entries
51
+ GROUP BY bucket, pair_id
52
+ WITH NO DATA;
53
+
54
+ SELECT add_continuous_aggregate_policy(' fifteen_minute_candle' ,
55
+ start_offset => INTERVAL ' 45 minutes' ,
56
+ end_offset => INTERVAL ' 15 minutes' ,
57
+ schedule_interval => INTERVAL ' 15 minutes' );
58
+
59
+ -- 5 minute candle
60
+ CREATE MATERIALIZED VIEW five_minute_candle
61
+ WITH (timescaledb .continuous ) AS
62
+ SELECT
63
+ time_bucket(' 5 minutes' , timestamp ) AS bucket,
64
+ pair_id,
65
+ FIRST(price, timestamp ) AS " open" ,
66
+ MAX (price) AS high,
67
+ MIN (price) AS low,
68
+ LAST(price, timestamp ) AS " close"
69
+ FROM entries
70
+ GROUP BY bucket, pair_id
71
+ WITH NO DATA;
72
+
73
+ SELECT add_continuous_aggregate_policy(' five_minute_candle' ,
74
+ start_offset => INTERVAL ' 15 minutes' ,
75
+ end_offset => INTERVAL ' 5 minutes' ,
76
+ schedule_interval => INTERVAL ' 5 minutes' );
77
+
78
+ -- 1 minute candle
79
+ CREATE MATERIALIZED VIEW one_minute_candle
80
+ WITH (timescaledb .continuous ) AS
81
+ SELECT
82
+ time_bucket(' 1 minute' , timestamp ) AS bucket,
83
+ pair_id,
84
+ FIRST(price, timestamp ) AS " open" ,
85
+ MAX (price) AS high,
86
+ MIN (price) AS low,
87
+ LAST(price, timestamp ) AS " close"
88
+ FROM entries
89
+ GROUP BY bucket, pair_id
90
+ WITH NO DATA;
91
+
92
+ SELECT add_continuous_aggregate_policy(' one_minute_candle' ,
93
+ start_offset => INTERVAL ' 3 minutes' ,
94
+ end_offset => INTERVAL ' 1 minute' ,
95
+ schedule_interval => INTERVAL ' 1 minute' );
0 commit comments