English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Comment copier le trading depuis MetaTrader 5 vers MetaTrader 4

Comment copier le trading depuis MetaTrader 5 vers MetaTrader 4

MetaTrader 5Trading | 13 janvier 2022, 09:28
536 0
Mykola Demko
Mykola Demko

Introduction

Il n'y a pas si longtemps, de nombreux traders pensaient que MetaTrader 5 était une plate-forme rudimentaire, inadaptée au trading réel. Mais maintenant, après un court laps de temps, l'opinion publique se demande quand le vrai trading sera disponible. De nombreux traders ont déjà apprécié les avantages mis en œuvre dans MetaTrader 5. De plus, le championnat mené par MetaQuotes Software Corp. a accru l'intérêt des développeurs pour le langage MQL5. Et maintenant, cet intérêt souhaite se concrétiser sous la forme d'un bénéfice de trading. La question même « Quand le vrai trading sera-t-il disponible ? » est donné à la mauvaise adresse. Sa solution dépend du courtier particulier. Ce sont eux qui prennent la décision finale sur le moment de la transition vers la nouvelle plateforme.

Que peut faire un trader isolé dans cette situation ? La réponse est évidente, vous devez utiliser les opportunités de trading réel fournies par MetaTrader 4, en tant que transit pour MetaTrader 5. C'est-à-dire écrire un copiste. La liaison entre deux MetaTrader 4 n'est pas une innovation sur le Web. Il est maintenant temps d'implémenter une telle liaison avec MetaTrader 5.


Prologue

Afin mettre en œuvre les idées énoncées dans le sujet, il est nécessaire de clarifier les questions : « D'où vient le profit ? et "Comment un trader peut-il contrôler la croissance des bénéfices ?" À première vue, les réponses sont évidentes. Acheter bon marché, vendre cher. Mais considérons les composants des bénéfices. Le profit est la différence entre l'achat et la vente, multipliée par le pari. C'est-à-dire que le profit a deux composantes : les cotations et le volume d'une position de trading.

Que peut gérer le trader ? Lequel de ces deux composants est un volant dans le trading ? Bien sûr, il s'agit du volume d'une position de trade. Les cotations sont reçues du courtier et ne peuvent pas être modifiées par le trader. Voici la première conclusion : pour faire une copie de trading, il est nécessaire de conserver de manière synchrone le volume des positions de trading.


1. Comparaison des deux plateformes


1.1 Différences dans le système de comptabilité

Les plates-formes comparées ont des systèmes de comptabilité de trading différents, ce qui peut compliquer la question de la copie. Mais il ne faut pas oublier que le leader dans cette liaison est MetaTrader 5. Cela signifie que dans MetaTrader 4, nous devons pratiquement répéter le même système de comptabilité.

Une position de trading dans MetaTrader 5 résulte d’ordres de trading individuels, ce qui ne contredit pas la comptabilité des ordres adoptée dans MetaTrader 4. Le Stop Loss et le Take Profit communs pour une position peuvent être mis en œuvre en plaçant les mêmes Stop Loss et Take Profit pour chaque ordre ouvert. Des différences significatives entre les plateformes n'apparaissent que sur la question de quel ordre fermer dans MetaTrader 4. Étant donné que MetaTrader 5 n'a pas de comptabilité séparée des ordres dans une position de trading, ce problème peut devenir une pierre d'achoppement.


1.2 Volumes de positions de trading

Voyons en détail s'il y a une différence dans le choix de l'ordre à fermer. Cela affectera-t-il les bénéfices ? Par exemple, nous avons deux ordres ouverts à des moments différents, et clôturées de la même manière à des moments différents, mais ayant existé ensemble pendant un certain temps. C'est-à-dire que nous essayons d'imiter une position de trading dans le système de comptabilité des ordres.

Calculons différentes variantes de ce qui arrivera aux bénéfices si nous modifions les niveaux du niveau de clôture des ordres :

Type Volume Niveau ouvert Niveau fermé
Vente (Sell) 0.1 1.39388 1.38438
Vente (Sell) 0.1 1.38868 1.38149

Écrivons le code d'une calculatrice :

