Forex Algorithmic Trading : Un conte pratique pour les ingénieurs

Publié: 2022-03-11

Comme vous le savez peut-être, le marché des changes (Forex ou FX) est utilisé pour les échanges entre paires de devises. Mais vous ne savez peut-être pas qu'il s'agit du marché le plus liquide au monde.

Il y a quelques années, poussé par ma curiosité, j'ai fait mes premiers pas dans le monde du trading algorithmique Forex en créant un compte démo et en jouant des simulations (avec de la fausse monnaie) sur la plateforme de trading Meta Trader 4.

Illustration de couverture Forex

Après une semaine de "trading", j'avais presque doublé mon argent. Stimulé par mon propre trading algorithmique réussi, j'ai creusé plus profondément et je me suis finalement inscrit à un certain nombre de forums FX. Bientôt, je passais des heures à lire sur les systèmes de trading algorithmique (ensembles de règles qui déterminent si vous devez acheter ou vendre), les indicateurs personnalisés, les humeurs du marché, etc.

Mon premier client

À cette époque, par coïncidence, j'ai entendu dire que quelqu'un essayait de trouver un développeur de logiciels pour automatiser un système de trading simple. C'était à l'époque où j'étais à l'université lorsque j'apprenais la programmation concurrente en Java (threads, sémaphores et tout ce bazar). Je pensais que ce système automatisé ne pouvait pas être beaucoup plus compliqué que mon travail de cours avancé en science des données, alors je me suis renseigné sur le travail et je suis venu à bord.

Le client voulait un logiciel de trading algorithmique construit avec MQL4, un langage de programmation fonctionnel utilisé par la plateforme Meta Trader 4 pour effectuer des actions liées aux actions.

MQL5 a depuis été publié. Comme vous vous en doutez, il résout certains des problèmes de MQL4 et est livré avec plus de fonctions intégrées, ce qui facilite la vie.

Le rôle de la plateforme de trading (Meta Trader 4, dans ce cas) est de fournir une connexion à un courtier Forex. Le courtier fournit ensuite une plateforme avec des informations en temps réel sur le marché et exécute vos ordres d'achat/vente. Pour les lecteurs non familiarisés avec le trading Forex, voici les informations fournies par le flux de données :

Ce diagramme illustre les données impliquées dans le trading algorithmique Forex.

Grâce à Meta Trader 4, vous pouvez accéder à toutes ces données avec des fonctions internes, accessibles à différents intervalles de temps : toutes les minutes (M1), toutes les cinq minutes (M5), M15, M30, toutes les heures (H1), H4, J1, W1, MN .

Le mouvement du prix actuel est appelé un tick . En d'autres termes, un tick est une variation du cours acheteur ou vendeur d'une paire de devises. Pendant les marchés actifs, il peut y avoir de nombreux ticks par seconde. Pendant les marchés lents, il peut y avoir des minutes sans coche. La tique est le battement de cœur d'un robot du marché des changes.

Lorsque vous passez une commande via une telle plateforme, vous achetez ou vendez un certain volume d'une certaine devise. Vous définissez également des limites de stop-loss et de take-profit. La limite de stop-loss est le montant maximum de pips (variations de prix) que vous pouvez vous permettre de perdre avant d'abandonner une transaction. La limite de profit est le montant de pips que vous accumulerez en votre faveur avant de retirer votre argent.

