PolymarketClickHouse Workshops

04 Agregados en tiempo real

Lee el OHLC del punto medio de las cotizaciones por minuto que mantiene una vista materializada incremental.

Tu equipo
Terminal de macOS: Ejecuta los comandos del taller en Terminal con zsh o bash.

Punto de partida

El colector está saludable y polymarket.price_ticks contiene filas.

Por qué

Los usuarios del panel piden repetidamente la misma serie por minuto. Calcularla una vez a medida que llegan bloques nuevos desplaza el trabajo de cada actualización del panel al momento de inserción. La tabla sin procesar sigue disponible para preguntas ad hoc.

Paso 1 — Consultar correctamente los estados agregados

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 vista escribió argMinState/argMaxState; la consulta los finaliza con las funciones Merge correspondientes. Apertura y cierre usan la hora del evento más un identificador determinista, por lo que las llegadas desordenadas y empates en el mismo milisegundo se resuelven de forma coherente.

Paso 2 — Comparar las filas leídas por las consultas sin procesar y agregada

Ejecuta el equivalente sin procesar:

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;

En SQL Console, compara las filas leídas. El agregado lee estados de bloque que AggregatingMergeTree combina en segundo plano, normalmente muchas menos filas que explorar cada actualización de origen.

Paso 3 — Verificar que la vista se activa al insertar

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 modo en vivo o fixture, newest_minute avanza sin un trabajo de actualización programado.

Terminado cuando

  • la consulta agregada devuelva filas OHLC;
  • apertura/máximo/mínimo/cierre sean probabilidades entre 0 y 100; y
  • newest_minute sea actual para un feed activo.

Siguiente: investigar un movimiento del mercado.

En esta página

¿Quieres seguir tu progreso?

Opcional. Enviaremos un enlace por correo para confirmar tu dirección; el progreso se registrará cuando lo abras.

Usa tu correo de trabajo, no uno personal.

Para seguir el progreso también debes aceptar los Términos del servicio actuales en la Configuración de privacidad.

ES