Guide pour Maîtriser les Ordres de Trading en Cryptomonnaies avec Python

Crypto Robot6 mai 202417 min

Le guide avancé pour comprendre tous les différents types d'ordres en trading et apprendre à les placer correctement pour les cryptomonnaies en Python avec le package CCXT.

Preview_image

La base fondamentale du trading réside dans l’achat et la vente d’actifs. Ces opérations, qui se déroulent en plaçant des ordres sur un courtier en bourse ou une plateforme d’échange de cryptomonnaies, semblent simples à première vue. Pourtant, le monde des ordres de trading est très diversifié : certains s'exécutent immédiatement, d'autres attendent le moment propice, et certains peuvent éviter d’immobiliser vos fonds jusqu'à leur exécution.

En realité maîtriser le placement d'ordres est une des pierres angulaires de la réussite en trading algorithmique. C’est pourquoi dans cet article, nous proposons de décortiquer les différents types d'ordres, de présenter comment les implémenter en Python, et de vous guider à travers leurs spécificités pour que vous soyez le mieux équipé possible.

Trading Algorithmique Crypto en Python: Clé API et Package CCXT

CCXT : La référence pour le Trading de Cryptomonnaies en Python

Avant d’aborder les différents types d’ordres et leur mise en œuvre en python, nous devons configurer nos outils. En trading algorithmique, le placement d’un ordre s’accomplit grâce à l'API de la plateforme d'échange sur laquelle nous avons notre compte de trading. C’est en « dialoguant » avec cette API à travers notre code de programmation que nous pourrons, par exemple, placer, annuler ou modifier des ordres sur notre compte.

En principe, chaque plateforme d'échange possède sa propre API, et donc la syntaxe des fonctions en Python nécessaire pour le placement d’ordres peut grandement varier selon la plateforme. Heureusement pour nous, dans l’univers des cryptomonnaies, la librairie CCXT rassemble sous la même structure la plupart des plateformes d'échange. C’est donc cette librairie que nous allons utiliser.

Vous pouvez installer CCXT en tapant pip install ccxt dans votre terminal ou invite de commande. N'oubliez pas d'importer cette bibliothèque en ajoutant import ccxt au début de votre script Python.

Authentification sur Echangeur Crypto en Python avec CCXT

La premiere etape dans l’ecriture de notre code est l’obtantion de l'autorisation de placer des ordres. Sans ce que l’on appel les clés API nécessaires, l'exécution des ordres sur notre compte de trading, envoyée à l'API de l'échangeur, ne sera pas possible.

Pour créer une clé API sur le compte de votre plateforme d'échange crypto, il faut généralement vous rendre dans votre profil, ou paramètres, dans une rubrique qui s'appelle bien souvent « Gestion des API » (API Management). Une fois toutes les étapes de vérification nécessaires à la création de la clé API complétées, vous obtiendrez vos clés et mots de passe qu'il faudra ensuite renseigner dans le dictionnaire suivant :

autentification = {
    "apiKey": "",
    "secret": "",
    "password": "",
}

Attention, ces informations sont évidemment confidentielles ! Prenez garde à ne pas les divulguer.

Ensuite, nous procédons à l'authentification en créant une instance de la manière suivante :

bitget = ccxt.bitget(autentification)

C'est précisément à travers cette instance que nous serons en mesure de placer nos ordres. Nous utiliserons Bitget, l'échangeur avec lequel nous avons l'habitude de travailler dans nos exemples aujourd'hui, mais vous pouvez adapter cela à votre guise.

