Création d'un algorithme de market making en MQL5
Qu'est-ce que la liquidité ?
La liquidité des marchés financiers correspond à la « saturation » du marché en argent sous forme d'ordres et de positions. Cela permet aux traders de vendre rapidement des actions (ou des devises) pour des montants importants. Plus la liquidité du marché est élevée, plus il est facile de vendre ou d'acheter un actif pour des montants importants sans pertes significatives dues au slippage.
Le slippage est le principal fléau des gros acteurs : les plus grands fonds constatent qu’il n’est pas si facile de gérer une position importante, et souvent la transaction se clôture à perte uniquement à cause du « slippage » des ordres. Le glissement d'ordre (le slippage) se produit lorsqu'une transaction est ouverte à un prix et exécutée à un prix différent de celui prévu. Lorsqu'un trader ne dispose que de quelques centaines de dollars, il n'y a généralement pas de problèmes de liquidité (sauf pour les marchés totalement illiquides des cryptomonnaies de troisième ordre). Mais lorsqu'il s'agit de centaines de millions de dollars, il devient difficile d'ouvrir et de fermer une position simultanément. Cela est directement lié à la liquidité du marché.
La liquidité du marché est assurée grâce aux teneurs de marché, ou market makers. Leur principale mission est de maintenir la liquidité. Ces acteurs du marché mettent tout en œuvre pour faciliter au maximum vos transactions, afin qu'il n'y ait pas d'écarts importants dans les cotations et que l'acheteur comme le vendeur reçoivent toujours des prix qui leur conviennent.
Sur un marché sans market maker, on observe très souvent de fortes variations de prix dans une direction, d'énormes fluctuations d'actifs et des écarts de cotation.
Comment fonctionne un market maker, et pourquoi n'est-il pas un « marionnettiste » ?
De nombreux traders sont convaincus que le market maker est une sorte de marionnettiste, un manipulateur qui fait bouger les prix à sa guise, franchit les seuils de déclenchement des ordres stop, trompe la foule avec des ordres stop, etc.
En réalité, le market maker n'a pas besoin de faire perdre la « foule » du tout. Le marché, tel un « groupe », perd de lui-même à cause des spreads, des commissions et des swaps.
Quant aux évolutions du marché dans la bonne direction, ce n'est pas non plus le rôle d'un market maker. Tout ce qu'un market maker est tenu de faire en vertu de son accord avec la bourse, c'est de fournir un prix d'achat à un acheteur et un prix de vente à un vendeur, ainsi que de compléter la « profondeur du marché » si nécessaire.
Sans market maker, le marché serait complètement différent : nous verrions constamment des écarts de prix, des écarts de cotation, des compressions constantes dans les deux sens, ainsi que d'énormes sauts de prix dans les deux sens. On retrouve encore aujourd'hui tout cela sur les marchés où la présence d'un market maker n'est pas rentable, par exemple sur de nombreux marchés américains à faible capitalisation.
Nouvelles technologies AMM sur le marché des cryptomonnaies
Mais que se passerait-il si nous remplacions un participant par un contrat intelligent ? Autrement dit, que se passerait-il si, au lieu de faire appel à des market makers, nous mettions en place un système automatique pour ajuster l'offre et la demande, ainsi que la cotation générale ?
Voici en gros comment sont apparus les échanges décentralisés (DEX). Ils ont été les premiers à utiliser le mécanisme AMM (organisation automatisée de marché). L'algorithme AMM fonctionne via un pool de liquidités spécial utilisant les ressources des participants pour les transactions entre eux. Le prix et le volume des échanges sont toujours contrôlés par l'algorithme. Cela permet de réunir tous les vendeurs et tous les acheteurs, en principe sans perte pour les participants. Mais en réalité, tous les DEX connaissent d'importantes fluctuations de prix. Vous êtes assuré de perdre un pourcentage important sur l'échange de jetons en cas de volume de transactions élevé.
De plus, cette innovation n'a pas éliminé les manipulations de marché. Il y en a plein sur un DEX. Même les créateurs de tokens sur une plateforme d'échange décentralisée (DEX) peuvent facilement faire monter en flèche la valeur de leurs tokens et encaisser la totalité de la liquidité disponible.
Comment les market makers luttent-ils contre la manipulation des prix ?
Bien que cela ne soit pas de la responsabilité des market makers, ils étouffent souvent dans l'œuf les tentatives de manipulation de cours, lorsque les prix commencent tout juste à être artificiellement gonflés par des participants frauduleux. Dans ces phases initiales, le market maker inonde le joueur d'ordres à cours limité qui tente de faire monter les prix du « marché ». Cela étouffe la demande, si bien que les nouveaux venus dans le secteur des systèmes de pompage se heurtent très souvent au market maker. Mais si la manœuvre est bien planifiée, l'afflux de nombreux ordres de marché, qui font fortement fluctuer le prix, oblige le market maker à quitter temporairement le marché.
Quand les market makers quittent-ils le marché ?
La plupart des teneurs de marché stipulent dans leurs accords avec les bourses qu'ils désactivent leurs algorithmes et quittent le marché pendant les jours fériés, les périodes d'activité anormale et les périodes de publication d'informations importantes. Cela s'explique par la volonté du MM (market maker) de préserver son capital.
On peut constater que lorsque le market maker quitte le marché, un spread important se crée. Avez-vous constaté comment l'écart se creuse même sur le réseau ECN lors de la publication d'informations mondiales importantes ? Le faible écart habituel entre les cours est obtenu grâce aux efforts des market makers. Par conséquent, sans eux, nous serions confrontés à des conditions de marché très défavorables, notamment à des spreads importants, à des glissements de prix considérables, à des baisses et des pics de prix soudains – autant de joies typiques des marchés les plus sauvages.
Quel est le risque lié aux stocks d'un market maker ?
Beaucoup de gens pensent qu'un market maker ne court aucun risque. Mais ce n'est pas le cas. Le principal risque pour un market maker est le risque lié aux stocks, son inventaire. Ce risque réside dans le fait qu'une position peut évoluer brusquement dans une direction sans qu'il soit possible de s'en défaire et de réaliser un profit sur le spread. Par exemple, lorsqu'une foule paniquée vend un actif, le market maker est contraint de racheter la totalité de l'offre. En conséquence, le prix devient négatif, entraînant des pertes pour le MM.
Les entreprises tentent d'éviter ce risque en utilisant des équations de centrage de spread spécifiques et en déterminant le prix optimal d'achat et de vente. Mais cela n'est pas toujours réalisable. Même si le prix n'est pas optimal, le rôle du MM est d'assurer la liquidité du marché, et ils doivent accomplir cette mission, même s'ils opèrent temporairement à perte.
Analyse des données du plus grand market maker au monde : la société de Kenneth Griffin
L’analyse de l’activité du plus grand teneur de marché au monde – Citadel Securities, fondé par Kenneth Griffin – révèle l’importance de son rôle sur les marchés financiers.
Les rapports de l'entreprise font état d'un impact impressionnant : 7 transactions sur 10 sur le marché boursier américain dépendent de la liquidité fournie par ce market maker. Cette activité démontre le rôle important de Citadel Securities dans le maintien de la stabilité et de la disponibilité des liquidités sur ce marché.
Pour évaluer l'ampleur de l'influence de la société de Griffin, on peut mentionner qu'environ 900 millions de lots d'actions américaines transitent chaque jour par ses algorithmes. Ce volume d'échanges important témoigne de la forte activité et de l'influence de l'entreprise sur la bourse américaine.
D'ailleurs, l'évolution de Kenneth Griffin, passant du trading dirigé à la tenue de marché, est très intéressante. La société de Griffin se développe très activement sur les marchés mondiaux, explorant notamment les bourses asiatiques et y fournissant des liquidités.
Préparation d'un EA de market maker
Nous avons donc trouvé la théorie. Il est temps de commencer à créer un EA de teneur de marché ! Bien sûr, notre algorithme sera très simple. Nous ne mettrons pas en place de système de trading à spread selon des équations spécifiques.
Nous allons plutôt implémenter l'algorithme le plus simple qui maintiendra constamment deux ordres à cours limité ouverts : un ordre de vente à cours limité et un ordre d'achat à cours limité.
L'implémentation la plus simple de la tenue de marché en MQL5
Analysons le code de notre algorithme. En-tête du code. Cette section définit les paramètres de base de la stratégie, tels que la taille du lot, les niveaux de profit, le numéro magique de l'EA, les paires de devises sélectionnées pour le trading, etc. :
//+------------------------------------------------------------------+ //| MarketMaker.mq5 | //| Copyright 2023, Evgeniy Koshtenko | //| | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, Evgeniy Koshtenko" #property link "https://www.mql5.com/fr/users/koshtenko" #property version "1.00" #include <Trade\Trade.mqh> // Include the CTrade trading class //--- input parameters input double Lots = 0.1; // lot input double Profit = 0.1; // profit input double BProfit = 11; // buy profit input double SProfit = 11; // sell profit input int StopLoss = 0; // stop loss input int TakeProfit = 0; // take profit input int Count = 5; // number of orders input int Delta = 55; // delta input int Magic = 123; // magic number input bool BuyLimit = 1; // Buy Limit input bool SellLimit = 1; // Sell Limit input string Symbol1 = "EURUSD"; input string Symbol2 = "GBPUSD"; input string Symbol3 = "USDCHF"; input string Symbol4 = "USDJPY"; input string Symbol5 = "USDCAD"; input string Symbol6 = "AUDUSD"; input string Symbol7 = "NZDUSD"; input string Symbol8 = "EURGBP"; input string Symbol9 = "CADCHF"; input int MaxOrders = 20; // Max number of orders CTrade trade; datetime t=0; int delta=0;
Elle comprend des paramètres de base tels que le delta entre les ordres, le profit de clôture (total, profit d'achat et profit de vente), le numéro magique de l'EA, l'import de la bibliothèque de trading, ainsi que la sélection des paires de devises pour le trading et la limitation du nombre d'ordres.
Les fonctions d'initialisation et de dé-initialisation sont généralement standard. La fonction OnInit() est appelée au démarrage de l'EA, et OnDeinit() est appelée à sa fin. La fonction OnInit() définit le numéro magique de l'EA et le minuteur de la fonction de trading :
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- // Set a timer with a resolution of 10000 milliseconds (10 seconds) EventSetMillisecondTimer(100000); trade.SetExpertMagicNumber(Magic); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) {// Disable timer EventKillTimer(); Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+
Voici les fonctions permettant de compter les ordres ouverts et les positions ouvertes. CountOrders et CountTrades comptent les ordres ouverts et les positions pour un symbole spécifique en tenant compte du numéro magique de l'EA.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountOrders(string symbol, ENUM_ORDER_TYPE orderType) { int count = 0; for(int i = OrdersTotal()-1; i >= 0; i--) { ulong ticket = OrderGetTicket(i); if(!OrderSelect(ticket)) { continue; } if(OrderGetInteger(ORDER_TYPE) != orderType) { continue; } if(PositionGetString(POSITION_SYMBOL) != symbol || PositionGetInteger(POSITION_MAGIC) != Magic) { continue; } count++; } return count; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountTrades(string symbol, ENUM_POSITION_TYPE type) { int count = 0; for(int i=PositionsTotal()-1; i>=0; i--) { ulong ticket=PositionGetTicket(i); if(!PositionSelectByTicket(ticket)) { continue; } if(PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==type) { count++; } } return count; }
Voici les fonctions permettant de supprimer des ordres, de calculer les profits et de clôturer des ordres. DelOrder supprime tous les ordres pour un symbole spécifique à l'aide d'un nombre magique. AllProfit calcule le profit total ou le profit des opérations d'achat/vente pour un symbole spécifique en tenant compte du nombre magique.
//+------------------------------------------------------------------+ //| Position Profit | //+------------------------------------------------------------------+ double AllProfit(string symbol, int positionType = -1) { double profit = 0; for(int i = PositionsTotal()-1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(!PositionSelectByTicket(ticket)) { continue; } if(PositionGetString(POSITION_SYMBOL) != symbol || PositionGetInteger(POSITION_MAGIC) != Magic) { continue; } if(positionType != -1 && PositionGetInteger(POSITION_TYPE) != positionType) { continue; } profit += PositionGetDouble(POSITION_PROFIT); } return profit; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseAll(string symbol, int positionType = -1) { for(int i = PositionsTotal()-1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(!PositionSelectByTicket(ticket)) { continue; } if(PositionGetString(POSITION_SYMBOL) != symbol || PositionGetInteger(POSITION_MAGIC) != Magic) { continue; } if(positionType != -1 && PositionGetInteger(POSITION_TYPE) != positionType) { continue; } trade.PositionClose(ticket); } }
Enfin, les deux fonctions principales sont la fonction de trading et la fonction de tick. Le module Trade est chargé de placer les ordres d'achat et de vente à cours limité en tenant compte des paramètres spécifiés. OnTimer appelle la fonction Trade pour négocier le symbole sélectionné et affiche les informations de profit pour ce symbole.
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void Trade(string symb) { double sl = 0, tp = 0; double pr=0; double Bid=SymbolInfoDouble(symb,SYMBOL_BID); if(AllProfit(symb)>Profit && Profit>0) CloseAll(symb); if(AllProfit(symb)>Profit && Profit>0) CloseAll(symb); if(AllProfit(symb,0)>BProfit && BProfit>0) CloseAll(symb,0); for(int i=1; i<=Count; i++) { if(BuyLimit) { if (StopLoss > 0) sl = NormalizeDouble(Bid - (StopLoss) * Point(), _Digits); if (TakeProfit > 0) tp = NormalizeDouble(Bid + (TakeProfit) * Point(), _Digits); pr=NormalizeDouble(Bid-(Delta+Step)*_Point*i,_Digits); trade.BuyLimit(Lots,pr,symb,sl, tp,0,0,""); } if(SellLimit) { if (StopLoss > 0) sl = NormalizeDouble(Bid + (_Point * StopLoss) * Point(), _Digits); if (TakeProfit > 0) tp = NormalizeDouble(Bid - (_Point * TakeProfit) * Point(), _Digits); pr=NormalizeDouble(Bid+(Delta+Step)*_Point*i,_Digits); trade.SellLimit(Lots,pr,symb,sl, tp,0,0,""); } } } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTimer() { DelOrder(); Trade(Symbol1); Trade(Symbol2); Trade(Symbol3); Comment("\n All Profit: ",AllProfit(Symbol1), "\n Buy Profit: ",AllProfit(Symbol1,0), "\n Sell Profit: ",AllProfit(Symbol1,1)); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+--------+
Voici le code complet de cet EA simple.
Résultats des tests
Lançons donc l'EA avec les paramètres par défaut dans l'environnement de test. Voici les résultats de l'EA pour EURUSD, GBPUSD, EURGBP, USDJPY et EURJPY du 1er février 2023 au 18 février 2024 :
Les pertes par rapport aux bénéfices sont très importantes. La perte sur capitaux propres est généralement supérieure au bénéfice annuel. L'EA se comporte de manière assez similaire aux EA de grille classiques. Voici les statistiques des tests :
Apparemment, ce robot de trading ne compense en rien les risques encourus. Comme tout algorithme sans niveau de stop, c'est une bombe à retardement. Même si le marché ne présente aucune perte apparente, personne ne peut garantir qu'il ne subira pas un effondrement des devises de 10 à 15% par jour. Personnellement, ces quatre dernières années m'ont appris que tout est absolument possible sur le marché, et que même les scénarios les plus incroyables peuvent se réaliser ; un EA polyvalent doit donc être prêt à toute éventualité. Cet EA ne répond pas à mes critères d'évaluation, j'ai donc décidé de le publier.
Conclusion
Nous avons donc créé un exemple d'algorithme de market maker des plus simples. Bien sûr, cet exemple est illustratif et très simple. De toute évidence, aucun market maker n'a fonctionné de cette manière sur le marché depuis longtemps. Aujourd'hui, leurs algorithmes restent à la pointe de la technologie, utilisent l'apprentissage automatique et les réseaux neuronaux, appliquent l'apprentissage profond basé sur les données en flux continu du carnet d'ordres et prennent en compte de nombreuses variables et caractéristiques de prix. Plus personne ne passe d'ordres au-dessus ou en dessous du prix – cela comporte de sérieux risques liés aux stocks. À l'avenir, il pourrait être judicieux d'expérimenter la création d'un market maker utilisant l'apprentissage automatique, qui déterminera automatiquement le delta optimal entre les ordres.
Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/13897
Avertissement: Tous les droits sur ces documents sont réservés par MetaQuotes Ltd. La copie ou la réimpression de ces documents, en tout ou en partie, est interdite.
Cet article a été rédigé par un utilisateur du site et reflète ses opinions personnelles. MetaQuotes Ltd n'est pas responsable de l'exactitude des informations présentées, ni des conséquences découlant de l'utilisation des solutions, stratégies ou recommandations décrites.
Analyse de l'impact des conditions météorologiques sur les devises des pays agricoles à l'aide de Python
Trouver des modèles de paires de devises personnalisés en Python avec MetaTrader 5
L'Histogramme des prix (Profile du Marché) et son implémentation en MQL5
Système d'arbitrage à haute fréquence en Python utilisant MetaTrader 5
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Vous acceptez la politique du site Web et les conditions d'utilisation
Où des ordres de marché et des ordres limités viraux de la foule devraient être générés avec différentes probabilités, et vous tous, tels que les MM, confirmez ou réfutez les mythes sur les teneurs de marché par votre interaction avec cette virtualité.
Vous découvrirez ainsi si vous êtes un "marionnettiste" ou non. Pour ainsi dire - par votre propre expérience, bien que virtuelle.
Il y a longtemps, j'étais "teneur de marché" sur l'un des contrats à terme illiquides - jusqu'à un quart de toutes les transactions étaient les miennes. Bien qu'il y ait eu quelques offres puissantes de la part d'un véritable teneur de marché, elles étaient très éloignées des prix réels.
Et, ici, qu'est-ce qui empêchera MM lui-même d'organiser Pump&Dump, ainsi que n'importe quoi d'autre, afin de ne pas être, au moins - en pertes, et au plus - à zéro ! Dans les cas où il a besoin d'apporter la liquidité qu'ils ont déversée sur le marché à +.
Après tout, si votre contrepartie est MM, cela signifie qu'elle est entrée sur le marché.
Et s'il y a un déséquilibre entre l'offre et la demande dans l'appartement, il le compense avec ses liquidités pour la taille du déséquilibre - il entre sur le marché .
Et devinez où ira le prix - contre MM, ou dans la direction de ses ordres ?
Et en général, si une entreprise, une banque ou une personne privée est un MM, alors de quelle motivation de charité s'agit-il ?
Ne riez pas des pantoufles de MM.
La fonction du MM est de rendre le prix attractif pour un petit spéculateur en réduisant l'écart.
En outre - fournir de la liquidité (ce qui, à son tour, réduit la volatilité), y compris pour les petits spéculateurs.
En outre, la quantification des prix (stabilisation des prix) consiste à exclure les petits spéculateurs du marché.
Aussi étrange que cela puisse paraître, "l'éjection des petits spéculateurs" est une "stabilisation des prix". Tout comme dans l'exemple de l'aplatissement et du déséquilibre.
MM a utilisé, sur la base du "rétrécissement de l'écart" - "attractivité du prix", sa liquidité dans l'appartement afin de compenser le déséquilibre. S'il ne l'avait pas utilisée, le prix serait sorti de l'appartement et aurait été plus volatil. En d'autres termes, il a limité la volatilité grâce à ses liquidités. Ensuite, il fait sortir le cours du flat, soit avec un faux mouvement et un retour au flat, soit avec une continuation - sans retour. Cela démolit les stops de ceux dont il était le contre-agent et de ceux qui s'opposaient à ses ordres. Il quitte le marché - avec un bénéfice, eux - avec une perte. Lui, à ce stade, ne sort pas avec un gros bénéfice, c'est un scalpeur, pour ainsi dire (à ce stade). Et ses prises sont les stops de ses contreparties.
Mais il fait sortir le prix des bornes plates pas aussi brutalement qu'il le ferait sans lui, mais avec un retour aux bornes plates et des rebonds, ou avec un retour aux bornes plates.....
En fait... MM organise le flat en injectant ses liquidités et en freinant le mouvement des prix))))))
Mais le fait est qu'il échange sa liquidité avec tous les types d'acteurs.
Donc, si les spreads étroits et la liquidité attirent un petit spéculateur, celui-ci est alors éjecté du marché. Pourquoi avez-vous besoin de MM ?
Quel est, selon vous, son objectif ?
Et devinez où le prix ira - contre MM, ou dans la direction de ses ordres ?
Et en général, si une entreprise, une banque ou une personne privée est un MM, alors de quelle motivation de charité s'agit-il ?
Ne riez pas des pantoufles de MM.
La fonction du MM est de rendre le prix attractif pour un petit spéculateur en réduisant l'écart.
En outre - fournir de la liquidité (ce qui, à son tour, réduit la volatilité), y compris pour les petits spéculateurs.
En outre, la quantification des prix (stabilisation des prix) consiste à exclure les petits spéculateurs du marché.
Aussi étrange que cela puisse paraître, "l'éjection des petits spéculateurs" est une "stabilisation des prix". Tout comme dans l'exemple de l'aplatissement et du déséquilibre.
MM a utilisé, sur la base du "rétrécissement de l'écart" - "attractivité du prix", sa liquidité dans l'appartement afin de compenser le déséquilibre. S'il ne l'avait pas utilisée, le prix serait sorti de l'appartement et aurait été plus volatil. En d'autres termes, il a limité la volatilité grâce à ses liquidités. Ensuite, il fait sortir le cours du flat, soit avec un faux mouvement et un retour au flat, soit avec une continuation - sans retour. Cela démolit les stops de ceux dont il était le contre-agent et de ceux qui s'opposaient à ses ordres. Il quitte le marché - avec un bénéfice, eux - avec une perte. Lui, à ce stade, ne sort pas avec un gros bénéfice, c'est un scalpeur, pour ainsi dire (à ce stade). Et ses prises sont les stops de ses contreparties.
Mais il fait sortir le prix des bornes plates pas aussi brutalement qu'il le ferait sans lui, mais avec un retour aux bornes plates et des rebonds, ou avec un retour aux bornes plates.....
En fait... MM organise le flat en injectant ses liquidités et en freinant le mouvement des prix))))))
Mais le fait est qu'il échange sa liquidité avec tous les types d'acteurs.
Donc, si les spreads étroits et la liquidité attirent un petit spéculateur, celui-ci est alors éjecté du marché. Pourquoi avez-vous besoin de MM ?
Quel est, selon vous, son objectif ?
Oui, le prix va aller dans sa direction. Mais il n'a pas non plus besoin de pompes et de décharges brutales. Essayez d'être vous-même un MM sur DEX, et voyez comment le capital est fortement secoué par des pompes et des décharges brutales. Il est bien plus rentable d'avoir un flat stable et de réduire le spread, n'est-ce pas ?