MetaTrader 5 Platform Build 1295

Pour étendre les possibilités des traders de Forex, nous avons ajouté un second système de comptabilisation — la couverture (hedging)

1 avril 2016

Terminal

  1. Pour étendre les possibilités des traders de Forex, nous avons ajouté un second système de comptabilisation - la couverture (hedging). Il est maintenant possible d'avoir plusieurs positions par symbole, incluant des positions dans des directions opposées. Cela ouvre la voie à l'implémentation des stratégies de trading basées sur le fameux "blocage" - si le prix se déplace contre un trader, il peut ouvrir une position dans la direction opposée.

    Puisque le nouveau système est similaire à celui utilisé dans MetaTrader 4, il sera familier aux traders. En même temps, les traders pourront profiter de tous les avantages de la 5ème version de la plateforme - remplissage des ordres avec des transactions multiples (incluant les remplissages partiels), multi-devises et testeur multi-threads avec le support du réseau MQL5 Cloud Network, et bien plus.

    Vous pouvez maintenant utiliser un compte pour trader les marchés qui adhèrent au système de compensation et permettent de n'avoir qu'une seule position par instrument, et utiliser un autre compte dans la même plateforme pour trader le Forex et appliquer la couverture (hedging).

    Ouverture d'un compte couvert et visualisation du type de comptabilisation des positions
    Un système de comptabilisation des positions est défini au niveau du compte et est affiché dans l'en-tête de la fenêtre du terminal et dans le Journal :



    Pour ouvrir un compte de démo avec la couverture, activez l'option correspondante :




    Système de compensation
    Avec ce système, vous pouvez n'avoir qu'une seule position commune pour un symbole à la fois :

    • Si une position ouverte existe pour un symbole, l'exécution d'une transaction dans la même direction augmente le volume de cette position.
    • Si une transaction est exécutée dans la direction opposée, le volume de la position existante peut être diminué, la position peut être fermée (lorsque le volume de la transaction est égal au volume de la position) ou renversé (si le volume de la transaction opposée est supérieur à celui de la position actuelle).


    Ce qui a causé la transaction opposée n'importe pas - un ordre au marché exécuté ou un ordre en attente déclenché.

    L'exemple ci-dessous montre l'exécution de deux transactions Buy sur l'EURUSD de 0.5 lots chacunes :


    L'exécution des deux transactions a résulté en une seule position d'1 lot.

    Système de couverture
    Avec ce système, vous pouvez avoir plusieurs positions ouvertes d'un seul et même symbole, incluant des positions opposées.

    Si vous avez une position ouverte pour un symbole et que vous exécutez une nouvelle transaction (ou qu'un ordre en attente est déclenché), une nouvelle position est ouverte en supplément. Votre position actuelle ne change pas.

    L'exemple ci-dessous montre l'exécution de deux transactions Buy sur l'EURUSD de 0.5 lots chacunes :


    L'exécution de ces transactions a résulté dans l'ouverture de deux positions séparées.

    Nouveau type d'opération - Close By
    Un nouveau type d'opération de trading a été ajouté pour les comptes de couverture - fermer une position par une position opposée. Cette opération permet de fermer deux positions dans des directions opposées d'un même symbole. Si les positions opposées ont des nombres de lots différents, un seul des deux ordres reste ouvert. Son volume sera égal à la différence des lots des positions fermées, tandis que la direction de la position et le prix d'ouverture correspondront (en volume) à la plus grande des positions fermées.

    Comparée à une fermeture simple des deux positions, la fermeture par une position opposée permet aux traders d'économiser un spread :

    • Dans le cas d'une fermeture simple, les traders doivent payer un spread deux fois : lors de la fermeture d'une position buy à un prix inférieur (Bid) et lors de la fermeture d'une position sell à un prix supérieur (Ask).
    • Lors de l'utilisation d'une position opposée, le prix d'ouverture de la seconde position est utilisé pour fermer la première, tandis que le prix d'ouverture de la première position est utilisé pour fermer la seconde position.


    Dans ce dernier cas, un ordre "close by" est placé. Les tickets des positions fermées sont spécifiés dans leurs commentaires. Une paire de positions opposées est fermée par deux transactions "out by". Le profit/perte résultant de la fermeture des deux positions n'est spécifié que dans une seule transaction.



  2. Ajout de la possibilité de tester les robots de trading et les indicateurs techniques avec l'historique réel des ticks.

    Le test et l'optimisation sur les ticks réels est aussi proche que possible des conditions réelles. Au lieu de générer des ticks basés sur les données 1-minute, il est possible d'utiliser les ticks réels accumulés par un courtier. Ce sont les ticks reçus des bourses et des fournisseurs de liquidités.

    Pour commencer le test ou l'optimisation en ticks réels, sélectionnez le mode correspondant dans le testeur de stratégie :



    Les données des ticks sont plus grosses comparées à celles en 1-minute. Les télécharger peut prendre un peu plus de temps lors du premier test. Les données téléchargées des ticks sont stockées par mois dans les fichiers TKC situés dans \bases\[nom du serveur de trading]\ticks\[nom du symbole]\.

    Test sur des ticks réels
    Lors d'un test sur des ticks réels, un spread peut changer pendant une barre d'une minute, tandis qu'en générant les ticks pendant une minute, le spread est fixé si la barre correspondante est utilisée.

    Si le Market of Depth est affiché pour un symbole, les barres sont construites selon le dernier cours de transaction exécuté (Last). Sinon, le tester essaye d'abord de construire les barres sur les prix Last, et s'ils n'existent pas, il utilise les prix Bid. L'évènement OnTick est déclenché sur tous les ticks, indépendamment de la présence ou non du prix Last.

    Veuillez noter que les opérations de trading sont toujours effectuées aux prix Bid et Ask, même si le graphique est construit sur les prix Last. Par exemple, si un Expert Advisor, qui n'utilise que les prix d'ouverture des barres pour le trading (par exemple la Moyenne Mobile intégrée), reçoit un signal au prix Last, il effectue une opération à un autre prix (Bid ou Ask suivant la direction). Si le mode "Chaque tick" est utilisé, les barres sont construites avec les prix Bid, alors que les trades sont effectués aux prix Bid et Ask. Le prix Ask est calculé comme Bid + spread fixe de la barre 1 minute correspondante.

    Si l'historique d'un symbole a une barre 1-minute sans données de ticks, le tester génère les ticks dans le mode "Chaque tick". Cela permet de tester l'EA sur une certaine période dans le cas où les données des ticks d'un courtier sont insuffisantes. Si l'historique d'un symbole n'a pas de barre 1-minute mais que les données des ticks pour la minute sont présentes, ces ticks sont ignorés. Les données en minute sont considérées comme plus fiables.
    Actuellement, les tests et l'optimisation sur de vrais tics ne sont possibles que sur les agents locaux et distants. Le support au MQL5 Cloud Network sera ajouté prochainement.

  3. Ajout du Chat (messagerie instantanée). Maintenant, vous pouvez communiquer avec vos amis et collègues de la MQL5.community. Le chat affiche tous les messages personnels de votre compte MQL5. Pour commencer à communiquer, connectez-vous à votre compte directement depuis la fenêtre de chat ou via les paramètres de la plateforme : Outils -> Options -> Communauté.




  4. Fenêtre de création d'un compte de démo simplifiée, ajout de la possibilité de créer des comptes utilisant la couverture (hedging). Vous n'avez plus besoin de remplir le formulaire en entier. Il suffit de spécifier les données de base et de sélectionner les paramètres de trading : type de compte, dépôt, effet de levier, et la capacité de couverture.



  5. Ajout de l'attribution automatique d'un compte de démonstration pour un démarrage rapide. Si la plateforme n'a pas encore de compte, un compte de démonstration sur le premier serveur disponible est alloué lors du lancement. Après l'ouverture, la connexion au compte est immédiatement établie.

  6. Maintenant, chaque position a un ticket - un numéro unique. Il correspond habituellement au ticket d'un ordre utilisé pour l'ouverture de la position, sauf si le ticket a changé comme étant le résultat d'une opération de service sur le serveur, par exemple, lors de la facturation d'un swap pour la réouverture d'une position. Un ticket est attribué automatiquement à toutes les positions disponibles après la mise à jour du terminal.




  7. Correction de la définition des niveaux de Stop Loss et de Take Profit lors du placement d'un ordre au marché menant à un renversement de position. Jusqu'à récemment, aucun des niveaux correspondants n'étaient définis pour une nouvelle position.
  8. Correction des prix affichés avec quatre décimales ou plus sur les éléments du panneau de trading en un clic.
  9. Corrrection de l'affichage des nouvelles dans la fenêtre d'aperçu avant impression.
  10. Correction de l'affichage du graphique des ticks.
  11. Correction de l'ouverture du Market Depth après l'arrêt d'urgence du terminal.
  12. Ajout d'une vérification si les ordres du marché sont autorisés lors de l'affichage des éléments de contrôle du panneau de trading en un clic.
  13. Calculs du profit et de la marge optimisés dans le cas d'un grand nombre d'ordres et de positions ouvertes.
  14. Ajout de la traduction de l'interface utilisateur en malais.
  15. Manuel Utilisateur entièrement révisé. Nouveau design, des captures d'écran interactifs et des vidéos intégrées - apprenez le trading dans MetaTrader 5 avec un maximum de confort :




MQL5

  1. Ajout du support des classes abstraites et des fonctions virtuelles pures.

    Les classes abstraites sont utilisées pour créer des entités génériques que vous prévoyez d'utiliser pour créer des classes dérivées spécifiques. Une classe abstraite ne peut être utilisée que comme classe de base pour d'autres classes, c'est pourquoi il est impossible de créer un objet du type d'une classe abstraite.

    Une classe contenant au moins une fonction virtuelle pure est abstraite. Les classes dérivées d'une classe abstraite doivent donc implémenter toutes ses fonctions virtuelles pures, autrement, elles seront également des classes abstraites.

    Une fonction virtuelle est déclarée "pure" en utilisant la syntaxe du spécificateur pure. Considérons l'exemple de la classe CAnimal, qui n'est créée que pour fournir des fonctions communes - les objets du type CAnimal sont trop généraux pour un usage pratique. La classe CAnimal est donc un bon exemple de classe abstraite :
    class CAnimal
      {
    public:
                          CAnimal();     // constructeur
       virtual void       Sound() = 0;   // fonction virtuelle pure
    private:
       double             m_legs_count;  // nombre de pattes de l'animal
      };
    Ici Sound() est une fonction virtuelle pure car elle est déclarée avec le spécificateur de fonction virtuelle pure (=0).

    Les fonctions virtuelles pures sont les fonctions virtuelles pour lesquelles le spécificateur pure est utilisé : (=NULL) ou (=0). Exemple de déclaration et d'utilisation d'une classe abstraite :
    class CAnimal
      {
    public:
       virtual void       Sound()=NULL;   // méthode pure, doit être surchargée dans la classe dérivée, CAnimal est maintenant abstraite et ne peut pas être créée
      };
    //--- descendant de la classe abstraite
    class CCat : public CAnimal
     {
    public:
      virtual void        Sound() { Print("Myau"); } // la méthode pure est surchargée, CCat n'est pas abstraite et peut être créée
     };
    
    //--- exemples de mauvaises utilisations
    new CAnimal;         // Erreur de 'CAnimal' - le compilateur retourne l'erreur "ne peut pas instantier une classe abstraite"
    CAnimal some_animal; // Erreur de 'CAnimal' - le compilateur retourne l'erreur "ne peut pas instancier une classe abstraite"
    
    //--- exemples d'utilisations correctes
    new CCat;  // aucune erreur - la classe CCat n'est pas abstraite
    CCat cat;  // aucune erreur - la classe CCat n'est pas abstraite
    Restrictions concernant les classes abstraites
    Si le constructeur d'une classe abstraite appelle une fonction virtuelle pure (directement ou indirectement), le résultat est indéterminé.
    //+------------------------------------------------------------------+
    //| Une classe de base abstraite                                     |
    //+------------------------------------------------------------------+
    class CAnimal
      {
    public:
       //--- une fonction virtuelle pure
       virtual void      Sound(void)=NULL;
       //--- fonction
       void              CallSound(void) { Sound(); }
       //--- constructeur
       CAnimal()
        {
         //--- un appel explicite à la méthode virtuelle
         Sound();
         //--- un appel implicite (en utilisant une troisième fonction)
         CallSound();
         //--- un constructeur et/ou un destructeur appelle toujours ses propres fonctions,
         //--- même si elles sont virtuelles et surchargées par une fonction appellée dans une classe dérivée
         //--- si la fonction appelée est purement virtuelle
         //--- l'appel génère une erreur critique d'exécution "appel à une fonction virtuelle pure"
        }
      };
    Cependant, les constructeurs et les destructeurs des classes abstraites peuvent appeler d'autres fonctions membres.

  2. Ajout du support des pointeurs de fonctions pour simplifier l'organisation des modèles d'événements.

    Pour déclarer un pointeur de fonction, spécifiez le type "pointeur de fonction", par exemple :
    typedef int (*TFunc)(int,int);
    TFunc est maintenant un type, et il est possible de déclarer une variable pointant vers la fonction :
    TFunc func_ptr;
    La variable func_ptr peut stocker l'adresse de la fonction pour la déclarer par la suite :
    int sub(int x,int y) { return(x-y); }
    int add(int x,int y) { return(x+y); }
    int neg(int x)       { return(~x);  }
    
    func_ptr=sub;
    Print(func_ptr(10,5));
    
    func_ptr=add;
    Print(func_ptr(10,5));
    
    func_ptr=neg;           // erreur : neg n'est pas du type  int (int,int)
    Print(func_ptr(10));    // erreur : il devrait y avoir 2 paramètres
    Les pointeurs de fonctions peuvent être stockés et passés comme paramètres. Vous ne pouvez pas avoir un pointeur vers une méthode de classe non statique.

  3. MqlTradeRequest comporte deux nouveaux champs :

    • position - ticket de la position. Remplissez-le lorsque vous changez et fermez une position pour une identification claire lors du trading en mode "couverture" (hedging). Dans le système de compensation, le remplissage de ce champ n'affecte rien puisque les positions sont identifiées par le nom du symbole.
    • position_by - ticket de la position opposée. Il est utilisé lors de la fermeture d'une position par la position opposée (ouverte sur le même symbole mais dans une direction opposée). Le ticket est utilisé uniquement dans le système de couverture (hedging).

  4. Ajout de la valeur TRADE_ACTION_CLOSE_BY dans l'énumération ENUM_TRADE_REQUEST_ACTIONS des types d'opérations de trading - ferme une position par une position opposée. Le ticket est utilisé uniquement dans le système de couverture (hedging).

  5. Ajout des tickets de l'opération de trading dans les énumérations des propriétés des ordres, des transactions et des positions correspondantes :

    • Ajout de la propriété ORDER_TICKET à ENUM_ORDER_PROPERTY_INTEGER - ticket de l'ordre. Un numéro unique attribué à chaque ordre.
    • Ajout de la propriété DEAL_TICKET à ENUM_DEAL_PROPERTY_INTEGER - ticket de la transaction. Un numéro unique attribué à chaque transaction.
    • Ajout de la propriété POSITION_TICKET à ENUM_POSITION_PROPERTY_INTEGER - ticket de la position. Numéro unique attribué à chaque nouvelle ouverture de position. Il correspond habituellement au ticket d'un ordre utilisé pour l'ouverture de la position, sauf si le ticket a changé comme étant le résultat d'une opération de service sur le serveur, par exemple, lors de la facturation d'un swap pour la réouverture d'une position. Pour trouver l'ordre utilisé pour ouvrir une position, appliquez la propriété POSITION_IDENTIFIER. La valeur POSITION_TICKET correspond à MqlTradeRequest::position.

  6. Ajout de la valeur ORDER_TYPE_CLOSE_BY à l'énumération ENUM_ORDER_TYPE des types d'ordres - ordre close by.
  7. Ajout de la valeur ORDER_POSITION_BY_ID à l'énumération ENUM_ORDER_PROPERTY_INTEGER des propriétés de l'ordre - l'identifiant de la position opposée pour les types d'ordres ORDER_TYPE_CLOSE_BY.
  8. Ajout de la valeur DEAL_ENTRY_OUT_BY à l'énumération ENUM_DEAL_ENTRY des directions de transactions - une transaction est exécutée comme le résultat d'une opération close by.
  9. MqlTradeTransaction comporte également deux champs similaires :

    • position - ticket d'une position affectée par une transaction. Il est rempli pour les transactions liées à la manipulation des ordres du marché (TRADE_TRANSACTION_ORDER_* excepté TRADE_TRANSACTION_ORDER_ADD, où le ticket de la position n'est pas encore assigné) et de l'historique de l'ordre (TRADE_TRANSACTION_HISTORY_*).
    • position_by - ticket de la position opposée. Il est utilisé lors de la fermeture d'une position par la position opposée (ouverte sur le même symbole mais dans une direction opposée). Il n'est rempli que pour les ordres fermant une position par une position opposée (close by) et les transactions fermées par une transaction opposée (out by).

  10. Ajout de la fonction PositionGetTicket - retourne le ticket de la position par son index dans la liste des positions ouvertes et la sélectionne automatiquement pour travailler avec par la suite en utilisant les fonctions PositionGetDouble, PositionGetInteger et PositionGetString.
    ulong  PositionGetTicket(
       int  index      // index dans la liste des positions
       );

  11. Ajout de la fonction PositionSelectByTicket - sélectionne une position ouverte pour la poursuite du travail avec un ticket spécifié.
    bool  PositionSelectByTicket(
       ulong   ticket     // ticket de la position
       );

  12. Ajout de la valeur SYMBOL_MARGIN_HEDGED à l'énumération ENUM_SYMBOL_INFO_DOUBLE des propriétés des symboles - taille d'un contrat ou marge pour un lot de positions couvertes (positions opposées pour un même symbole).

    • Si la marge initiale (SYMBOL_MARGIN_INITIAL) est spécifiée pour un symbole, la marge couverte est spécifiée comme une valeur absolue (en termes monétaires).
    • Si la marge initiale n'est pas définie (égale à 0), une taille de contrat à utiliser dans le calcul de la marge est spécifiée dans SYMBOL_MARGIN_HEDGED. La marge est calculée en utilisant l'équation correspondant au type du symbole (SYMBOL_TRADE_CALC_MODE).

    La calcul de la marge pour les positions couvertes est décrit en détails dans l'Aide de la plateforme de trading MetaTrader 5.

  13. Ajout de la valeur ACCOUNT_MARGIN_MODE à l'énumération des propriétés du compte ENUM_ACCOUNT_INFO_INTEGER - mode de calcul de marge pour le compte de trading actuel :

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING - utilisé pour le marché over-the-counter avec le mode de compensation des positions (une position par symbole). Le calcul de la marge est basé sur le type du symbole (SYMBOL_TRADE_CALC_MODE).
    • ACCOUNT_MARGIN_MODE_EXCHANGE - utilisé sur les marchés des changes. La calcul de la marge est basé sur les remises spécifiées dans les paramètres du symbole. Les remises sont définies par le courtier, elles ne peuvent cependant pas être inférieures aux valeurs définies par la place boursière.
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING - utilisé pour le marché over-the-counter avec comptabilisation indépendante des positions (couverture, il peut y avoir plusieurs position pour un même symbole). Le calcul de la marge est basé sur le type du symbole (SYMBOL_TRADE_CALC_MODE). La taille de la marge couverte (SYMBOL_MARGIN_HEDGED) est également prise en compte.

  14. Ajout de la valeur TERMINAL_SCREEN_DPI à l'énumération ENUM_TERMINAL_INFO_INTEGER des propriétés du terminal client - la résolution d'affichage des données est mesurée en points par pouce (PPP ou DPI). La connaissance de ce paramètre permet de spécifier la taille des objets graphiques afin qu'ils apparaissent de façon similaire sur des écrans ayant des résolutions différentes.

  15. Ajout de la valeur TERMINAL_PING_LAST aux propriétés du terminal client - la dernière valeur connue du ping vers le serveur de trading en microsecondes. Une seconde contient un million de microsecondes.

  16. Correction du résultat de retour de l'appel à la fonction SendFTP. Auparavant, FALSE était retourné après un envoi réussi au lieu de TRUE.
  17. Correction d'une erreur dans la fonction StringConcatenate qui provoquait occasionnellement des erreurs d'exécution "Access violation".
  18. Correction d'erreurs pouvant survenir lors de l'utilisation de fonctions templatées.
  19. Ajout de la possibilité d'afficher des lignes dépassant 4.000 caractères pour les fonctions Print, Alert et Comment.
  20. Correction d'une erreur dans la fonction ArrayCompare qui se produisait lors de la comparaison d'un tableau avec lui-même avec des points de départ différents.
  21. Ajout du support de la couverture (hedging) à la Bibliothèque Standard :

    CPosition
    Méthodes ajoutées :

    • SelectByMagic - sélectionne une position par son nombre magique et son symbole pour l'utiliser ensuite.
    • SelectByTicket - sélectionne une position par son ticket pour l'utiliser ensuite.

    CTrade
    Méthodes ajoutées :

    • RequestPosition - retourne le ticket de la position.
    • RequestPositionBy - retourne le ticket de la position opposée.
    • PositionCloseBy - ferme la position avec le ticket spécifié par une position opposée.
    • SetMarginMode - définit le mode de calcul de la marge en fonction des paramètres du compte courant.

    Ajout de la prise en compte de la surcharge des méthodes :

    • PositionClose - ferme la position par son ticket.
    • PositionModify - modifie la position par son ticket.

    CAccountInfo
    Méthodes modifiées :

    • MarginMode - retourne le mode de calcul de la marge. Jusqu'à récemment, la méthode fonctionnait de façon similaire à la nouvelle méthode StopoutMode.
    • MarginDescription - retourne le mode de calcul de la marge sous forme de chaîne de caractères. Jusqu'à récemment, la méthode fonctionnait de façon similaire à la nouvelle méthode StopoutModeDescription.

    Méthodes ajoutées :

    • StopoutMode - retourne le mode de spécification du niveau minimum de marge.
    • StopoutModeDescription - retourne le mode de spécification du niveau minimum de marge sous forme de chaîne de caractères.

    CExpert
    Méthodes ajoutées :

    • SelectPosition - sélectionne une position pour l'utiliser ensuite.

  22. Ajout de quelques améliorations à la Bibliothèque Standard.


