PolymarketClickHouse Workshops

04 Agregat real-time

Baca OHLC midpoint quote per menit yang dipelihara oleh materialized view inkremental.

Your computer
macOS terminal: Run workshop commands in Terminal using zsh or bash.

Titik awal

Collector sudah healthy dan polymarket.price_ticks berisi baris data.

Mengapa

Pengguna dashboard berulang kali meminta seri per menit yang sama. Menghitungnya sekali saat blok baru masuk memindahkan pekerjaan dari setiap refresh dashboard ke waktu insert. Tabel raw tetap tersedia untuk pertanyaan ad-hoc.

Langkah 1 — Kueri aggregate state dengan benar

SELECT
    minute,
    token_id,
    round(argMinMerge(open) * 100, 2) AS open_percent,
    round(maxMerge(high) * 100, 2) AS high_percent,
    round(minMerge(low) * 100, 2) AS low_percent,
    round(argMaxMerge(close) * 100, 2) AS close_percent,
    countMerge(updates) AS updates
FROM polymarket.market_midpoints_1m
WHERE minute >= now() - INTERVAL 30 MINUTE
GROUP BY minute, token_id
ORDER BY minute DESC, token_id
LIMIT 30;

argMinState/argMaxState ditulis oleh view tersebut; query ini memfinalisasinya dengan fungsi Merge yang bersesuaian. Open dan close memakai waktu event ditambah event ID yang deterministik, sehingga kedatangan yang tidak berurutan dan seri pada milidetik yang sama terselesaikan secara konsisten.

Langkah 2 — Bandingkan baris yang dibaca query raw dan query agregat

Jalankan padanan raw-nya:

SELECT
    toStartOfMinute(event_at) AS minute,
    token_id,
    round(argMin(midpoint, tuple(event_at, event_id)) * 100, 2) AS open_percent,
    round(max(midpoint) * 100, 2) AS high_percent,
    round(min(midpoint) * 100, 2) AS low_percent,
    round(argMax(midpoint, tuple(event_at, event_id)) * 100, 2) AS close_percent,
    count() AS updates
FROM polymarket.price_ticks
WHERE midpoint > 0
  AND event_at >= now() - INTERVAL 30 MINUTE
  AND event_kind IN ('book_snapshot', 'price_change', 'best_bid_ask', 'rest_book')
GROUP BY minute, token_id
ORDER BY minute DESC, token_id
LIMIT 30;

Di SQL console, bandingkan read rows kedua query itu. Query agregat membaca state setingkat blok yang digabungkan AggregatingMergeTree di background, biasanya jauh lebih sedikit barisnya dibanding memindai setiap update sumber.

Langkah 3 — Verifikasi view digerakkan oleh insert

SELECT
    max(minute) AS newest_minute,
    dateDiff('second', newest_minute, now()) AS age_seconds,
    countMerge(updates) AS source_updates
FROM polymarket.market_midpoints_1m;

Dalam mode live maupun fixture, newest_minute bergerak maju tanpa job refresh terjadwal.

Selesai bila

  • query agregat mengembalikan baris OHLC;
  • open/high/low/close berupa probabilitas antara 0 dan 100; dan
  • newest_minute terkini untuk feed yang aktif.

Berikutnya: selidiki sebuah pergerakan market.

Di halaman ini

Track your progress?

Optional. We email a link to confirm your address; progress records once you open it.

Please use your work email address, not a personal one.

Progress tracking also requires accepting the current Terms of Service in Privacy settings.

ID