Les sociétés de bourse reçoivent des flux de prix quasi en temps réel des places boursières et doivent calculer les valeurs des chandeliers avec un débit élevé et une latence minimale. TairSearch, une structure de données de recherche en texte intégral en mémoire qui intègre la mise en cache et le calcul pour la récupération de données en temps réel, répond à ce besoin en conservant les données fréquemment consultées en mémoire et en calculant directement les prix d'ouverture, de plus haut, de plus bas et de clôture (OHLC) à partir de l'index.
Ce tutoriel explique comment construire un chandelier de 3 minutes pour une action à l'aide de TairSearch : création du schéma, ingestion des données et interrogation de chaque valeur OHLC en temps réel.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance Alibaba Cloud ApsaraDB for Redis avec TairSearch activé
Un client Redis connecté à l'instance
Pour consulter la référence des commandes TairSearch, voir Search .
Correspondance entre les valeurs des chandeliers et les requêtes
Chaque chandelier représente quatre points de prix sur une fenêtre temporelle fixe :
| Valeur | Signification | Stratégie de requête |
|---|---|---|
| Ouverture | Premier prix négocié dans la période | Tri par date croissant, retour d'un seul résultat |
| Plus haut | Prix le plus élevé négocié dans la période | Agrégation : max sur le champ high |
| Plus bas | Prix le plus bas négocié dans la période | Agrégation : min sur le champ low |
| Clôture | Dernier prix négocié dans la période | Tri par date décroissant, retour d'un seul résultat |
Les prix d'ouverture et de clôture nécessitent un tri pour identifier le premier ou le dernier enregistrement. Les prix les plus élevés et les plus bas requièrent des agrégations qui analysent tous les enregistrements de la fenêtre sans retourner de documents individuels. Cette différence impacte directement les performances des requêtes ; consultez la section Données de performance pour obtenir les résultats des tests de référence.
Créez un schéma pour l'action
Utilisez la commande TFT.CREATEINDEX pour créer un schéma dont la clé correspond au code de l'action. Dans cet exemple, le code de l'action est 58Z074 et un nouvel enregistrement de prix arrive toutes les 3 secondes.
Le schéma définit sept champs : open, high, low, close, volume, amount et date. Le champ date est indexé ("index": true) afin de prendre en charge les requêtes par plage de temps. Tous les champs relatifs aux prix et au volume sont stockés mais non indexés, car ils sont récupérés via un tri ou une agrégation plutôt que filtrés directement.
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"}
}
}
}'
Résultat attendu :
OK
Pour ajouter ou modifier des champs après la création, utilisez TFT.UPDATEINDEX .
Ajoutez les données de cours boursiers
Écrivez chaque enregistrement de prix dans l'index à l'aide de la commande TFT.ADDDOC. Chaque document correspond à un instantané de prix à un horodatage Unix spécifique :
TFT.ADDDOC 58Z074 '{
"high": 1237.53,
"low": 887.54,
"open": 987.36,
"close": 997.53,
"volume": 110,
"amount": 2809,
"date": 1659922202
}'
Répétez cette commande à chaque arrivée de nouvelle variation de prix. Dans cet exemple, un nouvel enregistrement est ajouté toutes les 3 secondes.
Interrogez les prix OHLC pour un chandelier de 3 minutes
Pour générer un chandelier, exécutez trois requêtes TFT.SEARCH sur une fenêtre temporelle de 3 minutes. La fenêtre d'exemple s'étend de gte: 1659922200 à lte: 1659922380, soit une plage de 180 secondes.
Prix d'ouverture — premier enregistrement de la fenêtre, trié par ordre croissant :
TFT.SEARCH 58Z074 '{
"size": 1,
"_source": {"includes": "open"},
"sort": [{"date": {"order": "asc"}}],
"query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}
}'
Prix de clôture — dernier enregistrement de la fenêtre, trié par ordre décroissant :
TFT.SEARCH 58Z074 '{
"size": 1,
"_source": {"includes": "close"},
"sort": [{"date": {"order": "desc"}}],
"query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}}
}'
Prix les plus élevés et les plus bas — maximum et minimum de tous les enregistrements de la fenêtre, en utilisant des agrégations avec size: 0 afin qu'aucun document ne soit retourné :
TFT.SEARCH 58Z074 '{
"size": 0,
"query": {"range": {"date": {"gte": 1659922200,"lte": 1659922380}}},
"aggs": {"high": {"max": {"field": "high"}},"low": {"min": {"field": "low"}}}
}'
Combinez les résultats des trois requêtes pour former un seul chandelier pour la fenêtre de 3 minutes.
Visualisez le graphique en chandeliers
Le graphique suivant présente un exemple de graphique en chandeliers généré à partir des données TairSearch à l'aide de la bibliothèque Pyecharts.

Données de performance
Les tests de référence suivants utilisent redis-benchmark avec 100 000 requêtes (-n 100000) sur une seule clé (-r 1).
Prix d'ouverture et de clôture (requêtes basées sur le tri) :
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}}}}'
Résultat :
100.00% <= 5 milliseconds
12078.75 requests per second
Prix les plus élevés et les plus bas (requêtes basées sur l'agrégation) :
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"}}}}'
Résultat :
100.00% <= 2 milliseconds
65019.51 requests per second
Les requêtes d'agrégation (prix les plus élevés et les plus bas) sont nettement plus rapides que les requêtes basées sur le tri (ouverture et clôture), car elles calculent directement sur l'index sans récupérer ni trier les documents individuels.