Introduction aux stratégies de trading algorithmique sur Bybit

Le trading algorithmique sur les contrats perpétuels Bybit représente l'une des opportunités les plus attractives du marché crypto en 2026. Avec un volume quotidien dépassant les 12 milliards de dollars et plus de 400 paires de trading disponibles, Bybit offre un écosystème idéal pour développer des stratégies de market making, d'arbitrage statistique et de scalping haute fréquence.

Dans cet article complet, je vais vous guider à travers l'architecture technique nécessaire pour connecter l'API Bybit à vos systèmes de trading, tout en vous montrant comment intégrer des modèles d'IA pour analyser les opportunités d'arbitrage en temps réel. Notre,成本comparaison récente montre que les APIs d'IA comme HolySheep AI permettent de réduire drastiquement les coûts d'analyse tout en maintenant une latence inférieure à 50ms.

Comparatif des coûts des APIs IA pour le trading algorithmique (2026)

Avant de plonger dans le code, examinons l'impact financier du choix de votre fournisseur d'IA pour alimenter vos stratégies de trading. Voici une comparaison détaillée des principaux acteurs du marché pour une consommation de 10 millions de tokens par mois :

Fournisseur Modèle Prix par MTok Coût mensuel (10M tok) Latence moyenne Économie vs GPT-4.1
OpenAI GPT-4.1 8,00 $ 80,00 $ ~850ms
Anthropic Claude Sonnet 4.5 15,00 $ 150,00 $ ~1200ms -47% (plus cher)
Google Gemini 2.5 Flash 2,50 $ 25,00 $ ~400ms 69%
HolySheep AI DeepSeek V3.2 0,42 $ 4,20 $ <50ms 95%

Ces données démontrent clairement l'avantage compétitif de HolySheep AI pour les applications de trading haute fréquence. Avec un coût de 0,42 $ par million de tokens et une latence inférieure à 50ms, DeepSeek V3.2 via HolySheep représente le choix optimal pour l'analyse de marché en temps réel.

Architecture technique de l'intégration API Bybit

Configuration de l'environnement et dépendances

# Installation des dépendances Python pour le trading Bybit
pip install requests websocket-client numpy pandas python-dotenv
pip install aiohttp asyncio-locks

Structure du projet

trading-bot/ ├── config/ │ ├── __init__.py │ ├── bybit_config.py │ └── holy_api_config.py ├── src/ │ ├── bybit_client.py │ ├── arbitrage_engine.py │ ├── ai_analyzer.py │ └── risk_manager.py ├── main.py └── requirements.txt

Client WebSocket Bybit pour données temps réel

import asyncio
import json
import hmac
import hashlib
import time
import requests
from typing import Dict, Optional
from dataclasses import dataclass

@dataclass
class BybitCredentials:
    api_key: str
    api_secret: str
    testnet: bool = False

class BybitAPIClient:
    """Client haute performance pour Bybit Perpetual API v5"""
    
    BASE_URL = "https://api.bybit.com"
    WS_URL = "wss://stream.bybit.com/v5/public/linear"
    
    def __init__(self, credentials: BybitCredentials):
        self.credentials = credentials
        self.session = requests.Session()
        self.session.headers.update({
            'Content-Type': 'application/json',
            'X-BAPI-API-KEY': credentials.api_key,
        })
    
    def _generate_signature(self, params: str, timestamp: str) -> str:
        """Génère la signature HMAC SHA256 pour l'authentification"""
        param_str = timestamp + self.credentials.api_key + params
        return hmac.new(
            self.credentials.api_secret.encode(),
            param_str.encode(),
            hashlib.sha256
        ).hexdigest()
    
    def get_wallet_balance(self) -> Dict:
        """Récupère le solde du wallet USDT"""
        timestamp = str(int(time.time() * 1000))
        recv_window = "5000"
        
        params = f"accountType=UNIFIED&coin=USDT"
        signature = self._generate_signature(params, timestamp)
        
        self.session.headers.update({
            'X-BAPI-SIGN': signature,
            'X-BAPI-SIGN-TYPE': '2',
            'X-BAPI-TIMESTAMP': timestamp,
            'X-BAPI-RECV-WINDOW': recv_window,
        })
        
        response = self.session.get(
            f"{self.BASE_URL}/v5/account/wallet-balance",
            params={"accountType": "UNIFIED", "coin": "USDT"}
        )
        return response.json()
    
    def place_order(self, symbol: str, side: str, qty: float, 
                   order_type: str = "Market", price: Optional[float] = None) -> Dict:
        """Place un ordre sur Bybit Perpetual"""
        timestamp = str(int(time.time() * 1000))
        recv_window = "5000"
        
        params = {
            "category": "linear",
            "symbol": symbol,
            "side": side,
            "orderType": order_type,
            "qty": str(qty),
            "timeInForce": "IOC" if order_type == "Market" else "GTC"
        }
        
        if price:
            params["price"] = str(price)
        
        param_str = json.dumps(params)
        signature = self._generate_signature(param_str, timestamp)
        
        self.session.headers.update({
            'X-BAPI-SIGN': signature,
            'X-BAPI-SIGN-TYPE': '2',
            'X-BAPI-TIMESTAMP': timestamp,
            'X-BAPI-RECV-WINDOW': recv_window,
        })
        
        response = self.session.post(
            f"{self.BASE_URL}/v5/order/create",
            json=params
        )
        return response.json()
    
    async def get_order_book(self, symbol: str, limit: int = 20) -> Dict:
        """Récupère le carnet d'ordres pour analyse"""
        response = self.session.get(
            f"{self.BASE_URL}/v5/market/orderbook",
            params={"category": "linear", "symbol": symbol, "limit": limit}
        )
        return response.json()