void OnStart()
  {
   double open1=1.39388,close1=1.38438,
         open2=1.38868,close2=1.38149;
   Print("total  ",n1(profit((open1-close1),0.1)+profit((open2-close2),0.1)));
   Print("order2  pp=",ns(open2-close2),"  profit=",n1(profit((open2-close2),0.1)));
   Print("order1  pp=",ns(open1-close1),"  profit=",n1(profit((open1-close1),0.1)));
  }
string ns(double v){return(DoubleToString(v,_Digits));}
string n1(double v){return(DoubleToString(v,1));}
double profit(double v,double lot){return(v/_Point*lot);}
Voici le calcul :
order1  pp=0.00950  profit=95.0
order2  pp=0.00719  profit=71.9
total  166.9

Maintenant, nous échangeons les valeurs de fermeture1 et fermeture2.

order1  pp=0.01239  profit=123.9
order2  pp=0.00430  profit=43.0
total  166.9

Figure 1. Variantes de fermeture d’ordre

La figure 1 montre que les zones AB et CD ont dans les deux versions des volumes égaux à 0,1, tandis que BC a un volume de 0,2, et cela ne dépend pas du fait que le volume des ordres est clôturé.

Dans les bénéfices des ordres individuels, nous avons des différences, mais le bénéfice total des positions est égal. Je veux attirer votre attention sur le fait que cet exemple a été calculé pour des volumes égaux d’ordres. C'est-à-dire qu'aux mêmes niveaux, nous avons mis en œuvre la clôture non pas d'un ordre, mais du même volume. Et, si nous adhérons strictement au principe de fermeture du volume, peu importe le volume d'une ordre. Si le volume de fermeture est supérieur au volume de l’ordre, il y aura une clôture partielle.

Alors, voici la conclusion principale : pour la position totale, peu importe quel ordre a été fermé, ce qui est important c'est que les volumes fermés doivent être égaux à un niveau donné.


1.3 Copier les trades

D'après les exemples ci-dessus, vous voyez que pour obtenir le même profit, il n'est pas nécessaire de transmettre des signaux produits par l'Expert Advisor écrit en MQL5. Il vous suffit de répéter les volumes de positions de trading. Bien que, pour certaines raisons qui seront discutées plus tard, ce ne sera pas un trading complètement identique. Cependant, ces raisons ne peuvent pas être un obstacle à la réalisation de bénéfices réels en utilisant un EA rentable écrit en MQL5.

La première raison de la baisse des bénéfices est la différence entre les cotations. Avec certains courtiers, il peut dépasser le spread. Le fait est que les cotations sont translatées en temps réel. Et lorsque dans MetaTrader 5 un EA décide d'ouvrir une position, le courtier auquel MetaTrader 4 est connecté peut simplement avoir un prix différent. Et le prix peut être pire ou meilleur dans ce cas.

La deuxième raison de la baisse du profit est le facteur temps. Une position est copiée après qu'elle soit déjà apparue dans MetaTrader 5, et donc le retard est inévitable.

Ces deux raisons éclipsent toutes les stratégies de scalping. Par conséquent, jusqu'à ce que le trading réel soit disponible dans MetaTrader 5, de telles stratégies ne seront pas applicables.

Le système, impliquant un bénéfice (d'un trade), dépassant de loin le spread et insensible aux cotations d'un certain courtier, peut être utilisé pour gagner de l'argent réel en utilisant la position copiste.


2. Définir le problème

  1. Liaison pour transmettre des signaux entre MetaTrader 5 et MetaTrader 4
  2. Translation des positions de MetaTrader 5
  3. Réception des signaux dans MetaTrader 4
  4. Répétition des positions de trading dans MetaTrader 4


2.1. Liaison pour transmettre des signaux entre MetaTrader 5 et MetaTrader 4

La première variante consiste à transmettre des signaux via un fichier partagé. La question est: L'enregistrement fréquent dans le fichier n'endommagerait-il pas le matériel ? Si vous écrivez de nouvelles données uniquement lorsqu'une position a changé, ces enregistrements ne seront pas très fréquents. Pas plus fréquemment que les développeurs Windows apportent des modifications au fichier de pagination. Ceci, à son tour, est une procédure éprouvée qui n'endommage pas le matériel. L'écriture dans un fichier partagé est une implémentation acceptable pour des requêtes peu fréquentes. C'est une autre limitation pour les stratégies de scalping, bien que moins importante que la limite précédente.

Contre la liaison, vous pouvez utiliser la fonctionnalité MetaTrader 5 pour écrire des sous-répertoires à n'importe quelle profondeur. Je n'ai pas vérifié que "tout", mais jusqu'à 10 sous-répertoires sont écrits, c'est sûr. Et nous n'avons pas besoin de plus. Vous pouvez certainement utiliser une DLL pour fournir un accès, mais ne pas utiliser la DLL, si le problème peut être résolu sans eux, est ma position principale. Pour résoudre ce problème sans DLL, installez simplement MetaTrader 4 dans le répertoire \Files\ du terminal MetaTrader 5 (voir Travailler avec des fichiers).

Ainsi, le chemin d'accès au fichier partagé ressemblera à ce qui suit :

C:\Program Files\MetaTrader 5\MQL5\Files\MetaTrader 4\experts\files\xxx      //where xxx is the name of the shared file.

Avec cet emplacement, le fichier sera disponible à la fois dans MetaTrader 4 et MetaTrader 5, la possibilité de partage de fichiers est fournie par les fonctions de MQL5.


2.2. Translation des positions de MetaTrader 5

Pour la translation des positions et l'utilisation économique des ressources, nous avons besoin d'une fonction qui surveillera l'apparition/la modification/la clôture d'une position de trading pour tous les instruments. Ci-dessus, il a été constaté que pour transférer un trade, il suffit de connaître le volume d'une position de trading. Ajoutez au volume le symbole de l'instrument et les niveaux SL et TP.

Pour suivre les changements, nous devons connaître l'état précédent d'une position. Et si les états précédent et présent ne sont pas égaux (et donc la position a changé), il faut l'afficher dans le fichier. Nous avons également besoin d'une fonction pour écrire ces informations dans le fichier. Le fichier doit être ouvert afin qu'il soit disponible pour une utilisation simultanée par plusieurs programmes.

Pour ne pas manquer le moment de la modification de la position, le système de suivi doit être implémenté dans la fonction OnTimer(), car nous devons suivre tous les instruments à la fois, et les ticks arrivent à des moments différents pour différents symboles. Nous devons également envoyer un signal concernant le changement dans le contenu du fichier.


2.3. Recevoir des signaux dans MetaTrader 4

Il est nécessaire de suivre le signal de mise à jour du fichier. Ceci peut être arrangé par une variable dont l'état est surveillé pour l'entrée dans la zone de changement de position. Nous avons besoin d'une fonction pour lire un fichier avec l'état des positions. C'est juste une fonction standard.

Passer le contenu du fichier dans les tableaux pour le calcul. Ici, nous avons besoin de l'analyseur. Étant donné que non seulement les nombres mais aussi les symboles seront transmis, il est pratique de tout recoder en chaîne lors du transfert depuis MetaTrader 5. De plus, en écrivant toutes les données d'un symbole dans une chaîne de texte, nous éliminons la confusion des données.


2.4. Répétition des positions de trading dans MetaTrader 4

C'est le plus grand ensemble de fonctions. Il doit être divisé en plusieurs sous-classes.

  1. Comparaison des positions virtuelles ;
  2. Fonction de sélection des ordres ;
  3. Fonction d'ouverture d’ordre ;
  4. Fonction de fermeture d’ordre ;
  5. Fonction de modification d’ordre.


2.4.1. Comparaison des positions virtuelles

La comparaison des positions virtuelles est nécessaire pour s'assurer que les positions sont conformes. La fonction doit calculer la position de chaque symbole séparément et être également capable de filtrer les positions pour lesquelles le trading est interdit (le cas échéant).

En pratique, il peut y avoir des situations où le courtier n'a pas le symbole, pour lequel un signal est transmis par MetaTrader 5. Mais cela ne devrait pas bloquer le trading en général, bien qu'un avertissement doive être fourni. L'utilisateur a le droit d'être informé d'une telle situation.


2.4.2. Fonction de sélection des ordres

Cette fonction doit choisir les ordres, en fonction du symbole pour un travail ultérieur avec elles. Dans ce cas, puisque nous diffusons uniquement les positions ouvertes, les ordres doivent également être filtrés afin de ne pas avoir d'ordres en attente.


2.4.3. Fonction d'ouverture d’ordre

Il doit contenir le nombre maximum de calculs. Ainsi, il suffit de passer le volume et le type.


2.4.4. Fonction de fermeture d’ordre

Tout comme le précédent, il doit tout calculer avant de donner une commande de fermeture.


2.4.5. Fonction de modification d’ordre

La fonction doit contenir une vérification de la proximité du marché. En outre, il est souhaitable de dissoudre au fil du temps le placement d'ordres et de niveaux d'arrêt, car le placement de niveaux d'arrêt lors de l'ouverture n'est pas autorisé avec tous les courtiers. De plus, l'ouverture conjointe d'ordres et la fixation de niveaux d'arrêt augmentent la probabilité de recotation.

Ainsi, la position sera rapidement répétée. Et le placement des niveaux d'arrêt est une chose mineure, mais non moins importante.


3. Mise en œuvre

Les codes sont commentés en détail, presque ligne par ligne. Par conséquent, en expliquant les codes, je m'attarderai uniquement sur les moments les plus difficiles.


Liaison pour transmettre des signaux entre MetaTrader 5 et MetaTrader 4

La liaison est implémentée dans MetaTrader 5 par la fonction :

void WriteFile(string folder="Translator positions") // by default it is the name of the shared file

Les drapeaux d'ouverture signifient :

FILE_WRITE|FILE_SHARE_READ|FILE_ANSI

le fichier est ouvert en écriture | l'utilisation partagée par différents programmes pour la lecture est autorisée | Codage ANSI

Dans MetaTrader 4, la liaison est implémentée par la fonction :

int READS(string files,string &s[],bool resize)

Le paramètre resize interdit de redistribuer la mémoire du tableau de données reçues. Dans le code, la mémoire de ce tableau est allouée à chaque itération, car un développeur ne peut pas prédire le nombre de lignes. Cela dépend du nombre de symboles sélectionnés dans MetaTrader 5. Par conséquent, il ne peut pas être calculé à l'avance dans MetaTrader.

Ainsi, le tableau doit être augmenté d'un à chaque étape. Mais cette opération doit être bloquée au deuxième appel de fonction, car la longueur du tableau est déjà définie et ne changera pas. Pour cela, utilisez la variable bool resize.


Translation des positions de MetaTrader 5

Pour organiser la translation dans la fonction OnTimer avec la fréquence de 1 sec. les données sur toutes les positions sont reçues dans la fonction :

void get_positions()

Comparer ensuite la valeur précédente des positions avec la valeur actuelle de la fonction :

bool compare_positions()

Et la sortie avec return(true) se produit au cas où au moins une cellule ne correspondrait pas. Quitter avec return(true) signifie que les positions ne sont pas égales et que le fichier doit être réécrit. Lors de la réécriture du fichier, le compteur cnt_command est augmenté de un.


Réception des signaux dans MetaTrader 4

Après avoir lu le fichier à l'aide de la fonction READS(), nous avons un tableau rempli de chaînes de caractères s[].

Pour que ces chaînes se transforment en informations utiles, nous avons besoin d'un analyseur.

La fonction :      

int parser(int Size)

est juste un wrapper pour l'appel de la fonction d'identification de ligne :

void parser_string(int x)

La fonction reconnaît toutes les cellules, à l'exception des symboles.

Le symbole est reconnu dans un cycle, une fois au début d'un algorithme à l'aide de la fonction :

void parser_string_Symbols(int x)

Ensuite, nous ne nous appliquerons pas au code en MQL5, et ne discuterons que du code en MQL4, à moins qu'il ne soit spécifiquement mentionné.


Comparaison des positions virtuelles

La comparaison des positions est divisée en deux parties. La comparaison du volume et du type de positions est mise en œuvre dans la fonction :

bool compare_positions()

Dans ce shell, l'appel pour obtenir l'état réel des positions est implémenté dans la fonction :

void real_pos_volum()

et la comparaison fonctionne selon le principe mentionné ci-dessus "tout ou rien". Cela signifie que si au moins une cellule n'est pas la même, toutes les positions sont considérées comme différentes. Dans real_pos_volum(), un certain nombre de filtres sont implémentés, qui sont décrits en détail dans le code et seront utilisés à plusieurs reprises dans d'autres fonctions.

En particulier, il sera utilisé pour additionner les volumes de tous les ordres sur un symbole dans une position virtuelle. Pour que les positions de verrouillage (le cas échéant) soient traitées correctement, les ordres d'achat auront le volume avec un moins et les ordres de vente avec un plus.

La deuxième partie de la comparaison consiste à comparer les niveaux d'arrêt (les niveaux d'arrêt sont Stop Loss et Take Profit), elle est implémentée dans la fonction, similaire à celle ci-dessus :

