0

我正在尝试通过对价格移动的每个 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并遍历价格数组。如果与 0 处的价格之间的差值的绝对值price[j]大于所需范围,则我存储price[j]. open在这种情况下,柱的价格将是 in 的价格,而k收盘价将是 in 的价格j。要获得highlow价格,我从至选择maxmin价格。最后,如果条件不满足,那么一旦我们到达数据的末尾,它就会中断循环。kj+1

如何在 SQL 中复制它,以便在满足所需范围时创建条形图,而不考虑过程中多余的刻度?例如,如果我有 10500 个刻度并且前 10000 个刻度满足创建 10 个柱的条件,那么我想只创建这 10 个柱并忽略其他 500 个刻度,直到有足够的刻度来创建另一个 X 点柱。

我怎样才能做到这一点?

先感谢您!

编辑:这是创建两个条的示例。假设期望的范围是 1 点,我们有这个数据。

    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

所以,我们的开盘价是 1.10886,收盘价是 1.10890,最高价和最低价是 和 之间的最大值和"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"并搜索所有来自的报价,"2020-02-03 02:00:01.268"并期待另一个 1 点的范围。

        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!

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

---------------------------------------------------------------------------
|            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:03.200000 | 1.10890  |   1.10105  |  1.10883 |  1.10105  |->new bar
4

1 回答 1

0

您是否希望通过 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)
于 2020-09-26T11:18:30.523 回答