Todos os produtos
Search
Central de documentação

Tair (Redis® OSS-Compatible):Gerar gráficos de candlestick para ações usando TairSearch

Última atualização: Jun 26, 2026

Corretoras de valores recebem feeds de preços em tempo quase real das bolsas de valores e precisam calcular os valores de candlestick com alto throughput e latência mínima. O TairSearch — uma estrutura de dados de busca em texto completo em memória que integra cache e computação para recuperação de dados em tempo real — resolve isso mantendo dados quentes na memória e calculando os preços de abertura, máxima, mínima e fechamento (OHLC) diretamente do índice.

Este tutorial mostra como construir um candlestick de 3 minutos para uma ação usando TairSearch: criação do schema, ingestão de dados e consulta de cada valor OHLC em tempo real.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma instância do ApsaraDB for Redis da Alibaba Cloud com TairSearch ativado

  • Um cliente Redis conectado à instância

Para consultar a referência de comandos do TairSearch, acesse Search .

Como os valores de candlestick se mapeiam para consultas

Cada candlestick representa quatro pontos de preço em uma janela de tempo fixa:

Valor

Significado

Estratégia de consulta

Open

Primeiro preço negociado no período

Ordene por date de forma crescente, retornando 1 resultado

High

Maior preço negociado no período

Agregação: max no campo high

Low

Menor preço negociado no período

Agregação: min no campo low

Close

Último preço negociado no período

Ordene por date de forma decrescente, retornando 1 resultado

Os preços de abertura e fechamento exigem ordenação para localizar o primeiro ou o último registro. Já os preços máximo e mínimo requerem agregações que percorrem todos os registros da janela sem retornar documentos individuais. Essa diferença afeta diretamente o desempenho das consultas — consulte Dados de desempenho para ver os resultados dos benchmarks.

Crie um schema para a ação

Use TFT.CREATEINDEX para criar um schema com o código da ação como chave. Neste exemplo, o código da ação é 58Z074 e um novo registro de preço chega a cada 3 segundos.

O schema define sete campos: open, high, low, close, volume, amount e date. O campo date é indexado ("index": true) para suportar consultas por intervalo de tempo. Todos os campos de preço e volume são armazenados, mas não indexados, pois são recuperados por ordenação ou agregação — e não filtrados diretamente.

TFT.CREATEINDEX 58Z074 '{
    "mappings": {
        "properties": {
            "high": {"index": false,"type": "double"},
            "low": {"index": false,"type": "double"},
            "open": {"index": false,"type": "double"},
            "close": {"index": false,"type": "double"},
            "volume": {"index": false,"type": "long"},
            "amount": {"index": false,"type": "long"},
            "date": {"index": true,"type": "long"}
        }
    }
}'

Saída esperada:

OK
Para adicionar ou modifique campos após a criação, use TFT.UPDATEINDEX .

Adicione dados de preço da ação

Grave cada registro de preço no índice usando TFT.ADDDOC. Cada documento corresponde a um snapshot de preço em um timestamp Unix específico:

TFT.ADDDOC 58Z074 '{
    "high": 1237.53,
    "low": 887.54,
    "open": 987.36,
    "close": 997.53,
    "volume": 110,
    "amount": 2809,
    "date": 1659922202
}'

Repita este comando conforme novos ticks de preço chegarem. Neste exemplo, um novo registro é adicionado a cada 3 segundos.

Consulte os preços OHLC para um candlestick de 3 minutos

Para gerar um candlestick, execute três consultas TFT.SEARCH em uma janela de tempo de 3 minutos. A janela do exemplo vai de gte: 1659922200 a lte: 1659922380 — um intervalo de 180 segundos.

Preço de abertura (Open) — primeiro registro da janela, ordenado de forma crescente:

TFT.SEARCH 58Z074 '{
    "size": 1,
    "_source": {"includes": "open"},
    "sort": [{"date": {"order": "asc"}}],
    "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}
}'

Preço de fechamento (Close) — último registro da janela, ordenado de forma decrescente:

TFT.SEARCH 58Z074 '{
    "size": 1,
    "_source": {"includes": "close"},
    "sort": [{"date": {"order": "desc"}}],
    "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}
}'

Preços máximo e mínimo (High e Low) — valor máximo e mínimo em todos os registros da janela, usando agregações com size: 0 para que nenhum documento seja retornado:

TFT.SEARCH 58Z074 '{
    "size": 0,
    "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}},
    "aggs": {"high": {"max": {"field": "high"}},"low": {"min": {"field": "low"}}}
}'

Combine os resultados das três consultas para formar um único candlestick referente à janela de 3 minutos.

Visualize o gráfico de candlestick

O gráfico a seguir exibe um exemplo de gráfico de candlestick gerado a partir de dados do TairSearch com a biblioteca Pyecharts.

TairSearch构建股票效果图

Dados de desempenho

Os benchmarks a seguir utilizam redis-benchmark com 100.000 requisições (-n 100000) contra uma única chave (-r 1).

Preços de abertura e fechamento (Open e Close) — consultas baseadas em ordenação:

redis-benchmark -r 1 -n 100000 TFT.SEARCH 58Z074 '{"size": 1, "_source": {"includes": "open"}, "sort": [{"date": {"order": "asc"}}], "query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}}'

Saída:

100.00% <= 5 milliseconds
12078.75 requests per second

Preços máximo e mínimo (High e Low) — consultas baseadas em agregação:

redis-benchmark -r 1 -n 100000 TFT.SEARCH 58Z074 '{"size": 0,"query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}},"aggs": {"high": {"max": {"field": "high"}},"low": {"min": {"field": "low"}}}}'

Saída:

100.00% <= 2 milliseconds
65019.51 requests per second

As consultas por agregação (High e Low) são significativamente mais rápidas do que as consultas por ordenação (Open e Close), pois calculam os valores diretamente sobre o índice sem recuperar nem ordenar documentos individuais.

Próximos passos