bool compare_sl_tp_levels()
Comme avec les volumes, à l'intérieur du shell, il y a un appel pour obtenir des informations sur les niveaux d'arrêt dans la fonction :
void real_pos_sl_tp_levels()


Fonction de sélection des ordres

Les ordres doivent être sélectionnées uniquement pour la fermeture du volume, c'est pourquoi la fonction de sélection spécialisée compliquée n'est implémentée que pour la clôture :

void close_market_order(string symbol,double lot)

Possède les paramètres du symbole et du volume, qui doivent être fermés. Afin de briser les ordres le moins possible, dans le premier cycle de la fonction il cherche l'ordre dont le volume est égal à l'ordre perdant passé dans le paramètre étant recherché un mandat, qui est égal au volume avec le volume de fermeture passé dans le paramètre.

Si un tel ordre n’existe pas (qui est connue à partir de l'état vrai du drapeau de fermeture FlagLot), alors le volume spécifié est fermé dans l'ordre qui est le premier du cycle (la vérification de l'excès du volume de l’ordre est mise en œuvre dans la fonction de fermeture Closes()).

La sélection des ordres pour la modification des niveaux d'arrêt est implémentée dans la fonction :

void modification_sl_tp_levels()

Les ordres sont filtrés uniquement par le symbole, car tous les niveaux d'arrêt au sein d'un symbole sont égaux.


Fonction d'ouverture d’ordre

Il est implémenté dans la fonction suivante :

int open_market_order(string symbol,int cmd,double volume,
                     int stoploss=0,int takeprofit=0,int magic=0)

Il contient toutes les vérifications nécessaires pour une ouverture confortable d'un ordre en utilisant les données spécifiées.


Fonction de fermeture de commande

Il est implémenté dans la fonction suivante :

bool Closes(string symbol,int ticket,double lot)

Le code contient une vérification au cas où le paramètre du lot dépasse le volume réel de l’ordre précédemment sélectionné.


Fonction de modification d’ordre

Il est implémenté dans la fonction suivante :

bool OrderTradeModif(int ticket,string symbol,int cmd,double price,
                    double stoploss=0,double takeprofit=0,int magic=0)

Le code a des vérifications, dans le cas où les niveaux d'arrêt ne correspondent pas au type d'ordre, les valeurs seront échangées. Il vérifie également si les niveaux ont déjà la valeur demandée.


4. Fonctions de la logique

Le plan précédemment tracé est terminé, mais le code a encore des fonctions inexpliquées. Ce sont les fonctions logiques, on peut dire que ce sont les fonctions de base, qui pilotent le processus.

void processing_signals()
void processing_sl_tp_levels()

Les deux fonctionnalités sont des cycles sans fin avec sortie avec la rupture conditionnelle. Ici, nous devons noter que le script lui-même est implémenté comme une boucle infinie. Pour permettre à l'utilisateur de supprimer confortablement le programme, la condition principale du cycle a intégré la fonction IsStopped().

Le code est transféré d'un Expert Advisor au script en boucle de la manière suivante :

// Init()
 while(!IsStopped())
    {
     // Start()
     Sleep(1000);
    }
 // Deinit()

Toute la logique du script est décrite dans la même boucle infinie dans la fonction standard start().

Le code du cycle situé dans start() ressemblera à ceci :

If the trade flow is not busy
          Read the file and save data in an array (not changing the array size);
          if there have been changes in the file
               write new comments;
               remember the time when cycles of compliance check start (located below);
               if the positions whose volumes are being compared are not equal
                    process the positions by volumes;
               if the positions whose stops are being compared are not equal
                    process the positions by stops;
               calculate the end time of checks;
          If time is not exceeded
               make a pause for the remaining time;

Les constructions logiques les plus complexes se trouvent dans les fonctions processing_signals() et processing_sl_tp_levels().

Nous commençons à décrire les fonctions sur le principe "du simple au complexe". Bien que l'appel dans le code soit le contraire.

//+------------------------------------------------------------------+
//| processing stop levels                                           |
//+------------------------------------------------------------------+
void processing_sl_tp_levels()
  {
//--- remember the time of entering the cycle   
   int start=GetTickCount();
   while(!IsStopped())
     {
      //--- if the trade flow is not busy
      if(Busy_and_Connected())
        {
         //--- select the order and modify stop levels           
         modification_sl_tp_levels();
        }
      //--- if the delay time is over, update information from the file  
      if(GetTickCount()-start>delay_time)READS("Translator positions",s,false);
      //--- if the update counter has changed in the file, exit the cycle      
      if(cnt_command!=StrToInteger(s[0]))break;
      //--- micro-pause      
      Sleep(50);
      //--- if real stop levels and those in the file are equal, exit the cycle     
      if(!compare_sl_tp_levels())break;
     }
   return;
  }

Comme mentionné précédemment, la fonction est une boucle infinie avec la sortie à deux conditions :

La première condition de sortie de la boucle se produit au cas où la valeur de cnt_command n'est pas égale à la même valeur dans le fichier. Avant cela, nous recevons les dernières informations sur le fichier à condition que le temps de l'opération de boucle dépasse le délai défini dans la variable globale delay_time.

Le temps peut être dépassé car toutes les modifications sont protégées par le filtre Busy_and_Connected(). C'est-à-dire, n'entrez que si le flux de trading est libre.

Il faut expliquer ici que dans le MetaTrader 4 (contrairement au MetaTrader 5) il est impossible d'envoyer une série de commandes au serveur sans avoir une re-cotation. Le serveur ne peut accepter que la première requête, le reste sera perdu. Par conséquent, avant de donner une commande au serveur, nous devons vérifier si le flux de trading est libre.

La deuxième vérification pour quitter le cycle est la fonction décrite ci-dessus de comparaison de position par les niveaux d'arrêt compare_sl_tp_levels(): si les positions sont égales, alors quittez le cycle.

Passons maintenant au complexe : la fonction processing_signals() est organisée de manière similaire, mais la partie logique est très différente dans sa fonctionnalité.

Analysons en détail cette partie :

//--- convert the direction of the position stored in the file to the form -1,+1            
int TF=SymPosType[i]*2-1;
//--- convert the direction of the real position to the form -1,+1
int TR=realSymPosType[i]*2-1;
//--- save the volume of the position stored in the file                     
double VF=SymPosVol[i];
//--- save the volume of the real position 
double VR=realSymPosVol[i];
double lot;
//--- if the positions for the current symbol are nor equal
if(NormalizeDouble(VF*TF,8)!=NormalizeDouble(VR*TR,8))
  {
//--- if the real volume is not equal to zero and the directions are not equal or
//--- if the directions are equal and the real volume is larger than that in the file                              
   if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))
     {
      //--- if the directions are equal and the real volume is larger than that in the file 
      if(TF==TR && VF<VR)lot=realSymPosVol[i]-SymPosVol[i];
      //--- if the real volume is not equal to zero and the directions are not equal
      else lot=realSymPosVol[i];
      //--- close the calculated volume and exit the cycle                  
      close_market_order(Symbols[i],lot);
      break;
     }
   else
     {
      //--- if the directions are equal and the real volume is less than that in the file 
      if(TF==TR && VF>VR)lot=SymPosVol[i]-realSymPosVol[i];
      //--- if the directions are not the same and the volume is equal to zero                  
      else lot=SymPosVol[i];
      //--- open the calculated volume and exit the cycle 
      open_market_order(Symbols[i],SymPosType[i],lot);
      break;
     }
  }

