Skip to content

Instantly share code, notes, and snippets.

@zmts
Last active January 19, 2025 19:40
Show Gist options
  • Save zmts/85cd5836811b948303020bc076b517bc to your computer and use it in GitHub Desktop.
Save zmts/85cd5836811b948303020bc076b517bc to your computer and use it in GitHub Desktop.
Aggregation of minute candles into 5-minute candles

SQL: Aggregation of minute candles into 5-minute candles

CREATE "ohlc_minutes" (
    "id" int4 NOT NULL DEFAULT nextval('ohlc_minutes_id_seq'::regclass),
    "ticker" varchar NOT NULL,
    "date" timestamptz NOT NULL,
    "open" numeric(20,8) NOT NULL,
    "high" numeric(20,8) NOT NULL,
    "low" numeric(20,8) NOT NULL,
    "close" numeric(20,8) NOT NULL,
    PRIMARY KEY ("id")
);

Query:

SELECT
  to_timestamp(floor(EXTRACT(EPOCH FROM date) / 300) * 300) AS group_date,
  (array_agg(open ORDER BY date ASC)) [1] AS OPEN, -- Take the first open candle in the group
	MAX(high) AS high,
	MIN(low) AS low,
	(array_agg(close ORDER BY date DESC)) [1] AS CLOSE, -- Take the last closed candle in the group
  COUNT(*) AS minutes_count
FROM ohlc_minutes
WHERE ticker = 'BTCUSD'
GROUP BY ticker, group_date
ORDER BY group_date;

Группировка по времени:

to_timestamp(floor(EXTRACT(EPOCH FROM date) / 300) * 300) AS group_date - преобразует временные метки в интервалы по 5 минут (300 секунд). Это позволяет сгруппировать данные по 5-минутным интервалам.

Агрегация данных:

(array_agg(open ORDER BY date ASC)) [1] AS OPEN - сортирует (по возрастанию) все значения группы как массив и выбирает первую цену как цену открытия.

MAX(high) AS high - находит максимальную цену в группе.

MIN(low) AS low - находит минимальную цену в группе.

(array_agg(close ORDER BY date DESC)) [1] AS CLOSE сортирует (по убыванию) все значения группы как массив и выбирает первую цену как цену закрытия.

COUNT(*) AS minutes_count - считает количество записей (минут) в каждой группе.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment