Trading Bot IA : Claude analyse les marches pour moi
Disclaimer : Ce projet est purement experimental et educatif. Ce n’est pas un conseil en investissement. Les marches financiers sont risques et ce bot est un exercice technique, pas un outil a suivre. Ne tradez jamais de l’argent que vous ne pouvez pas vous permettre de perdre.
L’idee
Apres avoir construit un agent IA capable de diagnostiquer des incidents Kubernetes, je me suis pose une question : est-ce que le meme pattern (collecte de donnees → analyse IA → decision → action) pourrait s’appliquer au trading ?
Le but n’est pas de devenir riche — c’est de voir si une IA peut prendre des decisions structurees a partir de donnees reelles, avec un vrai risk management, et tout ca deploye sur mon homelab.
Vue d’ensemble : le cycle de vie d’un trade
Toutes les heures, le bot execute ce pipeline pour chaque asset (BTC, ETH) :
1. DONNEES → Binance API : 289 bougies de 15min (3 jours)
2. INDICATEURS → Go calcule RSI, MACD, BB, ATR
3. SENTIMENT → Grok (xAI) cherche le sentiment sur X/Twitter
4. CLAUDE IA → Claude Sonnet 4.6 decide : Buy / Hold / Sell
5. RISK CHECK → Le risk manager verifie les regles
6. EXECUTION → Ordre LIMIT sur Binance → OCO (SL + TP)
7. FILL TRACK → Polling toutes les 30s pour detecter le fill
Toutes les 1H
│
▼
┌─────────────────────┐
│ Binance API │
│ 289 bougies 15min │
└─────────┬───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ RSI/MACD │ │ BB / ATR │ │ Grok │
│ Go │ │ Go │ │ Sentiment│
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
└─────────────┼────────────┘
▼
┌─────────────────────┐
│ Claude Sonnet 4.6 │
│ Buy / Hold / Sell │
└─────────┬───────────┘
▼
┌─────────────────────┐
│ Risk Manager │
│ 8 verifications │
└─────────┬───────────┘
▼
┌─────────────────────┐
│ Binance Execution │
│ LIMIT → OCO │
└─────────────────────┘
Voyons chaque etape en detail.
Etape 1 — Recuperation des donnees
Le signal engine appelle l’API Binance pour recuperer l’historique recent :
GetHistoricalData(asset, "15 mins", "3 D")
- 289 bougies de 15 minutes — soit 3 jours complets de donnees
- Chaque bougie = OHLCV (Open, High, Low, Close, Volume)
- Les prix sont en EUR (BTCEUR, ETHEUR) — pas USDT, car compte europeen soumis a MiCA
Pourquoi 15 minutes sur 3 jours ? C’est un bon compromis : assez de donnees pour que les indicateurs techniques soient fiables, sans noyer l’IA dans trop de bruit.
Etape 2 — Indicateurs techniques
A partir des 289 bougies, Go calcule 4 indicateurs. Chacun produit un score de -100 a +100.
RSI (Relative Strength Index) — rsi.go
Le RSI mesure la vitesse des mouvements de prix sur 14 periodes :
- RSI < 35 = OVERSOLD (survendu → signal d’achat potentiel)
- RSI > 65 = OVERBOUGHT (surachete → signal de vente potentiel)
- Utilise le lissage de Wilder (meme methode que TradingView)
C’est l’indicateur le plus intuitif : si tout le monde vend et que le prix chute trop vite, il y a souvent un rebond.
MACD (Moving Average Convergence Divergence) — macd.go
Le MACD detecte les changements de momentum :
MACD = EMA(12) - EMA(26)
Signal = EMA(9 du MACD)
Histogramme = MACD - Signal
- Histogramme positif = momentum haussier
- Histogramme negatif = momentum baissier
- La direction compte plus que la valeur absolue — passer de -50 a -30 = amelioration
- Normalise par
tanh(valeur/stddev)pour obtenir un score -100..+100
Bollinger Bands — bollinger.go
Les bandes de Bollinger mesurent la position du prix par rapport a sa volatilite :
Bande superieure = SMA(20) + 2 × σ
Bande inferieure = SMA(20) - 2 × σ
BB% = position du prix entre les bandes
- BB% < 20% (pres de la bande basse) = potentiel haussier
- BB% > 80% (pres de la bande haute) = potentiel baissier
- Le prix “rebondit” souvent entre les bandes
ATR (Average True Range) — atr.go
L’ATR mesure la volatilite reelle du marche :
True Range = max(High-Low, |High-PrevClose|, |Low-PrevClose|)
ATR = moyenne lissee sur 14 periodes
L’ATR ne donne pas de signal d’achat/vente — il dimensionne les stops :
- Stop-loss = ATR x 1.5 (distance minimale pour ne pas se faire sortir par le bruit)
- Take-profit = ATR x 3.0 (ratio risque/recompense de 1:2)
C’est un ajout recent et important : au lieu de stops fixes (2.5%), le bot s’adapte a la volatilite du moment.
Etape 3 — Sentiment via Grok
Le bot utilise l’API xAI (Grok) pour capter le sentiment du marche en temps reel :
- Modele :
grok-4-1-fast-non-reasoning - Outil :
x_search— recherche en temps reel sur X/Twitter - Prompt : “Analyze current social media sentiment for BTC/ETH crypto trading”
Grok retourne :
- Direction : Bullish / Bearish / Neutral
- Score : -1.0 a +1.0
- Raison : texte explicatif
{
"sentiment": "Bearish",
"score": -0.45,
"reason": "Fear after recent correction, multiple accounts discussing potential further downside"
}
Si Grok echoue (rate limit 429, timeout, etc.) → sentiment = Neutral (0.0). Le bot ne bloque jamais sur un echec de sentiment.
Le sentiment est un input parmi d’autres pour Claude — pas une decision directe. Son poids dans la decision finale est volontairement bas (0.15).
Etape 4 — Claude IA decide
C’est le cerveau du systeme. Claude Sonnet 4.6 recoit un prompt structure avec toutes les donnees :
Asset: BTC (CRYPTO, BINANCE, EUR) — LongOnly
Price: 84200.00 | Equity: 88.83€ | Open positions: 0/2
Technical Indicators (15-min candles, 3-day window):
RSI(14): 42.50 → neutral
RSI score: 50.0 / 100
MACD histogram: -12.3 → negative
MACD score: -30.5 / 100
BB%: 35.2% → middle range
BB score: 29.6 / 100
ATR(14): 450.20 (0.53% of price)
Technical score: 16.4 (signal threshold: ±30)
Sentiment (xAI Grok / X real-time):
Bearish (score: -0.45) | "Fear after recent correction"
Le system prompt de Claude
Claude joue le role d’un quant trader avec 15 ans d’experience. Ses regles :
- Analyser RSI + MACD + BB ensemble — un seul indicateur faible ne bloque pas un trade
- Sentiment bearish a des extremes RSI = signal CONTRARIAN (la foule a souvent tort aux extremes)
- Direction du MACD > valeur absolue
- ATR = volatilite actuelle → utiliser pour evaluer si les stops sont raisonnables
- LongOnly = jamais de Sell a decouvert, seulement Buy ou Hold
- PATIENCE : peu de trades a haute conviction > beaucoup de trades marginaux
La reponse
Claude retourne du JSON structure :
{
"signal": "Buy",
"score": 62,
"reasoning": "RSI strongly oversold with MACD histogram improving, BB% near lower band suggests reversal potential. Bearish sentiment at RSI extreme is contrarian bullish."
}
Fallback mecanique
Si l’API Claude echoue, le bot bascule automatiquement sur une formule mecanique :
score = (RSI × poids + MACD × poids + BB × poids + sentiment × poids) / totalPoids
Ca ne sera jamais aussi bon que Claude, mais ca evite que le bot soit completement aveugle en cas de panne API.
Etape 5 — Risk Manager
Avant d’executer un trade, 8 verifications doivent passer :
| # | Check | Detail |
|---|---|---|
| 1 | Bot arrete ? | Si drawdown max atteint → tout est bloque |
| 2 | Signal = Hold ? | Claude dit Hold → pas de trade |
| 3 | Max positions ? | Maximum 2 positions simultanees |
| 4 | Deja une position ? | Pas de doublons sur le meme asset |
| 5 | LongOnly ? | BTC/ETH = pas de short (spot only) |
| 6 | Drawdown global | Equity baisse de >10% du high watermark → bot arrete |
| 7 | Daily loss limit | Perdu >5% dans la journee → pause jusqu’a demain |
| 8 | Cooldown | 15min apres une perte + 1h par asset entre les trades |
Position sizing
Le bot risque 5% de l’equity par trade :
Quantite = (Equity × 5%) / Prix
Exemple : 88.83€ × 5% = 4.44€ → 4.44 / 84200 = 0.0000527 BTC
Stop-loss et take-profit dynamiques
Au lieu de pourcentages fixes, les stops s’adaptent a la volatilite via l’ATR :
SL = Prix - ATR × 1.5 (minimum = prix × 3%)
TP = Prix + ATR × 3.0 (minimum = prix × 6%)
Ratio risque/recompense = 1:2
Exemple concret : Si BTC a 84 200€ avec un ATR de 450€ :
- Stop-loss = 84 200 - 675 = 83 525€
- Take-profit = 84 200 + 1 350 = 85 550€
Etape 6 — Execution
Quand le risk manager donne le feu vert :
- Ordre LIMIT avec un petit premium (+0.01%) pour un meilleur fill
- Si l’ordre LIMIT echoue → fallback en MARKET
- L’ordre est envoye a Binance via l’API REST
Etape 7 — Suivi des fills
Le bot poll Binance toutes les 30 secondes pour verifier si l’ordre est rempli.
Quand un ordre est FILLED :
- Evenement
FillEventenvoye au risk manager - Mise a jour : equity, positions ouvertes, PnL
- Etat persiste sur disque (PVC K8s)
- Placement automatique de l’OCO (One-Cancels-Other) = SL + TP combines
- 3 tentatives avec backoff exponentiel (2s, 5s, 10s)
- Si toutes echouent → log ERREUR “position UNPROTECTED”
Les ordres terminaux (cancelled, expired, rejected) sont nettoyes automatiquement.
Persistance de l’etat
Le fichier /data/risk-state.json sur le PVC Kubernetes contient tout l’etat du bot :
- Capital initial, equity actuelle, high watermark
- Positions ouvertes (symbol, quantite, cout moyen)
- PnL realise, nombre de trades, win rate
- Timestamps des dernieres pertes et trades par asset
- Flag “stopped” si le drawdown max est atteint
L’ecriture est atomique : temp file → rename. Pas de corruption si le pod crash au milieu d’une ecriture.
Infrastructure
┌─────────────────────────────────────────────────┐
│ K8s Cluster (Talos, Dell R430) │
│ │
│ trading-bot (Deployment, strategy: Recreate) │
│ ├── Go binary │
│ ├── PVC : /data/risk-state.json │
│ └── Prometheus metrics :9090 │
│ │
│ Monitoring │
│ ├── Prometheus (scrape /metrics) │
│ └── Grafana (dashboard tradingbot-v3) │
└─────────────────────────────────────────────────┘
Le bot est deploye en Recreate (pas RollingUpdate) — on ne veut jamais deux instances en parallele qui placeraient des ordres en double.
Prometheus scrape les metriques du bot (trades executes, PnL, positions ouvertes, erreurs API) et Grafana affiche le tout sur un dashboard dedie.
Les parametres actuels
| Parametre | Valeur |
|---|---|
| Cycle | 1 heure |
| Risk par trade | 5% de l’equity |
| Stop-loss | ATR x 1.5 (min 3%) |
| Take-profit | ATR x 3.0 (min 6%) |
| Poids sentiment | 0.15 |
| Seuil de signal | ±30 |
| Max positions | 2 simultanees |
| OCO | 3 tentatives + retry |
| Cooldown post-perte | 15 min |
| Cooldown par asset | 1 heure |
| Daily loss limit | 5% |
| Drawdown max | 10% |
Ce que j’ai appris
L’IA est forte pour synthetiser, pas pour predire. Claude ne predit pas le futur — il synthetise 4 indicateurs + le sentiment en une decision coherente, avec un raisonnement explicable. C’est deja enorme par rapport a une formule mecanique.
Le risk management est plus important que le signal. Meme avec le meilleur signal du monde, sans stops, sans limites de drawdown, sans position sizing — tu perds tout. Les 8 checks du risk manager sont la partie la plus importante du code.
L’ATR change tout. Passer de stops fixes (2.5%) a des stops dynamiques bases sur la volatilite a reduit les sorties prematurees. Le marche “respire” et les stops doivent respirer avec lui.
Le sentiment est du bruit, sauf aux extremes. Un sentiment bearish quand tout est neutre = rien. Un sentiment bearish quand le RSI est a 25 = signal contrarian interessant. D’ou le poids faible (0.15) mais present.
Et les resultats ?
C’est un projet experimental avec de tres petits montants. L’objectif n’a jamais ete de faire du profit — c’est d’apprendre comment fonctionne le pipeline complet : de la donnee brute a l’execution d’un ordre, en passant par l’analyse IA et le risk management.
Ce qui est interessant, c’est que le meme pattern architectural (collecte → analyse → decision → action → feedback) se retrouve dans beaucoup de systemes : incident management, trading, ou n’importe quel systeme de decision automatise.
Rappel : ce projet est un exercice technique et de curiosite. Ce n’est en aucun cas un conseil financier ou un exemple a suivre. Le trading comporte des risques de perte en capital.
Prochain article : a suivre…