Exemple d'utilisation

credentials = BybitCredentials( api_key="YOUR_BYBIT_API_KEY", api_secret="YOUR_BYBIT_API_SECRET" ) client = BybitAPIClient(credentials) balance = client.get_wallet_balance() print(f"Solde USDT: {balance}")

Intégration de l'IA HolySheep pour l'analyse d'arbitrage

Maintenant, concentrons-nous sur l'aspect le plus critique : utiliser l'IA pour identifier les opportunités d'arbitrage. L'analyse en temps réel des spreads entre différents symboles et l'identification des anomalies de prix nécessitent un modèle d'IA rapide et économique.

import requests
import json
from typing import List, Dict, Tuple
from datetime import datetime

class HolySheepAIAnalyzer:
    """Analyseur d'arbitrage propulsé par HolySheep AI"""
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
    
    def analyze_arbitrage_opportunity(self, price_data: Dict, 
                                      market_context: str) -> Dict:
        """
        Utilise DeepSeek V3.2 pour analyser les opportunités d'arbitrage.
        Coût: 0.42$/MTok — 95% moins cher que GPT-4.1
        Latence: <50ms pour les requêtes simples
        """
        prompt = f"""
        Contexte de marché: {market_context}
        
        Données de prix actuelles:
        - BTCUSDT: Bid={price_data.get('btc_bid')} Ask={price_data.get('btc_ask')}
        - ETHUSDT: Bid={price_data.get('eth_bid')} Ask={price_data.get('eth_ask')}
        - Spread BTC-ETH: {price_data.get('spread')}
        - Volatilité 24h: {price_data.get('volatility')}%
        
        Analysez les opportunités d'arbitrage triangulaire et statistique.
        Retournez un JSON avec:
        - opportunity_score (0-100)
        - recommended_action
        - risk_level
        - expected_profit_bps
        - confidence_interval
        """
        
        response = requests.post(
            f"{self.base_url}/chat/completions",
            headers={
                "Authorization": f"Bearer {self.api_key}",
                "Content-Type": "application/json"
            },
            json={
                "model": "deepseek-v3.2",
                "messages": [
                    {"role": "system", "content": "Vous êtes un analyste quantitatif expert en trading haute fréquence."},
                    {"role": "user", "content": prompt}
                ],
                "temperature": 0.3,
                "max_tokens": 500
            },
            timeout=5  # Timeout de 5 secondes max
        )
        
        result = response.json()
        
        # Extraction et parsing de la réponse
        if 'choices' in result and len(result['choices']) > 0:
            content = result['choices'][0]['message']['content']
            return self._parse_ai_response(content)
        
        return {"error": "Échec de la requête AI", "details": result}
    
    def _parse_ai_response(self, content: str) -> Dict:
        """Parse la réponse JSON du modèle IA"""
        try:
            # Extraction du JSON de la réponse
            if "```json" in content:
                content = content.split("``json")[1].split("``")[0]
            elif "```" in content:
                content = content.split("``")[1].split("``")[0]
            
            return json.loads(content.strip())
        except json.JSONDecodeError:
            return {
                "opportunity_score": 0,
                "recommended_action": "HOLD",
                "analysis": content[:200]
            }
    
    def batch_analyze_symbols(self, symbols: List[str], 
                              market_data: Dict) -> List[Dict]:
        """Analyse par lots pour optimiser les coûts API"""
        results = []
        
        for symbol in symbols:
            context = f"""
            Symbole: {symbol}
            Prix actuel: {market_data.get(symbol, {}).get('price')}
            Volume 24h: {market_data.get(symbol, {}).get('volume')}
            Carnet d'ordres: {market_data.get(symbol, {}).get('orderbook_snapshot')}
            """
            
            analysis = self.analyze_arbitrage_opportunity(
                price_data=market_data.get(symbol, {}),
                market_context=context
            )
            results.append({
                "symbol": symbol,
                "analysis": analysis,
                "timestamp": datetime.utcnow().isoformat()
            })
        
        return results

