Aperçu
Le système Multi-Kline Management permet à MagicTradeBot de charger, mettre en cache et maintenir efficacement les données de chandeliers (kline) sur plusieurs timeframes pour des centaines de milliers de symboles de trading simultanément, tout en respectant les limites de taux des API des exchanges. Cette fonctionnalité prend en charge des stratégies de trading variées — du scalping haute fréquence au trading de position long terme — toutes fonctionnant concurremment avec un isolement total.
Capacités principales
Chargement d'intervalles basé sur la stratégie
Le bot charge dynamiquement les données kline en fonction du type de stratégie de trading active. Chaque stratégie possède des timeframes optimaux prédéfinis :
Intervalles par stratégie :
- HFT (High-Frequency Trading) :
1m– Exécution ultra-rapide sur les mouvements à la minute - Scalp :
15m– Jeux de momentum court terme sur graphiques 15 minutes - Day Trading :
15m, 30m, 1h, 2h, 4h– Analyse intraday sur plusieurs timeframes - Swing Trading :
1h, 2h, 4h, 6h, 12h– Patterns multi-heures pour les entrées en position - Long-Term :
1d– Graphiques journaliers pour l’analyse macro des tendances - Default :
5m, 15m, 1h– Approche multi-timeframe équilibrée
Chaque symbole peut avoir un ou plusieurs intervalles chargés simultanément selon la stratégie qui lui est assignée, permettant une confirmation multi-timeframe tout en restant économe en mémoire.
Gestion intelligente des limites de taux
Throttling adaptatif des requêtes
Le système implémente un algorithme sophistiqué de limitation de taux qui respecte les restrictions des API d’exchange :
maxRequestsPerSecond: 10– Limite stricte de l’exchange par secondesafeBuffer: 0.2– Marge de sécurité (utilise 80 % de la capacité max)- Taux effectif : 8 requêtes/seconde (10 × 0.8)
Stratégie de distribution des requêtes
Traitement par lots de symboles :
chunk_size: 20– Symboles récupérés par cycle de mise à jour- Répartit des centaines de milliers de symboles dans le temps
- Évite les violations de burst API
Temps de traitement d’un chunk = chunk_size / taux_effectif
Exemple : 20 symboles / 8 req/s = 2,5 secondes par chunk
Cycle de rafraîchissement :
kline_refresh_rate: 7secondes entre chaque cycle complet- Garantit une fraîcheur continue des données sans surcharger les API
- Insertion adaptative de délais selon les temps de réponse
Support multi-exchange
- Binance : 1200 requêtes/minute (20/sec)
- OKX : 20 requêtes/2 secondes
- Bybit : 120 requêtes/5 secondes
Le bot ajuste automatiquement maxRequestsPerSecond selon l’exchange détecté.
Stockage des klines économe en mémoire
Approche par fenêtre glissante
Afin de gérer un nombre massif de symboles sans épuiser la mémoire :
- Gestion par symbole :
max_kline_length: 100– Nombre maximum de chandeliers conservés par intervalle- Buffer circulaire (FIFO)
- Les anciens chandeliers sont automatiquement purgés à l’arrivée des nouveaux
Objet Kline unique : ~200 octets
Par symbole (5 intervalles × 100 chandeliers) : ~100 Ko
100 000 symboles : ~10 Go d’empreinte mémoire totale
Chargement paresseux & mise en cache
- Chargement initial récupère l’historique complet
max_kline_length - Mises à jour suivantes ne demandent que les derniers chandeliers
- Cache en mémoire avec éviction LRU pour les symboles inactifs
- Symboles inactifs pendant 24h automatiquement supprimés de la mémoire
Exécution concurrente des stratégies
Mapping Symbole-Stratégie
BTCUSDT:
strategy: "day"
intervals: ["15m", "1h", "4h"]
ETHUSDT:
strategy: "scalp"
intervals: ["15m"]
XRPUSDT:
strategy: "swing"
intervals: ["1h", "4h", "12h"]
Traitement isolé des signaux
- signal_refresh_interval: 20 secondes (configurable par stratégie)
- Scalp → toutes les 20 secondes
- Long-term → toutes les 1800 secondes (30 min)
Chaque symbole calcule ses propres indicateurs de manière indépendante, sans contamination croisée entre stratégies. Les tâches lourdes en CPU sont exécutées en parallèle par des workers.
Architecture de scalabilité
Récupération distribuée des klines
Système de file d’attente priorisée :
- Symboles haute priorité (trades actifs)
- Priorité moyenne (signaux forts)
- Basse priorité (surveillance uniquement)
- Données périmées (non mises à jour depuis 2× le taux de rafraîchissement)
Optimisation des requêtes par lots :
- Un seul appel API peut récupérer plusieurs intervalles pour un même symbole
- Réduit le total des requêtes d’environ 40 %
- Utilise les endpoints batch spécifiques à chaque exchange
Tolérance aux pannes
- Limite de taux atteinte → Backoff exponentiel (2x, 4x, 8x)
- Requête échouée → Jusqu’à 3 tentatives
- Échecs persistants → Symbole temporairement désactivé
- Perte de connexion → Mis en file d’attente jusqu’au rétablissement
La validation des données inclut :
- Détection d’écarts de timestamp
- Détection d’anomalies de prix
- Remplissage automatique des trous
- Exclusion des données périmées
Optimisations de performance
Workflow du cycle de mise à jour
Par cycle de rafraîchissement (toutes les 7 secondes) :
- Phase de sélection (0,1 s)
- Phase de récupération (2,5 s)
- Phase de traitement (1,5 s)
- Phase idle (2,9 s)
Débit total :
- 2,86 symboles/seconde
- 10 285 symboles mis à jour par heure
- 100 000 symboles rafraîchis toutes les ~9,7 heures
Optimisations spécifiques par stratégie
- Scalp : rafraîchissement plus rapide, buffers plus petits
- Long-Term : rafraîchissement lent, buffers standards
Bonnes pratiques de configuration
Petit portefeuille (<1 000 symboles)
chunk_size: 50
kline_refresh_rate: 5
maxRequestsPerSecond: 15
safeBuffer: 0.3
Portefeuille moyen (1 000–10 000 symboles)
chunk_size: 20
kline_refresh_rate: 7
maxRequestsPerSecond: 10
safeBuffer: 0.2
Grand portefeuille (>100 000 symboles)
chunk_size: 10
kline_refresh_rate: 10
maxRequestsPerSecond: 8
safeBuffer: 0.15
max_kline_length: 50
Ajustement spécifique par exchange
- Binance : chunks plus gros, rafraîchissement plus rapide
- Exchanges stricts : chunks plus petits, rafraîchissement plus lent
Exemple réel
Scénario : Trading de 50 000 symboles sur Binance
chunk_size: 25
kline_refresh_rate: 8
maxRequestsPerSecond: 12
safeBuffer: 0.2
max_kline_length: 80
Performance :
- Taux effectif : 9,6 req/sec
- Traitement d’un chunk : 2,6 secondes
- Rafraîchissement complet : Toutes les ~4,4 heures
- Utilisation mémoire : ~8 Go
- API/jour : ~275 000
Analyses récapitulatives
Le paramètre summary_interval: "1d" fournit des statistiques quotidiennes :
- Nombre total de symboles surveillés
- Consommation API
- Utilisation des limites de taux (%)
- Fraîcheur des données
- Signaux par stratégie
- Utilisation mémoire