Signaux

  1. Corrections de quelques signaux de trading présentant des erreurs d'affichage.


Tester

  1. Correction d'une erreur qui empêchait le calcul des commissions sur plusieurs types de symboles de trading.
  2. Correction du remplissage du champ Expert pour les ordres de trading résultant de l'activation des SL/TP selon le champ Expert de la position correspondante. Auparavant, il n'était pas rempli.
  3. Correction du basculement entre les onglets de résultats des tests normaux et avancés.
  4. Correction du calcul et de l'affichage de l'indicateur "Enveloppes".
  5. Test visuel optimisé.
  6. Calculs du profit et de la marge optimisés dans le cas d'un grand nombre d'ordres et de positions ouvertes.
  7. Opérations de trading optimisées pendant le trading à haute fréquence.
  8. La synchronisation de l'historique n'est maintenant plus effectuée si une demande pour des propriétés non critiques du symbole (ne nécessitant pas les cotations actuelles) a été faite. Par exemple, SYMBOL_SELECT, SYMBOL_DIGITS, SYMBOL_SPREAD_FLOAT, SYMBOL_TRADE_CALC_MODE, SYMBOL_TRADE_MODE, SYMBOL_TRADE_STOPS_LEVEL, SYMBOL_TRADE_FREEZE_LEVEL, SYMBOL_TRADE_EXEMODE, etc. Auparavant, l'historique était synchronisé à chaque demande d'une propriété du symbole, même non critique.

MetaEditor

  1. Correction de la recherche de mots par fichiers en mode "Mot Entier Uniquement".
  2. Ajout du déplacement vers un fichier en double cliquant sur la ligne correspondante du résultat de la compilation.
  3. Correction de l'affichage de certains éléments de contrôle dans Windows XP.


  1. Documentation mise à jour.