=== OPTIMISATION DES COÛTS ===

Avec HolySheep AI (DeepSeek V3.2):

- 10M tokens = 4,20 $ (vs 80 $ avec GPT-4.1)

- 1 million de requêtes de 500 tokens = 0,50 $

- Économie annuelle: ~900 $ pour un bot actif

analyzer = HolySheepAIAnalyzer(api_key="YOUR_HOLYSHEEP_API_KEY") result = analyzer.analyze_arbitrage_opportunity( price_data={ 'btc_bid': 67450.50, 'btc_ask': 67452.00, 'eth_bid': 3520.25, 'eth_ask': 3521.80, 'spread': 0.0025, 'volatility': 2.3 }, market_context="Marché haussier modéré,volume en hausse de 15%" ) print(f"Analyse: {result}")

Stratégie d'arbitrage triangulaire implémentée

La stratégie d'arbitrage triangulaire exploite les inefficiences temporaires entre trois paires de trading. Voici l'implémentation complète du moteur d'arbitrage :

import asyncio
from typing import List, Dict, Optional
from dataclasses import dataclass
from enum import Enum

class ArbitrageSignal(Enum):
    STRONG_BUY = "STRONG_BUY"
    BUY = "BUY"
    NEUTRAL = "NEUTRAL"
    SELL = "SELL"
    STRONG_SELL = "STRONG_SELL"

@dataclass
class ArbitrageOpportunity:
    pair_sequence: List[str]
    spread_percentage: float
    net_profit_after_fees: float
    confidence: float
    signal: ArbitrageSignal
    required_capital: float
    timestamp: float