Les variables TF et TR stockent la valeur du type de position sous la forme buy=-1,sell=1. Par conséquent, TF est la valeur stockée dans le fichier et TR est la valeur réelle de la position virtuelle. Il en est de même pour les volumes VF,VR.

Ainsi, l'inégalité :
if(VF*TF!=VR*TR)

sera vrai si les volumes ou les types de position ne sont pas égaux.

Vient ensuite le connecteur logique :

if((VR!=0 && TF!=TR) || (TF==TR && VF<VR))

ce qui signifie que si le volume réel n'est pas égal à zéro et que les types ne sont pas égaux, vous devez fermer toute la position.

Cela inclut les options lorsque le volume dans le fichier est nul et l'option lorsque la position est inversée dans le sens. Dans la variante, lorsque la position est inversée en sens, il faut d'abord préparer la position pour l'ouverture, c'est à dire fermer le volume précédent. Puis à l'itération suivante, la logique passe à l'autre branche, à l'ouverture.

La deuxième condition complexe du connecteur logique signifie que si le type est correct, mais que le volume réel est supérieur à celui stocké dans le fichier, vous devez réduire le volume réel. Pour cela, nous avons d'abord calculé la taille du lot dont il faut réduire le volume.

Si aucune condition de fermeture ne convient à cette situation et que les positions (comme nous l'avons découvert dans le premier filtre) ne sont pas égales, un nouvel ordre doit être ouvert. Voici également deux variantes : ouvrir un ordre pour toute la taille de la position dans le fichier ou s'ajouter aux ordres existants. Ici, je voudrais noter que la vérification du dépassement du volume limite est disponible dans la fonction d'ouverture, donc le volume manquant (si ce n'était pas possible avec la vérification) sera ouvert à la prochaine itération de l'algorithme. En raison du fait que d'abord la situation de fermeture est gérée, et seulement ensuite - ouverture, la situation de verrouillage est presque impossible.

