OHLC 蜡烛每 X 数量的刻度
OHLC candles every X amount of ticks
我正在尝试从报价数据开始在 postgresql 中创建 OHLC 柱。我想每 1000 个跳动点或每 500 个跳动点创建一个柱。或者每 X 笔报价。
我保存的数据库有 bid/ask 和时间戳。我知道我可以做一个 groupby 并按时间戳对它们进行分组,但所需的输出使用的是刻度数。
一个报价由时间戳、买价和卖价组成。
报价数据库看起来像这样:
-------------------------------------------------
| date | bid | ask |
|2020-03-20 19:33:56.044533 | 1.06372 | 1.06384 |
|2020-03-20 19:33:37.205241 | 1.06372 | 1.06384 |
|2020-03-20 19:33:54.943593 | 1.06372 | 1.06383 |
|2020-03-20 19:33:55.183255 | 1.06372 | 1.06384 |
我目前可以使用此代码创建 OHLC 蜡烛(感谢@GordonLinoff,他回答了我之前关于此 的问题):
select max(date) as date,
(array_agg(bid order by seqnum asc))[1] as open,
max(bid) as high,
min(bid) as low,
(array_agg(bid order by seqnum desc))[1] as close
from (
select t.*, row_number() over (order by date) as seqnum
from ticks t) as a
group by floor((seqnum - 1) / 1000);
输出如下所示:
---------------------------------------------------------------------------
| date | open | high | low | close |
|2020-03-20 19:33:56.044533 | 1.06372 | 1.07104 | 1.06001 | 1.06579 |
那是 1 支蜡烛。数字来自出价栏。开盘价是第一个注册的价格,收盘价是最后一个注册的价格,最高价和最低价是那些 X 个报价中注册的最高价和最低价。
因此,如果 X 为 1000 并假设指数从 0 开始,则 OHLC 价格将如下所示:
- 开盘:指数 0 的价格
- 高:索引 0 和 999 之间的最高价格
- 低:指数 0 和 999 之间的最低价格
- 收盘价:指数 999
的价格
这是前 1000 个刻度。然后下一个蜡烛由接下来的 1000 个滴答声创建。
- 开盘价:指数 1000
- 高:指数 1000 和 1999 之间的最高价格
- 低:指数 1000 和 1999 之间的最低价格
- 收盘价:指数 1999 的价格
我缺少的部分是,只有当我有所需数量的刻度时,我才想创建蜡烛。例如,如果我有 10500 个刻度,那么我希望只有 10 行并且在数量为 11000 之前不考虑其他 500 个剩余刻度。
我怎样才能做到这一点?
提前致谢!
我明白你在问什么了。您只需要一个 having
子句:
select max(date) as date,
(array_agg(bid order by seqnum asc))[1] as open,
max(bid) as high,
min(bid) as low,
(array_agg(bid order by seqnum desc))[1] as close
from (select t.*, row_number() over (order by date) as seqnum
from ticks t
) t
group by floor((seqnum - 1) / 1000)
having count(*) = 1000;
其实我以为你需要的更复杂。
如果你想要最新的数据,那么按相反的顺序定义row_number()
:
row_number() over (order by date desc)
编辑:
让我们去掉数组函数:
select max(date) as date,
max(bid) filter (where mod(seqnum, 1000) = 1) as open,
max(bid) as high,
min(bid) as low,
max(bid) filter (where mod(seqnum, 1000) = 999) as close
from (select t.*, row_number() over (order by date) as seqnum
from ticks t
) t
group by floor((seqnum - 1) / 1000)
having count(*) = 1000;
我正在尝试从报价数据开始在 postgresql 中创建 OHLC 柱。我想每 1000 个跳动点或每 500 个跳动点创建一个柱。或者每 X 笔报价。
我保存的数据库有 bid/ask 和时间戳。我知道我可以做一个 groupby 并按时间戳对它们进行分组,但所需的输出使用的是刻度数。
一个报价由时间戳、买价和卖价组成。
报价数据库看起来像这样:
-------------------------------------------------
| date | bid | ask |
|2020-03-20 19:33:56.044533 | 1.06372 | 1.06384 |
|2020-03-20 19:33:37.205241 | 1.06372 | 1.06384 |
|2020-03-20 19:33:54.943593 | 1.06372 | 1.06383 |
|2020-03-20 19:33:55.183255 | 1.06372 | 1.06384 |
我目前可以使用此代码创建 OHLC 蜡烛(感谢@GordonLinoff,他回答了我之前关于此
select max(date) as date,
(array_agg(bid order by seqnum asc))[1] as open,
max(bid) as high,
min(bid) as low,
(array_agg(bid order by seqnum desc))[1] as close
from (
select t.*, row_number() over (order by date) as seqnum
from ticks t) as a
group by floor((seqnum - 1) / 1000);
输出如下所示:
---------------------------------------------------------------------------
| date | open | high | low | close |
|2020-03-20 19:33:56.044533 | 1.06372 | 1.07104 | 1.06001 | 1.06579 |
那是 1 支蜡烛。数字来自出价栏。开盘价是第一个注册的价格,收盘价是最后一个注册的价格,最高价和最低价是那些 X 个报价中注册的最高价和最低价。
因此,如果 X 为 1000 并假设指数从 0 开始,则 OHLC 价格将如下所示: - 开盘:指数 0 的价格 - 高:索引 0 和 999 之间的最高价格 - 低:指数 0 和 999 之间的最低价格 - 收盘价:指数 999
的价格这是前 1000 个刻度。然后下一个蜡烛由接下来的 1000 个滴答声创建。 - 开盘价:指数 1000 - 高:指数 1000 和 1999 之间的最高价格 - 低:指数 1000 和 1999 之间的最低价格 - 收盘价:指数 1999 的价格
我缺少的部分是,只有当我有所需数量的刻度时,我才想创建蜡烛。例如,如果我有 10500 个刻度,那么我希望只有 10 行并且在数量为 11000 之前不考虑其他 500 个剩余刻度。
我怎样才能做到这一点?
提前致谢!
我明白你在问什么了。您只需要一个 having
子句:
select max(date) as date,
(array_agg(bid order by seqnum asc))[1] as open,
max(bid) as high,
min(bid) as low,
(array_agg(bid order by seqnum desc))[1] as close
from (select t.*, row_number() over (order by date) as seqnum
from ticks t
) t
group by floor((seqnum - 1) / 1000)
having count(*) = 1000;
其实我以为你需要的更复杂。
如果你想要最新的数据,那么按相反的顺序定义row_number()
:
row_number() over (order by date desc)
编辑:
让我们去掉数组函数:
select max(date) as date,
max(bid) filter (where mod(seqnum, 1000) = 1) as open,
max(bid) as high,
min(bid) as low,
max(bid) filter (where mod(seqnum, 1000) = 999) as close
from (select t.*, row_number() over (order by date) as seqnum
from ticks t
) t
group by floor((seqnum - 1) / 1000)
having count(*) = 1000;