class TriangularArbitrageEngine:
    """Moteur d'arbitrage triangulaire haute fréquence"""
    
    # Frais Bybit pour contracts perpétuels (tier VIP 0)
    MAKER_FEE = 0.0002  # 0.02%
    TAKER_FEE = 0.00055  # 0.055%
    
    # Triangles populaires sur Bybit Linear
    COMMON_TRIANGLES = [
        ['BTCUSDT', 'ETHUSDT', 'ETHBTC'],
        ['BTCUSDT', 'SOLUSDT', 'SOLBTC'],
        ['ETHUSDT', 'LINKUSDT', 'LINKETH'],
        ['BTCUSDT', 'DOGEUSDT', 'DOGEBTC'],
    ]
    
    def __init__(self, bybit_client, ai_analyzer):
        self.bybit_client = bybit_client
        self.ai_analyzer = ai_analyzer
        self.min_profit_threshold = 0.001  # 0.1% profit minimum
        self.max_position_usdt = 10000  # 10k$ max par trade
    
    async def scan_triangles(self) -> List[ArbitrageOpportunity]:
        """Scanne tous les triangles pour identifier les opportunités"""
        opportunities = []
        
        for triangle in self.COMMON_TRIANGLES:
            try:
                opportunity = await self._analyze_triangle(triangle)
                if opportunity and opportunity.net_profit_after_fees > self.min_profit_threshold:
                    opportunities.append(opportunity)
            except Exception as e:
                print(f"Erreur analyse {triangle}: {e}")
        
        # Tri par profit net
        opportunities.sort(key=lambda x: x.net_profit_after_fees, reverse=True)
        return opportunities
    
    async def _analyze_triangle(self, pairs: List[str]) -> Optional[ArbitrageOpportunity]:
        """Analyse un triangle spécifique"""
        
        # Récupération des données de marché
        orderbooks = {}
        for pair in pairs:
            ob = await self.bybit_client.get_order_book(pair, limit=5)
            if ob.get('retCode') == 0:
                orderbooks[pair] = ob['result']
        
        if len(orderbooks) != 3:
            return None
        
        # Calcul du spread triangulaire
        spread = self._calculate_triangular_spread(pairs, orderbooks)
        
        # Frais totaux (3 trades)
        total_fees = (self.TAKER_FEE * 2 + self.MAKER_FEE)
        
        # Profit net après frais
        net_profit = spread - total_fees
        
        # Validation par IA HolySheep
        ai_validation = self.ai_analyzer.analyze_arbitrage_opportunity(
            price_data={'spread': spread, 'orderbooks': orderbooks},
            market_context=f"Triangle: {' -> '.join(pairs)}"
        )
        
        # Détermination du signal
        signal = self._determine_signal(net_profit, ai_validation)
        
        return ArbitrageOpportunity(
            pair_sequence=pairs,
            spread_percentage=spread * 100,
            net_profit_after_fees=net_profit * 100,
            confidence=ai_validation.get('opportunity_score', 50) / 100,
            signal=signal,
            required_capital=1000,
            timestamp=asyncio.get_event_loop().time()
        )
    
    def _calculate_triangular_spread(self, pairs: List[str], 
                                     orderbooks: Dict) -> float:
        """Calcule le spread d'un arbitrage triangulaire"""
        # Exemple: BTC->ETH->BTC via ETHBTC
        # Achat ETH avec BTC, puis vente ETH contre USDT, puis achat BTC avec USDT
        
        btc_eth = float(orderbooks['BTCUSDT']['a'][0]['p']) / \
                  float(orderbooks['ETHUSDT']['b'][0]['p'])
        
        eth_btc = float(orderbooks['ETHBTC']['b'][0]['p'])
        
        # Spread = (prix théorique - prix réel) / prix théorique
        spread = (btc_eth - eth_btc) / btc_eth
        
        return spread
    
    def _determine_signal(self, net_profit: float, 
                         ai_validation: Dict) -> ArbitrageSignal:
        """Détermine le signal de trading basé sur le profit et l'analyse IA"""
        score = ai_validation.get('opportunity_score', 50)
        
        if net_profit > 0.003 and score > 75:
            return ArbitrageSignal.STRONG_BUY
        elif net_profit > 0.0015 and score > 60:
            return ArbitrageSignal.BUY
        elif net_profit > 0:
            return ArbitrageSignal.NEUTRAL
        elif net_profit > -0.001:
            return ArbitrageSignal.SELL
        else:
            return ArbitrageSignal.STRONG_SELL
    
    async def execute_arbitrage(self, opportunity: ArbitrageOpportunity) -> Dict:
        """Exécute l'arbitrage si le signal est favorable"""
        if opportunity.signal.value not in ['STRONG_BUY', 'BUY']:
            return {"status": "SKIPPED", "reason": "Signal insuffisant"}
        
        # Calcul de la position optimale
        position_size = min(
            self.max_position_usdt,
            opportunity.required_capital
        )
        
        # Séquence d'ordres
        orders = []
        for i, pair in enumerate(opportunity.pair_sequence):
            if i == 0:
                side = "Buy"
            elif i == 1:
                side = "Sell"
            else:
                side = "Buy"
            
            order = self.bybit_client.place_order(
                symbol=pair,
                side=side,
                qty=position_size / 100,  # Taille approximative
                order_type="Market"
            )
            orders.append(order)
        
        return {
            "status": "EXECUTED",
            "orders": orders,
            "expected_profit": opportunity.net_profit_after_fees,
            "actual_profit": None  # À calculer après exécution
        }

=== OPTIMISATION HOLYSHEEP ===

Coût de l'analyse IA par trade:

- ~500 tokens par analyse

- 0.42$ / 1,000,000 tokens = 0.00021$ par analyse

- 10,000 trades/jour = 2.10$/jour = 63$/mois

Avec GPT-4.1: 10,000 * 0.50$ = 5,000$/mois

Gestion des risques et money management

Tout système de trading automatisé nécessite une gestion des risques robuste. Voici le module de risk management intégré à notre stratégie :

from dataclasses import dataclass
from typing import Optional
import time

