OHLC 蜡烛每 X 个刻度

Posted

技术标签:

【中文标题】OHLC 蜡烛每 X 个刻度【英文标题】:OHLC candles every X amount of ticks 【发布时间】:2020-08-21 10:43:30 【问题描述】:

我正在尝试从刻度数据开始在 postgresql 中创建 OHLC 条。我想每 1000 个刻度或每 500 个刻度创建条形图。或每 X 个刻度。

我正在保存的数据库包含出价/要价和时间戳。我知道我可以进行 groupby 并按时间戳对它们进行分组,但所需的输出是使用刻度数。

一个报价由时间戳、买入价和卖出价组成。

tick 数据库如下所示:

-------------------------------------------------
|            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,他在此 link 上回答了我之前的问题):

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  |

那是一根蜡烛。这些数字来自投标栏。开盘价是第一个记录的价格,收盘价是最后一个记录的价格,最高价和最低价是那些 X 分时记录的最高和最低价格。

因此,如果 X 为 1000,并假设指数从 0 开始,则 OHLC 价格如下: - 开盘价:指数 0 的价格 - 高:指数 0 到 999 之间的最高价格 - 低:指数 0 和 999 之间的最低价格 - 收盘价:指数 999

这是前 1000 个刻度。然后下一个蜡烛由接下来的 1000 个刻度创建。 - 开盘价:指数 1000 的价格 - 高:指数 1000 和 1999 之间的最高价格 - 低:指数 1000 和 1999 之间的最低价格 - 收盘价:1999 年指数价格

我缺少的部分是,只有当我有所需的刻度数时,我才想创建蜡烛。例如,如果我有 10500 个刻度,那么我希望只有 10 行并且在数量为 11000 之前不考虑其他 500 个剩余刻度。

我怎样才能做到这一点?

提前谢谢你!

【问题讨论】:

【参考方案1】:

我明白你在问什么。你只需要一个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;

【讨论】:

你先生,是我的英雄 :) @GordonLinoff 顺便说一下,查询完全符合我的需要,但执行大约需要 34 秒。我打算把它保存在一个视图中,所以我不需要做一个实际的表来使用它。我的想法是使用 Python 脚本进行监控,但如果查询花费这么长时间,这似乎不是一个好主意。有没有办法让视图更快,或者我应该用刻度创建新表?

以上是关于OHLC 蜡烛每 X 个刻度的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas 重采样功能的多个脚本的 OHLC

如何将函数延迟 X 个刻度?

在 R 中,如何在显示日期的 x 轴上添加每月刻度线?

Highcharts 图表删除类别(x 轴)上间隔中的现有刻度

使用时间序列数据和scaleBand在D3条形图上指定刻度

matlab中怎么画出有刻度的空间直角坐标系