Si vous souhaitez en savoir plus sur les bases du trading (par exemple, les pips, les types d'ordres, les spreads, les glissements, les ordres au marché, etc.), cliquez ici.

Les spécifications de trading algorithmique du client étaient simples : ils voulaient un robot Forex basé sur deux indicateurs. Pour le contexte, les indicateurs sont très utiles lorsque vous essayez de définir un état du marché et de prendre des décisions commerciales, car ils sont basés sur des données passées (par exemple, la valeur du prix le plus élevé au cours des n derniers jours). Beaucoup sont intégrés à Meta Trader 4. Cependant, les indicateurs qui intéressaient mon client provenaient d'un système de trading personnalisé.

Ils voulaient échanger à chaque fois que deux de ces indicateurs personnalisés se croisaient, et uniquement sous un certain angle.

Cet exemple d'algorithme de trading démontre les exigences de mon client.

Mains sur

En me salissant les mains, j'ai appris que les programmes MQL4 ont la structure suivante :

  • [Directives du préprocesseur]
  • [Paramètres externes]
  • [Variables globales]
  • [Fonction d'initialisation]
  • [Déinit Fonction]
  • [Démarrer la fonction]
  • [Fonctions personnalisées]

La fonction de démarrage est le cœur de chaque programme MQL4 puisqu'elle est exécutée à chaque fois que le marché bouge (par exemple, cette fonction s'exécutera une fois par tick). C'est le cas quel que soit le délai que vous utilisez. Par exemple, vous pourriez fonctionner sur la période H1 (une heure), mais la fonction de démarrage s'exécuterait plusieurs milliers de fois par période.

Pour contourner ce problème, j'ai forcé la fonction à s'exécuter une fois par unité de période :

 int start() { if(currentTimeStamp == Time[0]) return (0); currentTimeStamp = Time[0]; ...

Obtenir les valeurs des indicateurs :

 // Loading the custom indicator extern string indName = "SonicR Solid Dragon-Trend (White)"; double dragon_min; double dragon_max; double dragon; double trend; int start() { … // Updating the variables that hold indicator values actInfoIndicadores(); …. string actInfoIndicadores() { dragon_max=iCustom(NULL, 0, indName, 0, 1); dragon_min=iCustom(NULL, 0, indName, 1, 1); dragon=iCustom(NULL, 0, indName, 4, 1); trend=iCustom(NULL, 0, indName, 5, 1); }

La logique de décision, y compris l'intersection des indicateurs et leurs angles :

 int start() { … if(ticket==0) { if (dragon_min > trend && (ordAbierta== "OP_SELL" || primeraOP == true) && anguloCorrecto("BUY") == true && DiffPrecioActual("BUY")== true ) { primeraOP = false; abrirOrden("OP_BUY", false); } if (dragon_max < trend && (ordAbierta== "OP_BUY" || primeraOP == true) && anguloCorrecto("SELL") == true && DiffPrecioActual("SELL")== true ) { primeraOP = false; abrirOrden("OP_SELL", false); } } else { if(OrderSelect(ticket,SELECT_BY_TICKET)==true) { datetime ctm=OrderCloseTime(); if (ctm>0) { ticket=0; return(0); } } else Print("OrderSelect failed error code is",GetLastError()); if (ordAbierta == "OP_BUY" && dragon_min <= trend ) cerrarOrden(false); else if (ordAbierta == "OP_SELL" && dragon_max >= trend ) cerrarOrden(false); } }

Envoi des commandes :

 void abrirOrden(string tipoOrden, bool log) { RefreshRates(); double volumen = AccountBalance() * point; double pip = point * pipAPer; double ticket = 0; while( ticket <= 0) { if (tipoOrden == "OP_BUY") ticket=OrderSend(simbolo, OP_BUY, volumen, Ask, 3, 0/*Bid - (point * 100)*/, Ask + (point * 50), "Orden Buy" , 16384, 0, Green); if (tipoOrden == "OP_SELL") ticket=OrderSend(simbolo, OP_SELL, volumen, Bid, 3, 0/*Ask + (point * 100)*/, Bid - (point * 50), "Orden Sell", 16385, 0, Red); if (ticket<=0) Print("Error abriendo orden de ", tipoOrden , " : ", ErrorDescription( GetLastError() ) ); } ordAbierta = tipoOrden; if (log==true) mostrarOrden(); }

Si vous êtes intéressé, vous pouvez trouver le code complet et exécutable sur GitHub.

Backtesting

Une fois que j'ai construit mon système de trading algorithmique, je voulais savoir : 1) s'il se comportait correctement, et 2) si la stratégie de trading Forex qu'il utilisait était bonne.

Le backtesting (parfois écrit "back-testing") est le processus de test d'un système particulier (automatisé ou non) sous les événements du passé. En d'autres termes, vous testez votre système en utilisant le passé comme proxy du présent.

MT4 est livré avec un outil acceptable pour tester une stratégie de trading Forex (de nos jours, il existe des outils plus professionnels qui offrent une plus grande fonctionnalité). Pour commencer, vous configurez vos délais et exécutez votre programme sous une simulation ; l'outil simulera chaque tick sachant que pour chaque unité, il doit ouvrir à un certain prix, clôturer à un certain prix et atteindre des hauts et des bas spécifiés.

Après avoir comparé les actions du programme aux prix historiques, vous aurez une bonne idée de son exécution correcte ou non.

Les indicateurs qu'il avait choisis, ainsi que la logique de décision, n'étaient pas rentables.

De backtesting, j'avais vérifié le taux de retour du robot FX pour certains intervalles de temps aléatoires; Inutile de dire que je savais que mon client n'allait pas s'enrichir avec ça, les indicateurs qu'il avait choisis, ainsi que la logique de décision, n'étaient pas rentables . À titre d'exemple, voici les résultats de l'exécution du programme sur la fenêtre M15 pour 164 opérations :

Ce sont les résultats de l'exécution du logiciel d'algorithme de trading que j'avais développé.

Notez que notre solde (la ligne bleue) se termine en dessous de son point de départ.

Une mise en garde : dire qu'un système est « rentable » ou « non rentable » n'est pas toujours authentique. Souvent, les systèmes sont (non) rentables pendant des périodes de temps basées sur "l'humeur" du marché, qui peut suivre un certain nombre de schémas graphiques :

Quelques tendances dans notre exemple de trading algorithmique.

L'optimisation des paramètres et ses mensonges

Bien que les backtests m'aient rendu méfiant quant à l'utilité de ce robot FX, j'ai été intrigué lorsque j'ai commencé à jouer avec ses paramètres externes et j'ai remarqué de grandes différences dans le rapport de retour global. Cette science particulière est connue sous le nom d' optimisation des paramètres .

J'ai fait quelques tests approximatifs pour essayer de déduire l'importance des paramètres externes sur le taux de retour et j'ai trouvé quelque chose comme ceci :

Un aspect d'un algorithme Forex est le ratio de retour.

Ou, nettoyé:

Le ratio de rendement du trading algorithmique pourrait ressembler à ceci une fois nettoyé.

Vous pensez peut-être (comme je l'ai fait) que vous devriez utiliser le paramètre A. Mais la décision n'est pas aussi simple qu'il y paraît. Plus précisément, notez l' imprévisibilité du paramètre A : pour les petites valeurs d'erreur, son retour change considérablement. En d'autres termes, le paramètre A est très susceptible de surestimer les résultats futurs, car toute incertitude, tout changement se traduira par une moins bonne performance.

Mais en effet, l'avenir est incertain ! Et donc le retour du paramètre A est également incertain. Le meilleur choix, en fait, est de s'appuyer sur l'imprévisibilité. Souvent, un paramètre avec un rendement maximum inférieur mais une prévisibilité supérieure (moins de fluctuation) sera préférable à un paramètre avec un rendement élevé mais une faible prévisibilité.

La seule chose dont vous pouvez être sûr, c'est que vous ne connaissez pas l'avenir du marché, et penser que vous savez comment le marché va se comporter sur la base des données passées est une erreur. À son tour, vous devez reconnaître cette imprévisibilité dans vos prévisions Forex.

Penser que vous savez comment le marché va se comporter sur la base des données passées est une erreur.

Cela ne signifie pas nécessairement que nous devrions utiliser le paramètre B, car même les rendements inférieurs du paramètre A fonctionnent mieux que le paramètre B ; ceci est juste pour vous montrer que l'optimisation des paramètres peut entraîner des tests qui exagèrent les résultats futurs probables, et une telle réflexion n'est pas évidente.

Considérations globales sur le trading algorithmique Forex

Depuis cette première expérience de trading Forex algorithmique, j'ai construit plusieurs systèmes de trading automatisés pour les clients, et je peux vous dire qu'il y a toujours de la place pour explorer et approfondir l'analyse Forex à faire. Par exemple, j'ai récemment construit un système basé sur la recherche de mouvements dits "Big Fish" ; c'est-à-dire d'énormes variations de pépins dans de très petites unités de temps. C'est un sujet qui me passionne.

Construire votre propre système de simulation FX est une excellente option pour en savoir plus sur le trading sur le marché Forex, et les possibilités sont infinies. Par exemple, vous pouvez essayer de déchiffrer la distribution de probabilité des variations de prix en fonction de la volatilité sur un marché (EUR/USD par exemple), et peut-être faire un modèle de simulation Monte Carlo en utilisant la distribution par état de volatilité, en utilisant n'importe quel degré de précision que vous souhaitez. Je vais laisser cela comme un exercice pour le lecteur avide .

Le monde du Forex peut parfois être écrasant, mais j'espère que cet article vous a donné quelques points sur la façon de démarrer votre propre stratégie de trading Forex.

Lectures complémentaires

De nos jours, il existe un vaste pool d'outils pour construire, tester et améliorer les automatisations du système de trading : Trading Blox pour les tests, NinjaTrader pour le trading, OCaml pour la programmation, pour n'en nommer que quelques-uns.

J'ai beaucoup lu sur le monde mystérieux qu'est le marché des changes. Voici quelques articles que je recommande aux programmeurs et aux lecteurs enthousiastes :

  • BabyPips : C'est le point de départ si vous ne connaissez pas le trading Forex.
  • The Way of the Turtle, par Curtis Faith : Celui-ci, à mon avis, est la Bible du Forex . Lisez-le une fois que vous avez de l'expérience dans le trading et que vous connaissez certaines stratégies Forex.
  • Analyse technique pour le professionnel du trading - Stratégies et techniques pour les marchés financiers mondiaux turbulents d'aujourd'hui, par Constance M. Brown
  • Programmation d'experts-conseils - Création de systèmes de trading automatisés dans MQL pour Meta Trader 4, par Andrew R. Young
  • Systèmes de négociation - Une nouvelle approche du développement de systèmes et de l'optimisation de portefeuille, par Urban Jeckle et Emilio Tomasini : Très technique, très axé sur les tests de change.
  • Une mise en œuvre étape par étape d'un système de trading de devises multi-agents, par Rui Pedro Barbosa et Orlando Belo : Celui-ci est très professionnel, décrivant comment vous pourriez créer un système de trading et une plateforme de test.