如何在PostgreSQL中创建范围交易条?

问题描述

我正在尝试通过将价格移动的每个X范围内的数据分组来创建交易栏。数据来自刻度线,每个刻度线都有时间戳和价格。

数据集如下:

date                        price
"2020-02-03 02:00:00.207"   1.10890
"2020-02-03 02:00:00.258"   1.10887
"2020-02-03 02:00:00.461"   1.10887
"2020-02-03 02:00:00.613"   1.10886

当价格移动X距离时,我想“创建”一个柱线。该距离以点为单位,例如,如果价格从1.10000到1.10010波动1点,则该距离为单位。 (交易条形图或烛台定义为在给定条件下资产价格的变动。例如,每小时采样1小时条形图,它们具有开盘价,低价,高价和收盘价。因此, 00:00:00小时,条形在01:00:00小时结束采样)。在此示例中,所选范围为10点,因此我想每10点对一个条进行采样(或创建)。

我有一个python脚本可以创建所需的条形,但是我想将此作为SQL触发器。我使用的python函数如下:

def generate_rangebars(data,range_pips=10,point_value=0.0001):
    _o,_h,_l,_c,_d=[],[],[]
    k = 0
    prices = data.to_numpy()
    while True:
        for j in range(k,len(prices)):
            if np.abs(prices[k]-prices[j])/point_value>=range_pips:
                _d.append(pd.to_datetime(times[j],format= "%d.%m.%Y %H:%M:%S.%f"))
                _o.append(prices[k])
                _h.append(np.max(prices[k:j+1]))
                _l.append(np.min(prices[k:j+1]))
                _c.append(prices[j])
                
                k=j
                break
        if j == len(prices)-1:
            break

因此,基本上,我从索引0开始,并遍历了价格数组。如果price[j]与0的价格之间的差的绝对值大于期望的范围,则存储price[j]的日期。在这种情况下,柱线的open价格将是k中的价格,收盘价将是j中的价格。为了获得highlow的价格,我选择了maxmin的{​​{1}}和k价格。最后,如果不满足条件,那么一旦到达数据末尾,它将中断循环。

我该如何在SQL中复制此代码,以便在满足所需范围时创建小节,而不考虑过程中多余的滴答声?例如,如果我有10500个刻度,并且前10000个刻度满足创建10条的条件,那么我只想创建那10条,而忽略其他500条,直到有足够的刻度来创建另一个X点条。 / p>

我该如何实现?

提前谢谢!

编辑:这是创建两个小节的示例。 Les认为期望的范围是1点,我们有这个数据。

j+1

因此,我们的开盘价为1.10886,收盘价为1.10890,最高价和最低价是 date price "2020-02-03 02:00:00.207" 1.10880 "2020-02-03 02:00:00.258" 1.10887 "2020-02-03 02:00:00.461" 1.10887 "2020-02-03 02:00:00.613" 1.10886 "2020-02-03 02:00:00.753" 1.10888 "2020-02-03 02:00:01.200" 1.10889 "2020-02-03 02:00:01.268" 1.10890 -->1 Pip! "2020-02-03 02:00:01.439" 1.10886 "2020-02-03 02:00:00.207"之间的最大值和最小值。 所以我们的栏看起来像这样:

"2020-02-03 02:00:01.268"

现在,我们使用此值--------------------------------------------------------------------------- | date | open | high | low | close | |2020-02-03 02:00:01.268000 | 1.10880 | 1.10890 | 1.10880 | 1.10890 | ,并搜索来自"2020-02-03 02:00:01.268"的所有报价,并期待另一个1点的范围。

"2020-02-03 02:00:01.268"

因此,在这种情况下,条形的值是:

        date                        price
        "2020-02-03 02:00:01.268"   1.10890 -->Last 1 Pip!
        "2020-02-03 02:00:01.439"   1.10886
        "2020-02-03 02:00:01.607"   1.10883
        "2020-02-03 02:00:01.895"   1.10885
        "2020-02-03 02:00:02.125"   1.10890
        "2020-02-03 02:00:02.971"   1.10895
        "2020-02-03 02:00:03.045"   1.10898
        "2020-02-03 02:00:03.200"   1.10105 --> (More than )1 Pip!

解决方法

您是否要通过SQL查询或PL / pgSQL存储过程创建此文件?看起来这可以通过使用带有GROUP BY子句/ WINDOW函数的SQL查询来实现。这是未经测试的代码版本。希望这能给实现一个想法?

SELECT first_value (price) OVER w AS open,MAX(price) OVER w AS high,MIN(price) OVER w as low,last_value(price) OVER w as close,date_trunc('required interval here',date)
FROM table
WINDOW w AS (PARTITION BY date_trunc('required interval here',date) ORDER BY date)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...