@dataclass
class RiskParameters:
    max_daily_loss: float = 0.05  # 5% max de perte journalière
    max_position_size: float = 0.1  # 10% du capital max par position
    max_leverage: int = 3  # Levier maximum autorisé
    min_capital_for_trade: float = 100  # Capital minimum par trade
    stop_loss_percentage: float = 0.02  # Stop loss à 2%

class RiskManager:
    """Gestionnaire de risques pour le trading d'arbitrage"""
    
    def __init__(self, params: RiskParameters, initial_capital: float):
        self.params = params
        self.initial_capital = initial_capital
        self.current_capital = initial_capital
        self.daily_pnl = 0
        self.trades_today = 0
        self.max_drawdown = 0
        self.last_reset = time.time()
    
    def check_risk_limits(self, proposed_capital: float) -> tuple[bool, str]:
        """
        Vérifie si le trade proposé respecte les limites de risque.
        Retourne (autorisé, reason)
        """
        # Reset journalier
        current_time = time.time()
        if current_time - self.last_reset > 86400:  # 24h
            self._reset_daily()
        
        # Vérification de la perte journalière
        if self.daily_pnl < -self.initial_capital * self.params.max_daily_loss:
            return False, f"Limite de perte journalière atteinte: {self.daily_pnl:.2f}$"
        
        # Vérification de la taille de position
        position_ratio = proposed_capital / self.current_capital
        if position_ratio > self.params.max_position_size:
            return False, f"Taille de position {position_ratio*100:.1f}% > max {self.params.max_position_size*100}%"
        
        # Vérification du capital minimum
        if proposed_capital < self.params.min_capital_for_trade:
            return False, f"Capital {proposed_capital}$ < minimum {self.params.min_capital_for_trade}$"
        
        # Vérification drawdown
        drawdown = (self.initial_capital - self.current_capital) / self.initial_capital
        if drawdown > self.max_drawdown:
            self.max_drawdown = drawdown
        
        if drawdown > 0.15:  # 15% drawdown max
            return False, f"Drawdown maximal atteint: {drawdown*100:.1f}%"
        
        return True, "OK"
    
    def calculate_position_size(self, entry_price: float, 
                                stop_loss: float, 
                                risk_amount: float) -> float:
        """
        Calcule la taille de position optimale basée sur le risque.
        """
        risk_per_share = abs(entry_price - stop_loss)
        
        if risk_per_share == 0:
            return self.params.min_capital_for_trade
        
        position_size = risk_amount / risk_per_share
        position_value = position_size * entry_price
        
        # Appliquer les limites
        max_position_value = self.current_capital * self.params.max_position_size
        position_value = min(position_value, max_position_value)
        
        return position_value / entry_price
    
    def update_pnl(self, pnl: float):
        """Met à jour le P&L et les statistiques"""
        self.current_capital += pnl
        self.daily_pnl += pnl
        self.trades_today += 1
    
    def get_risk_report(self) -> dict:
        """Génère un rapport de risque complet"""
        return {
            "capital_actuel": self.current_capital,
            "pnl_journalier": self.daily_pnl,
            "pnl_total": self.current_capital - self.initial_capital,
            "trades_journaliers": self.trades_today,
            "drawdown_actuel": self.max_drawdown * 100,
            "ratio_risque": self.daily_pnl / self.initial_capital * 100,
            "statut": "OK" if self.current_capital > self.initial_capital * 0.95 else "ALERTE"
        }
    
    def _reset_daily(self):
        """Reset les compteurs journaliers"""
        self.daily_pnl = 0
        self.trades_today = 0
        self.last_reset = time.time()

=== UTILISATION ===

risk_params = RiskParameters( max_daily_loss=0.05, max_position_size=0.1, max_leverage=3, min_capital_for_trade=100 ) risk_manager = RiskManager(risk_params, initial_capital=50000)

Vérification avant trade

allowed, reason = risk_manager.check_risk_limits(proposed_capital=5000) print(f"Trade autorisé: {allowed}, Raison: {reason}")

Mise à jour après trade

risk_manager.update_pnl(pnl=25.50) print(f"Rapport risque: {risk_manager.get_risk_report()}")

Pour qui / pour qui ce n'est pas fait

