Vous pouvez souvent trouver des articles qui s'appellent quelque chose comme ceci: «10 projets qu'un programmeur doit implémenter». Les robots commerciaux sont souvent répertoriés dans ces articles. Je pense que développer un bot de trading est un investissement rentable. J'ai donc décidé de prendre le temps d'écrire un tutoriel à ce sujet.
Mais au lieu de faire une analyse ligne par ligne de certains codes, j'ai décidé qu'il serait préférable de démonter les concepts avec lesquels quelqu'un qui veut créer son propre bot devrait être familier. Le but de mon matériel est qu'après l'avoir lu, vous écririez vous-même le code.
Par conséquent, je vais parler de ce qu'il est utile de savoir pour développer un bot de trading et de ce qui est nécessaire pour cela (du travail avec les bourses à la mise en œuvre d'une stratégie de trading simple). Ici, je vais aborder les questions liées à l'architecture et à la structure interne des robots de trading simples, avec les idées qui les sous-tendent. Je vais démontrer des exemples écrits en pseudocode. Par conséquent, vous pouvez lire ce guide et écrire immédiatement votre propre bot dans le langage de programmation de votre choix. En conséquence, vous vous sentirez à l'aise avec un outil que vous connaissez bien. Vous serez en mesure de vous engager calmement dans la programmation et de ne pas passer de temps à mettre en place l'environnement de travail et à vous habituer à une nouvelle langue. Vous choisirez une arme et je vous apprendrai à utiliser cette arme.
Étape 1. Choisir une arme
Dans la première étape de ce didacticiel, vous choisirez le langage de programmation que vous utiliserez. Vous devez décider vous-même de cette question.
Certains langages, comme Python, peuvent être préférés si vous prévoyez d'équiper votre bot à l'avenir, par exemple, avec des mécanismes d'apprentissage automatique. Mais mon idée principale est que vous pouvez choisir la langue qui vous convient le mieux.
Étape 2. À la recherche du champ de bataille
Un sujet important est souvent négligé dans les guides d'écriture de bot de trading. Cela concerne le choix de l'échange. Le fait est que pour qu'un bot puisse faire ce pour quoi il a été créé, il doit avoir accès à un échange où vous pouvez échanger quelque chose. Choisir un échange et savoir comment l'utiliser est tout aussi important que les compétences en programmation.
Donc, votre première étape consistera à décider exactement ce que vous allez négocier (actions, devises, crypto-monnaies) et à décider exactement où vous allez négocier.
Si nous parlons d'actifs négociés en bourse, je vous conseillerais de faire attention aux crypto-monnaies. La raison de cette recommandation n'est pas que je suis un partisan des technologies blockchain et des crypto-monnaies (je suis complètement ouvert sur cette question), mais seulement que les marchés de la crypto-monnaie fonctionnent 24 heures sur 24, 7 jours sur 7.
Les actifs plus «traditionnels» ne peuvent être négociés qu'à certains intervalles de temps, et souvent uniquement en semaine. Les marchés boursiers, par exemple, sont généralement ouverts de 9 h à 16 h et sont fermés le week-end. Les marchés FOREX, bien qu'ils puissent fonctionner 24 heures sur 24, sont généralement fermés le week-end.
À cet égard, les crypto-monnaies nous conviennent le mieux, car le choix de ce marché permettra à notre bot de fonctionner sans interruption. De plus, les crypto-monnaies sont connues pour leurs niveaux élevés de volatilité. Cela signifie, d'une part, que vous pouvez perdre beaucoup d'argent en les échangeant et, d'autre part, qu'ils sont un excellent outil pour étudier et tester les stratégies de trading.
Nous avons déjà parlé d'actifs d'échange. Discutons maintenant des exigences à prendre en compte lors du choix d'un échange pour lequel un bot sera créé. À savoir, je parle de deux exigences de base:
- Vous devez être légalement en mesure de négocier sur la bourse sélectionnée et de travailler avec les instruments de négociation qu'elle propose. Si nous parlons de crypto-monnaies, dans certains pays, leur commerce est interdit. Considérez cela lors du choix des instruments et d'un échange.
- API, . , .
Une fois qu'il s'est avéré qu'un certain échange répond à ces deux exigences de base, vous pouvez l'analyser plus en profondeur. Par exemple, estimez la taille des commissions, évaluez sa fiabilité et sa popularité, regardez la qualité de la documentation de son API.
Et pourtant, ce qui est tout aussi important que tout le reste, je recommanderais d'évaluer le volume des transactions de la bourse. Les échanges à faible volume ont tendance à être à la traîne par rapport aux mouvements de prix. De plus, il est plus difficile d'exécuter des ordres à cours limité sur eux (nous en reparlerons plus en détail ci-dessous).
Si vous décidez enfin de choisir les crypto-monnaies, voici une bonne liste des principaux échanges. Vous trouverez ici diverses informations à leur sujet pour vous aider à choisir un échange.
Étape 3. Construction du camp
Si l'échange est un champ de bataille, nous allons maintenant parler de l'endroit d'où nous enverrons nos troupes sur le champ de bataille. Soit dit en passant, il est peut-être temps pour moi de faire de telles analogies.
Je parle du serveur ici. Le code du bot doit être exécuté sur un serveur, ce qui permettra au bot d'envoyer des requêtes à l'API d'échange.
Lorsque vous testez un bot, votre ordinateur peut bien sûr jouer le rôle de serveur. Mais si vous avez besoin d'un robot pour travailler tout le temps, un ordinateur ordinaire n'est certainement pas le meilleur choix.
J'ai deux suggestions ici:
- Le rôle de serveur peut être joué par le Raspberry Pi (cette approche est plus intéressante).
- Le serveur peut être une sorte de service cloud (et cette approche est meilleure).
Je pense qu'organiser un bot sur la base de votre propre serveur Raspberry Pi est une idée intéressante et moderne, donc si vous aimez aussi cette idée, vous pouvez la donner vie.
Mais la plupart des constructeurs de robots opteront probablement pour un fournisseur de services cloud comme AWS , Azure , GCS ou Digital Ocean .
La plupart des principaux fournisseurs de cloud proposent de bons plans gratuits, vous pourrez donc peut-être héberger votre bot avec un gratuitement.
Ceci conclut ma conversation sur les serveurs. Vous devez choisir ce qui vous convient le mieux. Pour un petit projet comme celui que nous faisons, ce qui sera choisi n'aura pas un grand impact sur le résultat final.
Étape 4. Créez un bot
Et maintenant, le plaisir commence. Mais, avant de commencer cette partie de notre projet, vérifiez si ce qui suit a été fait:
- Vous vous êtes inscrit sur l'échange et avez reçu les permis nécessaires pour travailler avec lui.
- Vous avez la possibilité de travailler avec l'API d'échange, vous avez une clé API.
- Vous avez choisi l'hébergement du bot.
Si ces problèmes sont résolus, cela signifie que nous pouvons passer à autre chose.
▍ Le robot le plus simple
Mon objectif est d'aider quelqu'un qui, jusqu'à présent, ne connaissait absolument rien aux bots, à s'élever au niveau de la création d'un simple bot fonctionnel. Par conséquent, je vais vous dire comment créer un bot de trading simple que vous pouvez développer et améliorer en fonction de vos besoins.
Notre bot aura quelques limitations:
- Le bot ne pourra rester que dans l'un des deux états suivants: ACHETER (acheter) ou VENDRE (vendre). Il ne passera pas constamment d'ordres d'achat ou de vente à des prix différents. Si la dernière opération était une vente, l'opération suivante que le bot tentera d'effectuer est un achat.
- Le bot utilisera des seuils fixes pour prendre des décisions d'achat et de vente. Un bot plus intelligent peut être en mesure d'ajuster indépendamment ces valeurs en fonction de divers indicateurs, mais la stratégie et les limites de notre bot seront définies manuellement.
- Il n'échangera qu'une seule paire de devises. Par exemple - BTC / USD.
Ces restrictions facilitent notre tâche. Le bot sera simple, ce qui signifie qu'il sera plus facile à construire et à maintenir. Cela nous permettra également de déployer très rapidement son code sur le serveur. En gros, nous parlons ici du principe KISS.
▍Mécanisme de prise de décision
Voici un schéma simple donnant un aperçu du fonctionnement de notre bot.
Vous pouvez maintenant commencer à planifier votre architecture de bot.
Pour commencer, nous avons besoin d'une variable qui stockera des informations sur l'état exact du bot au moment actuel. C'est soit ACHETER soit VENDRE. Une variable booléenne ou une énumération est un bon choix pour stocker ces informations.
Ensuite, vous devez définir des seuils pour les opérations d'achat et de vente. Ces valeurs sont exprimées en pourcentage et représentent l'augmentation ou la diminution du prix de l'actif depuis la transaction précédente.
Par exemple, si j'ai acheté quelque chose à 100 $ et que le prix actuel est de 102 $, alors nous avons affaire à une augmentation de prix de 2%. Si le seuil de l'opération SELL est fixé à une augmentation de 1% du prix, le bot, voyant ces 2%, vendra l'actif, car il a déjà réalisé un profit qui dépasse la valeur seuil que nous avons définie.
Dans notre cas, ces valeurs seront des constantes. Nous avons besoin de 4 valeurs de ce type - 2 pour chaque état du bot.
▍Valeurs de seuil pour l'opération BUY (si le bot est à l'état SELL)
DIP_THRESHOLD
: le bot effectue une opération d'achat si le prix a diminué d'une valeur supérieure à la valeur spécifiéeDIP_THRESHOLD
. La logique derrière cela est de mettre en œuvre une stratégie d'achat bas, de vente élevée. Autrement dit, le bot tentera d'acheter un actif à un prix réduit, en s'attendant à une augmentation du prix et à la possibilité d'une vente rentable de l'actif.UPWARD_TREND_THRESHOLD
: le bot achète un actif si le prix a augmenté d'une valeur supérieure à celle spécifiée par cette constante. Ce mouvement contredit la philosophie d'achat bas, de vente élevée. Son but est d'identifier une tendance haussière et de ne pas rater une opportunité d'achat avant que le prix ne monte encore plus.
Voici une illustration qui peut vous aider à comprendre la signification de ces constantes.
Si nous avons effectué l'opération SELL au moment indiqué sur la figure avec le marqueur SELL rouge, le bot, lorsqu'il décidera d'effectuer ou non l'opération ACHAT, sera guidé par les valeurs de seuil
DIP_THRESHOLD
et UPWARD_TREND_THRESHOLD
.
Si le prix passe en dessous de la ligne verte inférieure ou au-dessus de la ligne verte supérieure, nous effectuerons une opération ACHAT. Dans la situation illustrée sur la figure, le prix a dépassé la limite supérieure. Par conséquent, nous, guidés par la valeur, avons
UPWARD_TREND_THRESHOLD
effectué l'opération BUY.
▍Valeurs de seuil pour l'opération SELL (si le bot est à l'état BUY)
PROFIT_THRESHOLD
: le bot vend un actif si le prix est devenu supérieur au prix calculé sur la base de cette valeur, puisque l'actif a été précédemment acheté à un prix inférieur. C'est ainsi que nous réalisons des bénéfices. Nous vendons l'actif à un prix supérieur au prix au moment de l'achat.STOP_LOSS_THRESHOLD
: Idéalement, nous souhaiterions que le bot vende des actifs uniquement lorsque la vente est rentable pour nous. Mais, peut-être, il y a eu un fort mouvement de marché à la baisse. Dans une telle situation, nous décidons de quitter le commerce avant de subir une perte trop importante, puis d'acheter l'actif à un prix inférieur. Ce seuil est utilisé pour clôturer la position à perte. Le but de cette opération est d'éviter des pertes plus importantes.
Voici une illustration.
Cela montre la situation où un achat a été effectué où se trouve le marqueur ACHAT. Après cela, le prix atteint la limite spécifiée
PROFIT_THRESHOLD
et nous vendons l'actif avec un profit. C'est ainsi que les robots gagnent de l'argent.
Maintenant que nous avons une compréhension générale du fonctionnement d'un bot, il est temps de regarder le pseudo-code.
▍Fonctions utiles pour travailler avec l'API
La première chose dont un bot aura besoin est la possibilité d'échanger des données avec l'API d'échange. Nous implémentons ces capacités à l'aide de plusieurs fonctions d'assistance:
FUNCTION getBalances():
DO: GET- API
RETURN:
FUNCTION getMarketPrices():
DO: GET- API
RETURN:
FUNCTION placeSellOrder():
DO:
1. (
, ,
50% )
2. POST- API
SELL
RETURN:
FUNCTION placeBuyOrder():
DO:
1. (
, ,
50% )
2. POST- API
BUY
RETURN:
// ,
//
FUNCTION getOperationDetails():
DO: GET- API
RETURN:
Le code ci-dessus doit être explicite sans trop d'explications. Mais, en mettant en œuvre cette fonctionnalité, vous devez savoir exactement quelles données vous devez transférer vers l'API lorsque vous effectuez des requêtes POST qui initient l'achat ou la vente de quelque chose.
Souvent, par exemple, lors du trading de la paire XAU / USD (or et dollars américains), lors de l'exécution d'une demande, vous pouvez spécifier soit la quantité d'or que vous devez acheter, soit le nombre de dollars à vendre. Lors de l'exécution de telles demandes, il est très important de comprendre clairement la signification des actions effectuées.
▍Boucle principale du bot
Maintenant que nous avons préparé les fonctions d'assistance, commençons à décrire les actions du bot. Tout d'abord, nous devons créer une boucle sans fin qui s'exécute à intervalles réguliers. Supposons que nous voulions qu'un bot essaie d'effectuer une opération toutes les 30 secondes. Voici à quoi pourrait ressembler une boucle comme celle-ci:
FUNCTION startBot():
INFINITE LOOP:
attemptToMakeTrade()
sleep(30 seconds)
Ensuite, nous allons configurer les variables et les constantes dont nous avons parlé ci-dessus, et écrire la logique du bot qui lui permet de prendre des décisions. En conséquence, en plus des fonctions auxiliaires et de la boucle principale, le code du bot principal ressemblera à ceci:
bool isNextOperationBuy = True
const UPWARD_TREND_THRESHOLD = 1.50
const DIP_THRESHOLD = -2.25
const PROFIT_THRESHOLD = 1.25
const STOP_LOSS_THRESHOLD = -2.00
float lastOpPrice = 100.00
FUNCTION attemptToMakeTrade():
float currentPrice = getMarketPrice()
float percentageDiff = (currentPrice - lastOpPrice)/lastOpPrice*100
IF isNextOperationBuy:
tryToBuy(percentageDiff)
ELSE:
tryToSell(percentageDiff)
FUNCTION tryToBuy(float percentageDiff):
IF percentageDiff >= UPWARD_TREND_THRESHOLD OR percentageDiff <= DIP_THRESHOLD:
lastOpPrice = placeBuyOrder()
isNextOperationBuy = False
FUNCTION tryToSell(float percentageDiff):
IF percentageDiff >= PROFIT_THRESHOLD OR percentageDiff <= STOP_LOSS_THRESHOLD:
lastOpPrice = placeSellOrder()
isNextOperationBuy = True
Notez que les seuils de ce code sont sélectionnés au hasard. Vous devez choisir vous-même ces valeurs, conformément à votre stratégie de trading.
En combinant le code ci-dessus avec les fonctions d'assistance et avec la boucle principale du bot, qui peut être représentée par quelque chose comme une fonction
main
, cela signifie que nous avons maintenant un bot de travail très simple avec les capacités de base typiques des bots.
À chaque itération du cycle, le bot vérifiera son état actuel (ACHETER ou VENDRE) et tentera d'effectuer une opération de trading, en utilisant des valeurs de seuil codées en dur dans son code lors de l'analyse de la situation actuelle. Ensuite, si l'opération est terminée, le bot mettra à jour les informations sur son état actuel et les données sur le prix auquel la dernière opération a été effectuée.
Étape 5. Amélioration du bot
L'architecture de base de notre bot est prête. Mais nous pouvons probablement l'améliorer un peu en l'équipant de quelques fonctionnalités supplémentaires.
▍Magazines
Lorsque j'ai commencé à créer l'une des variantes de ce bot, il était très important pour moi que le bot enregistre en permanence des informations sur ses actions, les produisant sur le terminal et dans un fichier journal séparé.
Chaque étape du programme aurait dû être accompagnée d'environ les enregistrements suivants:
[BALANCE] USD Balance = 22.15$
[BUY] Bought 0.002 BTC for 22.15 USD
[PRICE] Last Operation Price updated to 11,171.40 (BTC/USD)
[ERROR] Could not perform SELL operation - Insufficient balance
Ce qui entre dans le fichier journal est horodaté. En conséquence, si je me connecte au serveur une fois par jour et que je vois, par exemple, un message d'erreur, je peux savoir exactement quand l'erreur s'est produite et ce que le bot faisait tout ce temps.
Équiper un bot de ces capacités signifie écrire une fonction qui peut être nommée
createLog
. Cette fonction doit être appelée à chaque étape de la boucle principale du bot. Voici à quoi pourrait ressembler cette fonction:
FUNCTION createLog(string msg):
DO:
1. msg
2. msg ,
▍Identification des tendances
L'objectif principal de notre bot est d'acheter des actifs à bas prix et de les vendre, en réalisant un profit. Mais dans son code, il y a deux constantes symbolisant deux valeurs de seuil, qui contredisent en partie cet objectif. Ceci
UPWARD_TREND_THRESHOLD
et STOP_LOSS_THRESHOLD
.
Ces valeurs visent à limiter les pertes en vendant l'actif lorsque le prix baisse et à organiser l'achat de l'actif lorsque le prix augmente. Le point ici est qu'avec leur aide, nous essayons de prédire les tendances, les prix, lorsqu'ils apparaissent, dépassent les limites de la stratégie habituelle, mais peuvent soit nous nuire, soit nous donner de l'argent. Cela et un autre prévoient certaines actions de notre part.
La façon dont l'analyse des prix fonctionne maintenant nous limite beaucoup. L'analyse des prix, réalisée en comparant une paire d'indicateurs, est loin d'être un mécanisme d'identification des tendances.
Mais nous pouvons, heureusement, sans trop de problèmes, rendre notre système de détection de tendance plus fiable.
Nous devons simplement organiser l'observation de plus de valeurs de prix qu'auparavant. Et avant, nous stockions des informations sur un seul indicateur de prix - sur la valeur de l'actif au moment de la dernière opération (
lastOpPrice
). Vous pouvez, par exemple, stocker des informations sur les prix des 10 ou 20 dernières itérations du cycle du bot et les comparer avec le prix actuel, et pas seulement lastOpPrice
. Cela permettra probablement une meilleure identification des tendances, car avec cette approche nous pouvons capturer les fluctuations de prix à court terme plutôt que les fluctuations qui se produisent sur une longue période.
▍Base de données?
Un simple bot n'a pas vraiment besoin d'une base de données. Après tout, il fonctionne avec de très petites quantités de données et stocke toutes les informations dont il a besoin en mémoire.
Mais que se passe-t-il si, par exemple, le bot est anormalement arrêté? Comment peut-il savoir, sans intervention humaine, quel était le sens
lastOpPrice
?
Afin d'éliminer la nécessité d'une intervention manuelle dans le code du bot lors de son redémarrage, nous pouvons avoir besoin d'une base de données simple dans laquelle nous pouvons stocker des indicateurs comme
lastOpPrice
.
Avec cette approche, le bot, une fois lancé, peut ne pas utiliser les valeurs codées en dur dans le code. Au lieu de cela, il accède aux données stockées et reprend là où il s'était arrêté.
Selon la simplicité que vous pensez de cette «base de données», vous pouvez même décider d'utiliser des fichiers .txt ou .json normaux en tant que tels, car, dans tous les cas, nous parlons de stocker très ensemble de données limité.
▍ Panneau de contrôle
Si vous souhaitez organiser la visualisation de l'activité du bot, ainsi que la gérer sans modifier son code, vous pouvez connecter le bot à une sorte de panneau de contrôle.
Cela nécessitera que le bot ait sa propre API de serveur pour gérer ses fonctionnalités.
Cette approche, par exemple, facilite la modification des seuils.
De nombreux modèles de tableaux de bord sont disponibles, ce qui signifie que si vous décidez de faire quelque chose comme ça, vous n'avez même pas à en créer un à partir de zéro. Jetez un œil à Start Bootstrap et Creative Tim , par exemple .
▍ Stratégies de test sur les données historiques
De nombreux échanges permettent aux clients d'accéder à des données historiques sur les prix. De plus, si vous avez besoin de telles données, elles sont généralement faciles à obtenir.
Leur utilisation est très utile pour tester les stratégies de trading avant de les appliquer réellement. Cela permet à une simulation de s'exécuter en utilisant des données historiques et de la fausse monnaie. Cela vous permet de connaître les performances des seuils et, si nécessaire, de modifier ces valeurs.
▍ Informations supplémentaires sur les seuils et les demandes
Il y a plusieurs choses à garder à l'esprit lors de la commande.
Tout d'abord, vous devez savoir qu'il existe deux types d'ordres: les ordres à cours limité et les ordres au marché. Si vous ne savez rien du tout à ce sujet, vous devriez absolument lire la littérature spéciale. Je vais vous expliquer ces idées en quelques mots.
Les ordres de marché sont des ordres exécutés au prix actuel du marché. Dans la plupart des cas, cela signifie leur mise en œuvre immédiate.
Les ordres à cours limité, en revanche, sont des ordres placés indiquant un prix inférieur au marché (dans le cas des ordres d'achat) ou supérieur au marché (dans le cas des ordres de vente). Dans le même temps, il n'y a aucune garantie que ces ordres seront exécutés, car le prix peut ne pas atteindre la valeur spécifiée.
La force des ordres limités est qu'ils permettent, en anticipant les mouvements du marché, de passer des ordres là où, de l'avis du trader, le prix peut être.
En outre, des commissions moins élevées sont généralement appliquées à ces ordres qu'à ceux du marché. Cela est dû au fait que ce que l'on appelle une «commission de preneur» est généralement appliquée aux ordres de marché, et ce que l'on appelle généralement une «commission de fabricant» s'applique aux ordres à cours limité.
Les raisons pour lesquelles ces commissions sont nommées de cette façon sont parce que quiconque passe un ordre de marché «prend» simplement le prix actuel du marché. Et les ordres à cours limité sont en dehors des prix du marché, ils ajoutent de la liquidité au marché et, par conséquent, «créent un marché», pour lequel leurs créateurs sont récompensés par des commissions moins élevées.
Veuillez noter que le bot que nous envisageons ici est le mieux adapté pour travailler avec les ordres du marché.
Et, pour conclure la conversation sur les commissions, je tiens à noter que lors de la définition de la valeur
PROFIT_THRESHOLD
, les commissions doivent également être prises en compte.
Pour réaliser un profit, le bot doit d'abord effectuer l'opération ACHETER, puis l'opération VENDRE. Cela signifie que la commission sera facturée deux fois.
En conséquence, le bot doit être configuré de sorte que le profit reçu des ventes couvre au moins les commissions. Sinon, le bot échangera à perte.
Pensons-y, partant de l'hypothèse de l'utilisation de commissions qui ne dépendent pas du montant de la demande et du type d'opération. Ainsi, la commission d'achat d'un actif pour 100,00 $ est de 0,50 $. Si cet actif est vendu pour 100,75 $ et que la même commission est facturée, il s'avère que la marge brute est de 0,75%. Mais, en fait, nous avons affaire ici à une perte nette de 0,25%.
Imaginez maintenant que votre bot ferme toujours les transactions avec une perte nette. Dans une telle situation, vous pouvez rapidement perdre beaucoup d'argent.
Résultat
Mon objectif principal était de révéler les concepts que vous devez connaître lors du développement de robots de trading. J'ai essayé de tout décrire de manière à ce que cela soit compréhensible même pour ceux qui n'avaient jamais négocié en bourse auparavant. Dans le même temps, je n'ai lié la narration à aucun langage de programmation spécifique.
J'ai supposé que les lecteurs de ce matériel savent comment faire des requêtes HTTP en utilisant le langage de programmation de leur choix. Par conséquent, je ne suis pas entré dans les détails de la programmation, en me concentrant sur d'autres choses.
Je vous ai dit tout ce que je voulais sur le développement de robots commerciaux. J'espère que vous pouvez maintenant créer votre propre bot.
Utilisez-vous des robots de trading?