← Home ← Rapports 50K 2026-04-24 10:27 Paris SEV 2
Dashboard live →
Delta perdu dans l'incident
≈ −$257
Cumul bot interne +$192.50 vs compte TopStep net today −$64.70 · cycle 3 vaporisé en 12 min de silence API
Durée du blackout API
12 min
10:15:01 → 10:27:03 Paris
Rate-limit events 429
30+
/Order/searchOpen + /Position/searchOpen
Position fantôme
5 cts
SHORT avg 27097.17 — fermée hors bot
Ordre toxique
BUY 5 @ MKT
émis à 27120 dans le vide
PnL bot (interne)
+$192.50
5 cycles · tous TP trail
PnL TopStep réel
−$64.70
25 trades · WR 28% · PF 0.72
Drawdown today
−$251.64
0.50% du compte 50K
Max consec losses
7
avant récupération trail
⚠ Root cause

Combo fatal = Rate Limit 429 continu sur l'API TopStep (12 min de silence sur /Order/searchOpen + /Position/searchOpen) + logique _reset_cycle aveugle qui émet un Market Buy/Sell des "contrats résiduels" sans vérifier qu'une position réelle existe côté exchange.

Pendant le blackout, la position SHORT 5 cts (avg 27097.17) a été fermée côté TopStep (safety TP hit probable, ou ordre parasite). À la reconnexion, le bot voyait encore 5 cts dans son état interne alors que l'exchange affichait 0. Le reset_cycle a alors envoyé un Market Buy x5 @ 27120 pour "nettoyer" — sauf qu'il a ouvert un LONG 5 cts au sommet. Ce long s'est ensuite dissous via la re-entry SHORT 1 ct + des ordres SO/safety qui ont mangé la différence en slippage + fees.

Timeline détaillée
10:04:05 — Cycle 2 fermé
TP Trail exit @ 27080.00 +$87
peak=27077.62 (+16.88pt) · exit_gain=14.50pt · avg=27094.50. Cumul bot +$155.25 / 2 cycles
10:04:33 — Cycle 3 ouvert
SHORT BO 1 ct @ 27076.38
TP 27069.38 (−7pt) · Safety TP placé +20pt @ 27056.38 (initial)
10:05:37 — SO1 fill
+2 cts @ 27088.38 → 3 cts avg 27084.38
Prix remonte, DCA activée. Safety TP déplacé à avg −20pt (27064.38)
10:15:51 — SO2 fill
+2 cts @ 27116.38 → 5 cts avg 27097.17
Position max pour ce cycle. Safety TP à 27077.25 (avg −20pt = +20pt de gain si touché). Grille fidèle à la config.
10:15:01 → 10:27:03
🔴 BLACKOUT API — 12 minutes de rate limit 429
Séquence répétée toutes les minutes :
# extrait log — 30+ occurrences RATE LIMIT 429 /api/Order/searchOpen — backoff 2s RATE LIMIT 429 /api/Order/searchOpen — backoff 4s RATE LIMIT 429 /api/Order/searchOpen — backoff 8s # ...puis switch vers Position/searchOpen: RATE LIMIT 429 /api/Position/searchOpen — backoff 2s
Le bot ne peut plus lire ni sa position ni ses ordres ouverts. Pendant ce temps, la position SHORT 5 cts est fermée côté TopStep (safety TP touché ? liquidation ? — à vérifier via historique TopStep UI).
10:27:17 — Reconnexion + RECONCILE
💥 Bot ACTIVE 5 cts ≠ Exchange 0 cts
WARNING RECONCILE: bot ACTIVE (5 cts) mais position 0 sur exchange — reset cycle WARNING _reset_cycle: 5 contrats résiduels — fermeture ORDER Market Buy x5 @ MKT # ← ordre toxique : ouvre un LONG 5 cts @ ~27120 Order OK: orderId=2877402166
Le bot croit fermer une position qui n'existe plus — en réalité il en ouvre une nouvelle, à contresens, au plus haut.
10:27:29 — Re-entry immédiate
Nouveau cycle SHORT 1 ct @ 27121.50
POST-CYCLE RE-ENTRY déclenchée (close=27120.25, sma20=27102.51). Net compte TopStep à cet instant : long 5 + short 1 = long 4 cts. Ordre suivant va compenser mais via slippage additionnel.
10:28:21 — TRAIL RESYNC forcé
bot qty=1 avg=27121.50 → broker qty=1 avg=27121.00
Le bot corrige son avg en aveugle. Les 4 cts long parasites ont été dilués via ordres SO/safety qui se sont fillés partiellement. Perte réalisée difficilement traçable côté bot, mais visible nette côté compte.
10:28:26 → 10:34:32
Reprise normale · cycles 3, 4, 5 TP trail
Cumul bot +$170.25 → +$182.25 → +$192.50. Le bot continue à tourner correctement mais ignore le trou financier creusé à 10:27.
Impact chiffré
MétriqueValeurCommentaire
Cumul bot interne (5 cycles)+$192.50ne voit QUE les 5 TP trail gagnants
PnL net today TopStep−$64.7025 trades · WR 28% · PF 0.72
Delta bug≈ −$257écart entre réalité bot et compte
Worst trade today−$132.48vraisemblablement le LONG 5cts débouclé
Max DD today−$251.640.503% du compte · loin du daily limit $1,200
Max consec losses7contre 4 la veille en condition normale
Fees today$21.70ratio élevé pour 25 trades (ordre Market Buy 5cts)
Bug technique — _reset_cycle

Fichier : strategies/dca_loop_strategy.py · méthode _reset_cycle()

Comportement actuel (buggé) :

# 1. Reconcile voit : bot_state = 5 cts, exchange = 0 cts # 2. _reset_cycle est appelé avec "5 contrats résiduels" def _reset_cycle(self): if self.total_contracts != 0: self.client.market_order(side=OPPOSITE, qty=abs(self.total_contracts)) # ← envoie un ordre sans vérifier l'exchange self.total_contracts = 0 self.so_executed = 0 ...

Correction proposée :

def _reset_cycle(self): # Vérif authoritative côté exchange avant tout ordre exchange_qty = self.client.get_position_qty(symbol=self.symbol) # call /Position/searchOpen if exchange_qty == 0: # Plus rien côté broker → reset d'état uniquement, AUCUN ordre self.logger.warning(f"_reset_cycle: bot voyait {self.total_contracts} cts mais exchange=0 — reset state only") elif exchange_qty != self.total_contracts: # Position réelle ≠ bot → flatten exactement ce qui existe side = "BUY" if exchange_qty < 0 else "SELL" self.client.market_order(side=side, qty=abs(exchange_qty)) self.total_contracts = 0 self.so_executed = 0 ...
Actions correctives
Leçons à retenir