PolymarketClickHouse Workshops

04 Agrégats en temps réel

Lisez l'OHLC du point médian des cotations à la minute maintenu par une vue matérialisée incrémentale.

Votre ordinateur
Terminal macOS : Exécutez les commandes de l’atelier dans le Terminal avec zsh ou bash.

Point de départ

Le collecteur est sain et polymarket.price_ticks contient des lignes.

Pourquoi

Les utilisateurs demandent sans cesse la même série à la minute. La calculer une fois à l'arrivée des blocs déplace le travail de chaque actualisation vers l'insertion. La table brute reste disponible pour les questions ad hoc.

Étape 1 — Interroger correctement les états agrégés

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;

La vue a écrit argMinState/argMaxState ; la requête les finalise avec les fonctions Merge correspondantes. Ouverture et clôture utilisent l'heure et l'identifiant déterministe, ce qui règle de façon cohérente les arrivées désordonnées et égalités à la milliseconde.

Étape 2 — Comparer les lignes lues par les requêtes brute et agrégée

Exécutez l'équivalent brut :

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;

Dans SQL Console, comparez les lignes lues. L'agrégat lit des états de blocs que AggregatingMergeTree combine en arrière-plan, généralement bien moins de lignes que toutes les mises à jour source.

Étape 3 — Vérifier que la vue est alimentée par les insertions

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

En direct ou en fixture, newest_minute avance sans tâche d'actualisation planifiée.

Terminé lorsque

  • la requête agrégée renvoie des lignes OHLC ;
  • ouverture/plus haut/plus bas/clôture sont des probabilités comprises entre 0 et 100 ; et
  • newest_minute est récent pour un flux actif.

Suite : étudier un mouvement de marché.

Sur cette page

Suivre votre progression ?

Facultatif. Nous envoyons un lien par e-mail pour confirmer votre adresse ; la progression est enregistrée après son ouverture.

Utilisez votre adresse e-mail professionnelle, et non une adresse personnelle.

Le suivi de la progression exige aussi d’accepter les Conditions d’utilisation actuelles dans les Paramètres de confidentialité.

FR