如何根据登录sql求和?财务技术指标

如何根据登录sql求和?财务技术指标,sql,postgresql,trading,technical-indicator,Sql,Postgresql,Trading,Technical Indicator,我正试图在postgresql中构建一些技术指标的自定义函数,我的脑海中出现了一些疑问。第一个问题是,如果有任何库或插件已经有了这个指标,比如移动平均值、RSI、MACD、RSI、MFI等 我的第二个问题是关于我试图编写的一个指标。货币流动指数指标定义如下: 计算典型价格:高+低+收盘/3 计算原始资金流:典型价格x数量 计算货币流比率:14期正货币流/14期负货币流** 计算货币流量指数:100–100/1+货币流量比率 我已经做的是: with actual_close as ( s

我正试图在postgresql中构建一些技术指标的自定义函数,我的脑海中出现了一些疑问。第一个问题是,如果有任何库或插件已经有了这个指标,比如移动平均值、RSI、MACD、RSI、MFI等

我的第二个问题是关于我试图编写的一个指标。货币流动指数指标定义如下:

计算典型价格:高+低+收盘/3 计算原始资金流:典型价格x数量 计算货币流比率:14期正货币流/14期负货币流** 计算货币流量指数:100–100/1+货币流量比率 我已经做的是:

with actual_close as (
    select 
    date, 
    (high+low+close)/3*1000 v_ty_price,  --This is the typical price x volume, since in this case is always 1000
    close actual_close
    from eurusd_ohlc
), 
prev_close as(
                select date,
                      v_ty_price,
                      actual_close,
                      lag(actual_close,1) over(order by date) prev_close 
                      from actual_close), 
totals as (
    select date,
           v_ty_price, 
           actual_close, 
           prev_close, 
           actual_close-prev_close close_dif 
           from prev_close
)

select date, sum(close_dif) over(rows between 14 preceding and current row) from totals 
这将产生以下输出:

-------------------------------------------------------
|          date             |         sum             |
|2020-02-20 03:27:35.140751 |         NULL            |
|2020-02-20 04:19:17.088462 |   -6.000000000017103e-05|
|2020-02-20 05:54:44.060929 |           0             |
|2020-02-20 06:41:32.916934 |   -0.0006200000000000649|
此输出应在**中使用。这一部分将是:

抓住最后14排 将所有正数相加,将所有负数相加 将所有正的和除以所有负的。 因此,假设最后14行如下所示:

sum
-0.1
-0.6
1.2
0.1
1.5
-1
1
-0.2
0
-1
1
1.5
1.1
-1.1
因此,每一笔金额应为:

位置和=1.2+0.1+1.5+1+0+1+1+1.5+1.1

负和=0.1+0.6+1+0.2+1+1.1

然后将货币流动比率计算为pos_sum/neg_sum OBS:MFI是介于0和100之间的有界指标,如果neg_sum=0,则货币流动比率为100

最后,通过100–100/1+货币流量比率计算货币流动指数

我遇到麻烦的部分是计算正和负和。我如何计算这些项并以滚动方式进行计算?或移动窗口


提前谢谢你!任何建议都非常感谢:

如果您已经选择了14行作为表,那么您可以得到正和负和,如下所示

我将您的sum列重命名为sum\u col


我觉得你的问题很难理解。但关注这一部分:

此输出应在**中使用。这一部分将是:

抓住最后14排 将所有正数相加,将所有负数相加 将所有正的和除以所有负的。 如果您想要一个运行总和,请使用窗口函数:

select t.*,
       (sum(number) filter (where number > 0) over w /
        sum(number) filter (where number < 0) over w
       )
from t
window w as (order by number rows between 13 preceding and current row)

我对如何将此应用于您问题中的查询感到有点困惑。这比你要问的问题要复杂得多。

谢谢你的回答,卡洛斯。数据集有超过14行。它实际上有7000多行,而且会越来越大。我需要的是用滚动窗口来计算,比如移动平均线。对是的。非常感谢
WITH SUM_TABLE AS (
SELECT
date,
SUM(CASE WHEN sum_col>=0 THEN sum_col ELSE 0 END) OVER(ORDER BY date ROWS BETWEEN 13 PRECEDING AND CURRENT ROW) AS POS_SUM,
SUM(CASE WHEN sum_col<0 THEN sum_col ELSE 0 END) OVER(ORDER BY date ROWS BETWEEN 13 PRECEDING AND CURRENT ROW) AS NEG_SUM
FROM table)
SELECT
date,
CASE WHEN NEG_SUM=0 THEN 100 ELSE POS_SUM/NEG_SUM END AS MFR,
CASE WHEN NEG_SUM=0 THEN 100-100/(1+100) ELSE 100-100/(1 + (POS_SUM/NEG_SUM)) END AS MFI
FROM SUM_TABLE

select t.*,
       (sum(number) filter (where number > 0) over w /
        sum(number) filter (where number < 0) over w
       )
from t
window w as (order by number rows between 13 preceding and current row)