Je voudrais mentionner une place de code subtil. La situation de réouverture de l'ordre, qui vient de se fermer dans MetaTrader 4 par des stops. J'ai mentionné plus tôt que l'écart entre les cotations se situe souvent dans les 2-3 points de 5 chiffres. Avec un spread égal à 15, la différence est insignifiante. Mais avec cette différence, si un stop loss ou un take profit est déclenché dans MetaTrader 4 plus tôt que dans MetaTrader 5, une situation est apparue lorsque l'algorithme tentait de recréer la position qui venait de fermer, avec sa suppression ultérieure avec les stops déclenchés dans MetaTrader 5.

Cela n'a pas entraîné de grosses pertes, mais un spread a été gaspillé. Par conséquent, l'algorithme a été repensé de sorte qu'après la suppression d'une position, MetaTrader 4 ne la restaurera pas, mais attendra que l'état du fichier change. Et alors seulement recommencera à agir. Dans cette situation, le trader peut supprimer la position manuellement, s'il la trouve erronée. Et il ne sera pas restauré tant que MetaTrader 5 n'aura pas modifié le fichier.

Le seul point faible est la situation rare où les stops MetaTrader 4 supprimeront la position, et dans MetaTrader 5 la position ne sera pas fermée. Dans ce cas, je peux conseiller de redémarrer le script Copyist positions. Et la dernière clause - le code ne vérifie pas le travail le week-end. Il n'y a rien de grave, seul le journal sera plein de cotations sans valeur.


