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 |
|
High |
Maior preço negociado no período |
Agregação: |
|
Low |
Menor preço negociado no período |
Agregação: |
|
Close |
Último preço negociado no período |
Ordene por |
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.

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.