我如何在 PostgreSQL 中创建范围交易柱?
How can I create range trading bars in PostgreSQL?
我正在尝试通过对价格移动的每个 X 范围内的数据进行分组来创建交易栏。数据来自 tick,每个 tick 都有时间戳和价格值。
数据集如下所示:
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 小时结束采样)。在这个例子中,selected 范围是 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
中的价格。为了获得 high
和 low
价格,我 select 从 k
到 j+1
的 max
和 min
价格。最后,如果不满足条件,那么一旦我们到达数据末尾,它就会中断循环。
我如何在 SQL 中复制它,以便在满足所需范围时创建柱状图,而不考虑过程中的多余报价?例如,如果我有 10500 个跳动点并且前 10000 个跳动点满足创建 10 个柱的条件,那么我只想创建这 10 个柱并忽略其他 500 个跳动,直到有足够的跳动来创建另一个 X 点数柱。
我怎样才能做到这一点?
提前致谢!
编辑:这是创建两个柱的示例。
Les 假设所需的范围是 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
您是要通过 SQL 查询还是 PL/pgSQL 存储过程来创建它?看起来这可以通过使用带有 GROUP BY 子句的 SQL 查询/ WINDOW 函数来实现。这是未经测试的代码版本。希望这会给出实现此目标的想法?
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)
我正在尝试通过对价格移动的每个 X 范围内的数据进行分组来创建交易栏。数据来自 tick,每个 tick 都有时间戳和价格值。
数据集如下所示:
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 小时结束采样)。在这个例子中,selected 范围是 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
中的价格。为了获得 high
和 low
价格,我 select 从 k
到 j+1
的 max
和 min
价格。最后,如果不满足条件,那么一旦我们到达数据末尾,它就会中断循环。
我如何在 SQL 中复制它,以便在满足所需范围时创建柱状图,而不考虑过程中的多余报价?例如,如果我有 10500 个跳动点并且前 10000 个跳动点满足创建 10 个柱的条件,那么我只想创建这 10 个柱并忽略其他 500 个跳动,直到有足够的跳动来创建另一个 X 点数柱。
我怎样才能做到这一点?
提前致谢!
编辑:这是创建两个柱的示例。 Les 假设所需的范围是 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
您是要通过 SQL 查询还是 PL/pgSQL 存储过程来创建它?看起来这可以通过使用带有 GROUP BY 子句的 SQL 查询/ WINDOW 函数来实现。这是未经测试的代码版本。希望这会给出实现此目标的想法?
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)