5. Vérification de la mise en œuvre dans la pratique

Installez MetaTrader 4 dans le répertoire C:\Program Files\MetaTrader 5\MQL5\Files\

Exécutez les positions de translation compilées de l'Expert Advisor sur n'importe quel graphique de MetaTrader 5 (le travail de l'Expert Advisor ne dépend pas du graphique sur lequel il s'exécute).

Figure 2. Positions de translation dans MetaTrader 5

Nous voyons un commentaire multiligne avec l'état du compteur sur la première ligne et le journal de toutes les positions ligne par ligne.

Exécutez le script compilé Copyist positions sur n'importe quel graphique dans MetaTrader 4 (le travail du script en boucle ne dépend pas du graphique sur lequel il s'exécute).

Figure 3. Positions de copiste dans MetaTrader 4

Ensuite, nous pouvons exécuter n'importe quel Expert Advisor dans MetaTrader 5 . Les résultats de son opération seront rapidement copiés sur MetaTrader 4.

Figure 4. Positions et ordres dans MetaTrader 4 (en haut) et MetaTrader 5 (en bas)

À propos, la gestion du compte dans MetaTrader 5 peut être effectuée manuellement ou le compte peut être connecté à l'aide du mot de passe investisseur.

Ainsi, par exemple, vous pouvez démarrer le copiste sur n'importe quel compte Championship.