Idéal pour vous si... Pas adapté si...
Vous avez une expérience en trading algorithmique et comprenez les risques Vous cherchez un gain garanti sans effort technique
Vous disposez d'un capital minimum de 5 000 $ pour commencer Vous avez un budget limité et ne pouvez pas absorber les pertes
Vous savez coder en Python et comprenez les APIs REST/WebSocket Vous préférez les stratégies manuelles et le trading visuel
Vous avez une connexion internet stable et un serveur dédié (optionnel) Vous dépendez d'une connexion WiFi publique ou mobile
Vous acceptez la volatilité et les drawdowns temporaires Vous avez une faible tolérance au risque (<5%)
Vous souhaitez réduire vos coûts IA avec HolySheep (0,42 $/MTok) Vous préférez payer plus cher pour des noms connus comme GPT-4.1

Tarification et ROI

Analysons le retour sur investissement attendu pour cette stratégie d'arbitrage avec HolySheep AI :

Poste de coût Avec HolySheep AI Avec GPT-4.1 Économie
API IA (10M tok/mois) 4,20 $/mois 80,00 $/mois -75,80 $
Frais Bybit (taker) 0,055% 0,055%
Coût的分析 (100k req/mois) ~2,10 $/mois ~50,00 $/mois -47,90 $
Latence moyenne <50ms ~850ms 94% plus rapide
Coût total / an ~75 $/an ~1 560 $/an -1 485 $ (95%)

ROI attendu : Avec des économies annuelles de 1 485 $ sur les coûts d'IA et une latence 94% inférieure, votre stratégie d'arbitrage peut capturer des opportunités 16x plus rapidement, augmentant potentiellement vos profits de 15-30% supplémentaires.

Pourquoi choisir HolySheep

Erreurs courantes et solutions

Erreur 1 : Signature d'authentification invalide (Code 10003)

# ❌ ERREUR : Signature malformed ou timestamp désynchronisé

Problème : Le timestamp est décalé de plusieurs secondes

✅ SOLUTION : Synchroniser l'horloge et générer la signature correctement

import time import requests from urllib.parse import urlencode def correct_signature_generation(api_key, api_secret, params): # Synchronisation du timestamp avec le serveur timestamp = str(int(time.time() * 1000)) recv_window = "5000" # Construction correcte du param_str pour signature sorted_params = sorted(params.items()) param_str = urlencode(sorted_params) # Format: key1=value1&key2=value2 # Signature HMAC SHA256 sign_str = timestamp + api_key + recv_window + param_str signature = hmac.new( api_secret.encode('utf-8'), sign_str.encode('utf-8'), hashlib.sha256 ).hexdigest() return timestamp, recv_window, signature

Application

timestamp, recv_window, signature = correct_signature_generation( "VOTRE_API_KEY", "VOTRE_API_SECRET", {"category": "linear", "symbol": "BTCUSDT", "qty": "0.001"} )

Erreur 2 : Rate limit dépassé (Code 10029)

# ❌ ERREUR : Trop de requêtes simultanées vers l'API Bybit

Problème : Le bot envoie des requêtes sans respect des limites

✅ SOLUTION : Implémenter un rate limiter et un système de retry

import time from threading import Lock from functools import wraps class RateLimiter: def __init__(self, max_requests_per_second=10): self.max_requests = max_requests_per_second self.min_interval = 1.0 / max_requests_per_second self.last_request = 0 self.lock = Lock() def wait(self): with self.lock: now = time.time() elapsed = now - self.last_request if elapsed < self.min_interval: time.sleep(self.min_interval - elapsed) self.last_request = time.time()

Utilisation

rate_limiter = RateLimiter(max_requests_per_second=10) def throttled_request(func): @wraps(func) def wrapper(*args, **kwargs): rate_limiter.wait() return func(*args, **kwargs) return wrapper

Appliquer le rate limiting

@throttled_request def get_market_data(symbol): response = requests.get(f"{BASE_URL}/v5/market/tickers", params={"category": "linear", "symbol": symbol}) if response.json().get('retCode') == 10029: time.sleep(1) # Attendre 1 seconde supplémentaire return get_market_data(symbol) # Retry return response.json()

Erreur 3 : Position non trouvée pour liquidation (Code 130021)

# ❌ ERREUR : Tentative de liquider une position déjà fermée

Problème : Le bot essaie de placer un ordre sur une position inexistante

✅ SOLUTION : Vérifier le statut de la position avant toute action

class PositionManager: def __init__(self, bybit_client): self.client = bybit_client self.cached_positions = {} def get_active_positions(self, symbol): """Récupère les positions actives avec mise en cache""" response = self.client.session.get( f"{self.client.BASE_URL}/v5/position/list", params={"category": "linear", "symbol": symbol} ) result = response.json()