Si vous n'avez pas de compte Bitget et souhaiteriez en créer un, notre lien d'affiliation (https://partner.bitget.com/bg/CryptoRobotSIFR) vous permettra de gagner jusqu'à 8000$ de bonus sur les dépôts et de bénéficier de 0 frais sur le marché spot !

Link to the best crypto exchange

Les Ordres Marché dans le Trading

Les Ordres Marché: Qu’est ce que c’est et quand les choisir

L’ordre le plus simple qui existe est l'ordre marché, ou "market order" en anglais. Il s'exécute immédiatement et, comme son nom l'indique, au prix du marché.

Cette caractéristique implique plusieurs points importants. Premièrement, cet ordre ne figure jamais dans le carnet d'ordres de la plateforme d'échange. Deuxièmement, il est exécuté en totalité et de manière instantanée. Toutefois, en fonction de la liquidité disponible sur la plateforme et de la taille de l'ordre, il se peut que l’ordre soit exécuté en plusieurs segments à différents prix. Par exemple, si le prix du marché du Bitcoin est de 60 000 USDT et que vous placez un ordre pour acheter 1 Bitcoin, vous pourriez finir par acquérir 0.5 Bitcoin à 60 000 USDT, 0.3 Bitcoin à 60 005 USDT et les 0.2 Bitcoin restants à 60 010 USDT.

Il est important de noter que cet ordre entraîne des frais de "taker", généralement plus élevés, car il consomme de la liquidité existante sans en fournir. Ainsi, il est qualifié de "taker" (celui qui prend), par opposition au "maker" (celui qui crée), qui contribue à la liquidité.

Pourquoi choisir ce type d’ordre ? Il est préférable lorsque la priorité est l'exécution immédiate plutôt que le prix exact de l'opération.

Cela est particulièrement pertinent lorsqu'on souhaite effectuer un achat rapide de cryptomonnaie pour agrandir son portefeuille, ou lorsqu'un bot de trading doit exécuter des ordres instantanément dès que ses conditions sont remplies.

Comment Placer un Ordre Marché Crypto en Python

Un ordre marché se place très simplement avec CCXT; ces quelques lignes de code suffisent :

symbol = 'ETH/USDT:USDT'    # Symbole de la paire à échanger
order_type = 'market'       # Pour sélectionner un ordre au marché
side = 'buy'                # Sense de l'ordre, 'buy' pour acheter ou 'sell' pour vendre
amount = 0.02               # La quantité que vous souhaitez acheter ou vendre dans la devise de base

bitget.create_order(symbol, order_type, side, amount)

Vous pouvez remarquer que nous plaçons notre ordre sur le marché Futures en choisissant le symbole “ETH/USDT:USDT”. L’équivalent en Spot est “ETH/USDT”.

Il est important de savoir qu’il existe des limites de quantité et de précision sur les montants et les prix que nous donnons à notre ordre. Vous en avez peut-être déjà fait l’expérience en plaçant des ordres directement sur votre plateforme d'échange et que celle-ci vous informe que le montant est insuffisant.

Si vous souhaitez connaître ces limites, vous pouvez les récupérer simplement avec CCXT, comme ceci :

print(bitget.load_markets()['ETH/USDT:USDT']['limits'])

ce qui retourne :

{'leverage': {'min': 1.0, 'max': 100.0}, 'amount': {'min': 0.01, 'max': None}, 'price': {'min': None, 'max': None}, 'cost': {'min': 5.0, 'max': None}}

Comme vous pouvez le voir, sur le marché Futures, la quantité minimale de ETH que l'on peut acheter ou vendre par ordre est de 0.01. La méthode .load_markets() renvoie un vaste ensemble d'informations sous forme de dictionnaire concernant toutes les cryptomonnaies disponibles sur la plateforme. C'est pourquoi nous avons sélectionné uniquement les informations qui nous intéressent en ajoutant ['ETH/USDT:USDT']['limits'].

La précision des montants et des prix spécifiés dans vos ordres est asoumise à des restrictions. Les plateformes d'échange n'acceptent pas les valeurs avec trop de chiffres après la virgule. Pour prévenir toute erreur liée à ces contraintes, CCXT offre trois fonctions qui permettent d'ajuster les montants en fonction des règles de chaque plateforme :

adjusted_amount = bitget.amount_to_precision(symbol, amount) # Pour les quantites en monnaie de base
adjusted_cost = bitget.cost_to_precision(symbol, cost)     # Pour les quantites en monnaie de cotation
adjusted_price = bitget.price_to_precision(symbol, price)    # Pour les prix

Comment Placer un Ordre Marché Crypto SPOT sur Bitget en Python

Une particularité de Bitget lors du placement d’ordres marché SPOT est que l’API nécessite quand même la spécification d'un prix, même si vous indiquez déjà la quantité de cryptomonnaie désirée. Ce prix sert en général à déterminer le montant maximal que vous êtes prêt à dépenser.

Avec CCXT, la syntaxe devient donc :

symbol = 'ETH/USDT'    # Symbole de la paire à échanger
order_type = 'market'  # Pour sélectionner un ordre au marché
side = 'buy'           # Sense de l'ordre, 'buy' pour acheter ou 'sell' pour vendre
amount = 0.02          # La quantité que vous souhaitez acheter ou vendre dans la devise de base
price = 3600           # Prix unitaire estimé ou maximum que vous êtes prêt à payer pour l'ETH en USDT.

bitget.create_order(symbol, order_type, side, amount)

Les Ordres Limites dans le Trading

Les Ordres Limites en Crypto: Qu’est ce que c’est et quand les choisir

L'ordre limite permet de définir précisément le prix d'achat ou de vente (le ”prix d'exécution”) d'une quantité spécifique de cryptomonnaie. Il ne s'exécute que si un ordre correspondant est disponible dans le carnet d'ordres.

Contrairement à l'ordre marché, l'ordre limite est ajouté au carnet d'ordres de la plateforme, augmentant ainsi la liquidité du marché. Les frais appliqués sont ceux du "maker", généralement inférieurs à ceux du "taker".

Voici quatre points importants à considérer lors du placement d'un ordre limite :

  • Si le prix du marché n'atteint jamais votre prix d'exécution, l'ordre restera inactif.
  • Si le marché touche votre prix d'exécution mais manque de liquidité pour compléter l'ordre, celui-ci sera partiellement exécuté.
  • Si votre prix d'exécution correspond immédiatement à un prix existant dans le carnet d'ordres, votre ordre sera exécuté comme un ordre marché. Cela peut se produire si vous placez un ordre d'achat limite au prix de vente le plus bas actuel ou un ordre de vente limite au prix d'achat le plus élevé. Pour éviter cette exécution immédiate, consultez l'option "post_only" expliquée à la fin de cet article.
  • Un ordre limite immobilise vos fonds jusqu'à son exécution ou son annulation. Par exemple, si vous avez 1000 USDT et placez un ordre limite de 100 USDT pour acheter de l'ETH, ces 100 USDT seront réservés, réduisant vos fonds disponibles à 900 USDT.

En permettant de choisir le prix d'exécution, l'ordre limite est à privilégier dans certains cas. Par exemple, dans le cadre d'une gestion du risque minutieuse, lorsque le fait d'éviter d'entrer en position à des prix trop risqués pour sa stratégie est plus important que l'exécution assurée de l'ordre. Ou encore, lorsqu'on souhaite réduire au maximum les frais de trading, comme lors de l'implémentation de stratégies de trading algorithmique à haute fréquence.

Link to the best crypto exchange

Comment Placer un Ordre Limite pour Crypto en Python

La syntaxe pour placer un ordre limite avec CCXT est similaire à celle d’un ordre marché, mais il est nécessaire de spécifier précisément le prix d'exécution et de changer le type d'ordre en "limit", comme suit :

symbol = 'ETH/USDT:USDT'   
order_type = 'limit'  # Type fixé à limite.
side = 'buy'        
amount = 0.01           
price = 3600          # Prix d'exécution (prix exigé).

order = bitget.create_order(symbol, order_type, side, amount, price)

Notez que dans ce cas, nous stockons le résultat de bitget.create_order() dans une variable, order, au lieu de simplement exécuter la fonction. Cela nous permet de récupérer toutes les informations détaillant l'ordre. Vous pouvez les afficher ensuite avec print(order), ce qui ressemblera à ceci :

{'info': {'clientOid': '1165136252257808386', 'orderId': '1165136252232642562'}, 'id': '1165136252232642562', 'clientOrderId': '1165136252257808386', 'timestamp': None, 'datetime': None, 'lastTradeTimestamp': None, 'lastUpdateTimestamp': None, 'symbol': 'ETH/USDT:USDT', 'type': None, 'side': None, 'price': None, 'amount': None, 'cost': None, 'average': None, 'filled': None, 'remaining': None, 'timeInForce': None, 'postOnly': None, 'reduceOnly': None, 'stopPrice': None, 'triggerPrice': None, 'takeProfitPrice': None, 'stopLossPrice': None, 'status': None, 'fee': None, 'trades': [], 'fees': []}

Comment Supprimer un Ordre Crypto en Python

Vous pourriez vouloir supprimer votre ordre, ce qui est aussi une des raisons pour lesquelles nous avons stocké les informations de l’ordre dans la variable order. Pour annuler l'ordre, il vous suffit simplement de renseigner l’ID de l’ordre dans la méthode cancel_order et le tour est joué :

bitget.cancel_order(order['id'], symbol)

Tout savoir sur les Ordres Triggers pour le Trading

Les Ordres Triggers en Crypto: Qu’est ce que c’est et quand les choisir

L'ordre trigger, ou "ordre à déclenchement" en français, est un type d'ordre avancé qui ne s'active que lorsque certaines conditions prédéfinies sont remplies, souvent lorsqu'un prix spécifique, appelé le prix de déclenchement, est atteint.

Une fois activé, cet ordre peut se transformer en ordre au marché ou en ordre limite, selon vos préférences. L'avantage principal des ordres trigger est qu'ils ne bloquent pas vos fonds tant qu'ils ne sont pas activés.

Ce fonctionnement est particulièrement utile sur le marché des Futures. Imaginez que vous souhaitiez placer simultanément un ordre de prise de profit ("take profit") et un ordre de limitation de pertes ("stop loss"), chacun à des prix spécifiques. Si vous utilisiez des ordres limite, le placement du premier bloquera tous les fonds associés à cette position, empêchant le placement du second en raison de fonds insuffisants. L’API vous retournera un message d'erreur indiquant que vous ne disposez pas des fonds nécessaires.

Vous pouvez remédier à cela en plaçant deux ordres trigger, avec des prix de déclenchement correspondant respectivement à votre take profit et à votre stop loss. C’est l'approche que nous avons utilisée par exemple pour notre bot de trading sur la “stratégie enveloppe” multi-crypto. Voici le lien de la vidéo si cela vous intéresse : Stratégie de trading multi-crypto.

Comment Placer un Ordre Trigger pour Crypto en Python

Prenons d'abord l'exemple d’un ordre trigger au marché. Imaginons que nous voulions placer un stop loss. Généralement, dans ce cas, nous préférons nous assurer de sortir entièrement et immédiatement de notre position lorsque le prix de stop loss est atteint. Il est donc judicieux de configurer l'ordre trigger comme un ordre au marché plutôt qu’un ordre limite.

Voici comment implémenter cela avec CCXT :

symbol = 'ETH/USDT:USDT'
order_type = 'market'      # Pour choisir un ordre trigger au marché.
side = 'sell'
amount = 0.01
params = {
    'triggerPrice': 3500,  # Le prix de déclenchement.
}

order = bitget.create_order(symbol, order_type, side, amount, params=params)

Comme vous pouvez le voir, les détails sont spécifiés dans le paramètre params, qui doit être un dictionnaire. En définissant une clé triggerPrice avec le prix de déclenchement en valeur, nous stipulons que l'ordre doit être un ordre trigger. Avec le paramètre order_type = 'market', nous spécifions qu’il se transformera en ordre au marché une fois déclenché.

Les ordres trigger sont disponibles sur la plupart des plateformes d'échange de cryptomonnaies. Cependant, gardez à l'esprit que la syntaxe du dictionnaire params est spécifique à l'API de chaque plateforme. Le libellé triggerPrice peut varier d'un échange à l'autre. Il en va de même pour tout argument que vous passez par le dictionnaire params pour toute méthode de CCXT.

Prenons l’exemple avec la documentation de l'API de Bitget pour les ordres trigger : https://www.bitget.com/api-doc/contract/plan/Place-Plan-Order. Vous pouvez voir en milieu de page que le paramètre triggerPrice s'écrit ainsi, mais si vous devez appliquer cela à un autre échangeur, il vous faudra consulter la documentation correspondante pour adapter correctement les éléments du dictionnaire params.

Examinons maintenant l’ordre trigger limite. C’est très simple : il suffit de changer le type d'ordre et de bien renseigner le prix d'exécution, comme ceci :

symbol = 'ETH/USDT:USDT'
order_type = 'limit'  # Pour un ordre tigger limite.
side = 'buy'
amount = 0.01
price = 3501          # Prix d'exécution (prix exigé).
params = {
    'triggerPrice': 3500,  # Le prix de déclenchement.
}

order = bitget.create_order(symbol, order_type, side, amount, price, params=params)

Ce sera à vous de décider, selon les circonstances, si le prix d'exécution doit être supérieur ou inférieur au prix de déclenchement. Par exemple, pour un achat, vous pourriez fixer un prix d'exécution légèrement plus élevé pour mieux garantir la disponibilité de liquidité sur le carnet d'ordres, augmentant ainsi les chances que l'ordre soit exécuté. À l'inverse, vous pourriez choisir un prix plus bas si vous souhaitez que l'ordre ne s'exécute que si la tendance à la baisse se maintient.

Un ordre trigger non encore déclenché se trouvera dans la section “Open Orders”, puis “Trigger” de l'onglet "Trading Futures" de votre compte Bitget. Une fois déclenché, s'il s'agit d'un ordre au marché, la position sera ouverte. S'il s'agit d'un ordre limite, il passera dans la section “Open Orders”, puis “Limit”.

Link to the best crypto exchange

Comment Supprimer un Ordre Trigger Crypto en Python

Il y a une subtilité pour l’annulation d’un ordre trigger : si vous suivez exactement la méthode utilisée pour un ordre limite, l’API vous retournera une erreur. Pour indiquer à l’API que l’ID de l’ordre n’est pas à chercher dans les ordres limites mais bien dans les ordres trigger, il faut simplement ajouter de l’information spécifique dans le dictionnaire params, comme ceci :

bitget.cancel_order(order['id'], symbol, *params*={'stop': True})

Les Ordres Avancés dans le Trading

Les Ordres Crypto avec Take Profit et Stop Loss Inclus avec Python CCXT

Il est possible d'attacher des ordres trigger de take profit et/ou de stop loss directement à un ordre, qu'il s'agisse d'un ordre marché ou d'un ordre limite. Voici un exemple de code où l'ordre de base est un ordre marché, et les ordres TP (take profit) et SL (stop loss) sont des ordres trigger au marché :

symbol = 'ETH/USDT:USDT'
order_type = 'market'
side = 'buy'
amount = 0.02
params = {
    'stopLoss': {
        'triggerPrice': 3000,
        },
    'takeProfit': {
        'triggerPrice': 4000,
        },
    }

order = bitget.create_order(symbol, order_type, side, amount, params=params)

En exécutant un tel ordre, vous verrez votre position ouverte dans la section "Position" de l'onglet "Trading Futures" de votre compte Bitget. Les deux ordres TP et SL associés seront visibles dans la section "Open Orders", sous "TP/SL".

Si l'ordre initial était un ordre limite et que vous souhaitiez le supprimer, notez qu'il faut utiliser une clé spécifique dans params dans la methode cancel_order(), comme dans le cas des ordres trigger. Cependant, cette fois-ci, le paramètre requis est params={'planType': 'profit_loss'}.

Le reduce = True dans les Ordres Cypto avec Python CCXT

Un paramètre crucial que vous pouvez inclure dans le dictionnaire params de la méthode create_order() est **reduce=True**. Cela garantit que l'ordre ne peut qu'amoindrir une position existante au lieu d'en ouvrir une nouvelle ou d'en augmenter une déjà en place.

Par exemple, si vous utilisez votre code pour ouvrir une position de vente ("short") sur une cryptomonnaie afin de clôturer une position d'achat ("long") sur la même cryptomonnaie, mais que la taille de votre "short" dépasse possiblement celle de votre "long", vous risquez de vous retrouver avec un solde résiduel de "short". L'option reduce=True élimine ce risque, vous assurant que seule la position d'achat est clôturée sans générer un reste de vente.

Le post_only dans les Ordres Cypto avec Python CCXT

Dans le cadre d'un ordre limite, un paramètre important que vous pouvez spécifier dans le dictionnaire params de la méthode create_order() est **post_only=True**. Cela garantit que votre ordre n'est pas exécuté immédiatement contre des ordres déjà présents, ce qui le maintient toujours en tant que "maker" plutôt que "taker". Cela peut aider à réduire les frais et à s'assurer que votre ordre contribue à la liquidité du carnet d'ordres, plutôt que de la réduire. Si un ordre "post_only" risque d'être exécuté contre un ordre existant, il sera annulé plutôt que d'être exécuté au prix du marché.

Armé d'une solide compréhension des différents types d'ordres de trading en cryptomonnaies et des outils Python, vous êtes désormais bien préparé pour affiner vos stratégies et optimiser vos performances en trading algorithmique. Que vous optiez pour des ordres au marché afin de garantir une exécution immédiate, des ordres à cours limité pour contrôler précisément vos prix d'entrée et de sortie, ou encore des ordres trigger pour une flexibilité accrue, le choix vous appartient en fonction de vos préférences et de votre stratégie.