OHL C свечей каждые X тиков - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь создать OHL C баров в postgresql, исходя из тиковых данных. Я хочу создавать бары каждые 1000 тиков или каждые 500 тиков. Или каждые X тиков.

В базе данных, которую я сохраняю, есть бид / аск и временная метка. Я знаю, что могу выполнить группировку и сгруппировать их по метке времени, но желаемый результат - это количество тиков.

Один тик состоит из метки времени, цены предложения и цены продажи.

База данных тиков выглядит примерно так:

-------------------------------------------------
|            date           |   bid   |   ask   |
|2020-03-20 19:33:56.044533 | 1.06372 | 1.06384 |
|2020-03-20 19:33:37.205241 | 1.06372 | 1.06384 |
|2020-03-20 19:33:54.943593 | 1.06372 | 1.06383 |
|2020-03-20 19:33:55.183255 | 1.06372 | 1.06384 |

В настоящее время я могу создавать свечи OHL C с этим кодом (спасибо @GordonLinoff, который ответил на мой предыдущий вопрос по этому ссылка ):

select max(date) as date,
       (array_agg(bid order by seqnum asc))[1] as open,
       max(bid) as high,
       min(bid) as low,
       (array_agg(bid order by seqnum desc))[1] as close


from (
    select t.*, row_number() over (order by date) as seqnum
      from ticks t) as a

group by floor((seqnum - 1) / 1000);

И результат выглядит так:

---------------------------------------------------------------------------
|            date           |   open   |    high    |    low   |   close   |
|2020-03-20 19:33:56.044533 | 1.06372  |   1.07104  |  1.06001 |  1.06579  |

То есть 1 свеча. Цифры взяты из столбца ставок. Цена открытия - это первая зарегистрированная цена, цена закрытия - последняя зарегистрированная цена, а максимум и минимум - это максимальная и минимальная цены, зарегистрированные в этих X тиках.

Итак, если X равно 1000 и предполагается, что индекс начинается с 0, цены OHL C будут следующими: - open: цена в индексе 0 - high: максимальная цена между индексом 0 и 999 - low: минимальная цена между индексом 0 и 999 - close: цена в индексе 999

То есть на первые 1000 тиков. Затем следующие свечи создаются следующими 1000 тиками. - открытие: цена в индексе 1000 - максимум: максимальная цена между индексом 1000 и 1999 - минимум: минимальная цена между индексом 1000 и 1999 - закрытие: цена в индексе 1999

Часть, которую мне не хватает в том, что я хотел бы создавать свечи, только если у меня есть необходимое количество тиков. Например, если у меня 10500 тиков, я хотел бы иметь только 10 строк и не учитывать остальные 500 оставшихся тиков, пока сумма не станет 11000.

Как я могу этого добиться?

Заранее спасибо!

1 Ответ

1 голос
/ 06 мая 2020

Я понимаю, о чем вы спрашиваете. Вам просто нужно предложение having:

select max(date) as date,
       (array_agg(bid order by seqnum asc))[1] as open,
       max(bid) as high,
       min(bid) as low,
       (array_agg(bid order by seqnum desc))[1] as close
from (select t.*, row_number() over (order by date) as seqnum
      from ticks t
     ) t
group by floor((seqnum - 1) / 1000)
having count(*) = 1000;

Я действительно думал, что вам нужно было сложнее.

Если вам нужны самые свежие данные, то определите row_number() в обратный порядок:

row_number() over (order by date desc)

EDIT:

Избавимся от функций массива:

select max(date) as date,
       max(bid) filter (where mod(seqnum, 1000) = 1) as open,
       max(bid) as high,
       min(bid) as low,
       max(bid) filter (where mod(seqnum, 1000) = 999) as close
from (select t.*, row_number() over (order by date) as seqnum
      from ticks t
     ) t
group by floor((seqnum - 1) / 1000)
having count(*) = 1000;
...