04 Agregados en tiempo real
Lee el OHLC del punto medio de las cotizaciones por minuto que mantiene una vista materializada incremental.
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_minutesea actual para un feed activo.
Siguiente: investigar un movimiento del mercado.