Conclusion

Cet article a pour but d'accélérer la transition des traders vers la nouvelle plateforme, et d'encourager l'étude du MQL5.

En conclusion, je voudrais dire que ce code ne peut pas remplacer complètement le trading direct sur un compte réel dans MetaTrader 5. Il est écrit comme un code universel pour tout système commercial sans tenir compte de la logique, donc, comme tout ce qui est universel, il n'est pas idéal. Mais sur cette base, vous pouvez écrire un translateur de signaux pour une stratégie spécifique. Pour de nombreux traders qui sont loin de la programmation, cela peut servir d'étape de transition en prévision de la libération.

A ceux qui connaissent bien la programmation, je recommande de modifier le code pour lui faire reconnaître les ordres par leur numéro magique et mettre en œuvre le transfert et le placement des ordres en attente. Le fait de passer des ordres en attente n'affectera pas les bénéfices, à condition qu'il y ait une connexion stable au serveur. Si la perte de connexion se produit souvent, tout le chemin du serveur, y compris les ordres en attente, doit être copié.

Apprenez le nouveau langage et utilisez-le pour développer un système robuste. Bonne chance dans votre trading.

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/189

Test rapide des idées de trading sur le graphique Test rapide des idées de trading sur le graphique
L'article décrit la méthode de test visuel rapide des idées de trading. La méthode est basée sur la combinaison d'un graphique de prix, d'un indicateur de signal et d'un indicateur de calcul de solde. J'aimerais partager ma méthode de recherche d'idées de trading, ainsi que la méthode que j'utilise pour tester rapidement ces idées.
L’algorithme de génération de ticks dans le testeur de stratégie du terminal MetaTrader 5 L’algorithme de génération de ticks dans le testeur de stratégie du terminal MetaTrader 5
MetaTrader 5 nous permet de simuler le trading automatique, au sein d’un testeur de stratégie intégré, en utilisant l’Expert Advisors et le MQL5 language. Ce type de simulation est appelé test d’Expert Advisors, et peut être mis en œuvre en utilisant l’optimisation multithread, ainsi que simultanément sur un certain nombre d’instruments. Afin de fournir un test approfondi, une génération de ticks basée sur l’historique des minutes disponibles doit être effectuée. Cet article fournit une description détaillée de l’algorithme, par lequel les ticks sont générés pour les tests historiques dans le terminal client MetaTrader 5.
Signaux de Trading pour MetaTrader 5: Une meilleure alternative aux comptes PAMM ! Signaux de Trading pour MetaTrader 5: Une meilleure alternative aux comptes PAMM !
Nous sommes heureux d'annoncer que MetaTrader 5 propose désormais des signaux de trading, offrant ainsi un outil puissant aux investisseurs et aux gestionnaires. Pendant que vous suivez les trades d'un trader performant, le terminal les reproduira automatiquement dans votre compte !
Econometrics - Prévisions à un stade précoce de l’EURUSD Econometrics - Prévisions à un stade précoce de l’EURUSD
L'article se concentre sur les prévisions d'avance pour l'EURUSD à l'aide du logiciel EViews et sur une évaluation plus approfondie des résultats des prévisions à l'aide des programmes d'EViews. La prévision implique des modèles de régression et est évaluée au moyen d'un Expert Advisor développé pour MetaTrader 4.