Я пытаюсь построить какие-то кастомные функции технических индикаторов в postgresql, и у меня возникла пара сомнений. Первый - если это какая-либо библиотека или плагин, в которых уже есть эти индикаторы (обычные, такие как скользящие средние, RSI, MACD, RSI, MFI и т. Д. c).
Мой второй вопрос касается индикатор того, что я пытаюсь кодировать. Индикатор MFI (Money Flow Index) определяется следующим образом:
- Расчет типичной цены: (максимум + минимум + закрытие) / 3
- Расчет исходного денежного потока: типичная цена x объем
- Рассчитайте коэффициент денежного потока: (14-периодный положительный денежный поток) / (14-периодный отрицательный денежный поток) (**)
- Рассчитайте MFI: 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
Таким образом, каждая сумма будет:
pos_sum = 1.2 + 0.1 + 1.5 + 1 + 0 + 1 + 1.5 + 1.1
neg_sum = 0.1 + 0.6 + 1 + 0.2 + 1 + 1.1
Тогда соотношение денежного потока рассчитывается как pos_sum / neg_sum (OBS: MFI - индикатор с ограничением от 0 до 100, если neg_sum = 0, то коэффициент денежного потока равен 100).
Затем, наконец, MFI рассчитывается путем выполнения 100 - 100 / (1 + соотношение денежных потоков).
Часть, где у меня возникают проблемы, - это вычисление pos_sum и neg_sum. Как я могу рассчитать эти сроки и сделать это постоянно? (или движущееся окно)
Заранее спасибо! Любое предложение приветствуется :)