MetaTrader 5 Build 1640 : Créer et tester des symboles personnalisés

Mises à jour : MetaTrader 5

21 juillet 2017

Terminal

  1. Il est maintenant possible de créer des instruments financiers personnalisés dans le terminal. Avec cette option, vous pouvez créer n'importe quel symbole, configurer ses paramètre, importer vos données de prix pour le symbole et voir ses graphiques.

    Création d'un Symbole Personnalisé
    Ouvrez la fenêtre de gestion des symboles en utilisant le menu contextuel de la fenêtre "Market Watch" et cliquez sur "Créer un Symbole Personnalisé" :


    Un grand nombre de paramètres peuvent être configurés pour un symbole. La liste complète des paramètres et leurs descriptions est disponible dans la documentation. Vous pouvez rapidement configurer votre symbole personnalisé en copiant les paramètres de n'importe quel instrument similaire et en les modifiant. Sélectionnez un symbole existant dans le champ "Copier depuis".
    Le nom du symbole personnalisé ne doit pas correspondre aux noms des symboles fournis par les courtiers. Si vous vous connectez au serveur sur lequel un symbole existe avec le même nom, le symbole personnalisé sera effacé.
    Des commandes d'import et d'export des paramètres sont également disponibles ici. Vous pouvez facilement partager des symboles personnalisés ou transférer des symboles entre vos terminaux. Les paramètres sont exportés dans des fichiers texte au format JSON.

    Gestion des Symboles Personnalisés
    Tous les symboles sont affichés dans un groupe Custom séparé. Si vous avez besoin de modifier ou d'effacer un symbole, utilisez le menu contextuel de la liste :



    Import de l'Historique des Prix
    Vous pouvez importer des données de prix pour votre symbole personnalisé depuis n'importe quel fichier texte, mais aussi depuis des fichiers d'historique MetaTrader au format HST et HCC. Choisissez un symbole et allez dans l'onglet "Barres". L'import des ticks n'est pas encore supporté.


    Dans la boîte de dialogue d'import, spécifier le chemin vers le fichier et remplissez les paramètres requis :

    • Séparateur — le séparateur des éléments dans un fichier texte.
    • Ignorer des colonnes et des lignes — nombre de colonnes (de gauche à droite) et de lignes (de haut en bas) à ignorer pendant l'import.
    • Décalage — décalage horaire en heures. L'option est utilisée lors de l'import de données sauvées dans un fuseau horaire différent.
    • Utiliser la sélection uniquement — n'importe que les lignes sélectionnées dans la zone de visualisation des lignes. Vous pouvez sélectionner des lignes avec la souris tout en maintenant les touches Ctrl ou Shift.

    Un fichier avec des barres en 1 minute doit avoir le format suivant : Date Time Open High Low Close TickVolume Volume Spread. Par exemple :
    2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
    2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
    2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
    2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
    Vous pouvez utiliser les données de n'importe quel instrument existant pour votre symbole personnalisé. Exportez les données (l'option a été ajoutée dans la version précédente de la plateforme), modifiez-les si nécessaire et ré-importez les données.
    L'historique des prix est stocké sous le forme de barres 1-minute dans MetaTrader 5. Toutes les autres périodes sont créées sur la base de ces barres. Vous pouvez également importer les données de périodes supérieures, mais les graphiques sur des périodes inférieures auront des gaps dans ce cas. Par exemple, si vous importez des données 1-heure, une barre par heure sera affichée dans le graphique M1.
    Les données de prix des symboles personnalisés sont sauvegardés dans un répertoire Custom séparé (et non pas dans les répertoires où les serveurs de trades sont sauvegardés) :
    C:\Users\[compte windows]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

    Utilisation des Symboles Personnalisés
    L'utilisation des symboles personnalisés est similaire à l'utilisation des instruments fournis par le courtier. Les symboles personnalisés sont affichés dans la fenêtre du Market Watch ; vous pouvez ouvrir les graphiques de cs symboles et leur appliquer des indicateurs et des objets d'analyse. Les symboles personnalisés ne peuvent pas être tradés.

    Test de Stratégies sur des Symboles Personnalisés
    Les symboles personnalisés peuvent être utilisés pour tester des robots de trading et des indicateurs dans le strategy tester. Ceci permet d'optimiser des stratégies même pour des symboles financiers qu'un courtier ne peut pas fournir actuellement. Vous n'avez qu'à importer l'historique correctement et à configurer les propriétés du symbole personnalisé.



    Lors du calcul de la marge et du profit, le strategy tester utilise automatiquement les taux croisés disponibles. Supposons que nous avons créé le symbole personnalisé AUDCAD.custom avec le type Forex de calcul de marge et que notre devise de compte est l'USD. Dans ce cas, le testeur recherche les symboles nécessaires dans l'ordre suivant basé sur le nom du symbole Forex :
    1.     en premier, la recherche est effectuée pour les symboles AUDUSD.custom (pour calculer la marge) et USDCAD.custom (pour calculer le profit du trade)
    2.     si l'un de ces symboles n'est pas présent, la recherche est effectuée pour le premier symbole correspondant à la paire de devises nécessaires par son nom (AUDUSD et USDCAD respectivement). Par exemple, les symboles AUDUSD.b et NZDUSD.b ont été trouvés. Cela signifie que leurs taux seront utilisés pour calculer la marge et le profit.

    Les instruments avec d'autres types de calcul de marge (CFD, Futures et Actions) nécessitent une paire de devises pour convertir la devise de l'instrument dans la devise de dépôt. Supposons que nous avons créé un symbole personnalisé avec les devises de profit et de marge exprimées en GBP, tandis que la devise du dépôt est CHF. Dans ce cas, la recherche des symboles de test est effectuée dans l'ordre suivant :
    1. La présence d'un symbole de trading correspondant à GBPCHF (GBP vs CHF) est vérifiée.
    2. Si un tel symbole n'existe pas, la recherche est effectuée pour le premier symbole de trading correspondant à GBPCHF par son nom, par exemple GBPCHF.b ou GBPCHF.def.

    Lors du test d'applications utilisant des instruments personnalisés, assurez-vous que le compte de trading a touts les paires de devises nécessaires. Autrement, le calcul des résultats financiers et des besoins de marge pendant le test ne sera pas possible.

    Plus de possibilités seront disponibles dans les prochaines versions de la plateforme.
    Le développement des symboles personnalisés n'est pas encore terminé, et plus de fonctions seront ajoutées dans les prochaines versions de la plateforme. Vous pourrez importer l'historique dans les symboles personnalisés directement depuis les Expert Advisors, mais aussi diffuser les données (ajouter des cotations) de ces symboles en temps réel.

  2. Ajout du filtre de la fonctionnalité Time & Sales par volume.

    Les transactions avec un volume inférieur à la valeur spécifiée peuvent être cachées du tableau Time & Sales. Si ce filtre est appliqué, seules les transactions avec un gros volume apparaîtront dans la fenêtre Time & Sales.

    Double cliquez sur la première ligne dans la fenêtre Time & Sales, spécifiez le volume minimum en lots et cliquez ensuite sur n'importe quelle autre zone du Market Depth. Les trades seront filtrés et la valeur actuelle du filtre sera affichée dans l'en-tête de la colonne du volume.



    Vous pouvez également spécifier le volume minimum en utilisant le menu contextuel du Time & Sales.

  3. Ajout d'une option pour lier le Market Depth à un graphique actif. Chaque fois que vous basculez vers le graphique d'un instrument financier, cet instrument sera automatiquement activé dans la fenpetre du Market Depth. Vous n'aurez donc plus besoin d'ouvrir la fenêtre du Market Depth pour chaque nouveau symbole.



  4. Correction du rafraîchissement des barres d'outils après avoir minimisé puis maximisé la fenêtre du terminal.
  5. Correction de la génération de l'historique de trading d'une position si les tickets de la transaction et de la position se chevauchent.

MQL5

  1. Ajout d'une option pour profiler les programmes MQL5 sur un historique des prix. Cette option permet de vérifier les performances des programmes sans attendre de nouveaux ticks.

    Lors du profilage sur la base de données réelles, le programme est lancé dans un graphique normal du terminal. De nombreux programmes, spécialement les indicateurs, effectuent uniquement les calculs à l'arrivée d'un nouveau tick (OnTick, OnCalculate). Pour évaluer les performances, vous devez donc attendre l'arrivée de nouveaux ticks en temps réel. Si vous testez un programme en utilisant des données historiques, vous pouvez immédiatement fournir les données nécessaires. Le profilage est lancé en mode visuel dans le Strategy Tester, et vous recevez beaucoup d'évènements de nouveaux ticks à la fois.



  2. Ajout du support des unions. L'union est un type de donnée spécial consistant en plusieurs variables partageant la même zone mémoire. L'union fournit donc la possibilité d'interpréter la même séquence de bits en deux (ou plus) façons différentes. La déclaration d'une union commence avec le mot-clé 'union'.
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    Contrairement à une structure, différents membres d'une union appartiennent à la même zone mémoire. Dans cet exemple, l'union LongDouble est déclarée avec des valeurs de type long et double partageant la même zone mémoire. Veuillez noter qu'il est impossible de stocker dans l'union une valeur de type long integer et une valeur double réelle simultanément (contrairement à une structure), puisque les variables long_value et double_value se chevauchent (en mémoire). D'un autre côté, un programme MQL5 est capable de traiter des données contenant dans l'union une valeur de type integer (long) ou réelle (double) n'importe quand. L'union permet donc de reçevoir deux (ou plus) options pour représenter la même séquence de données.

    Pendant la déclaration d'une union, le compilateur alloue automatiquement la zone mémoire suffisante pour stocker le type le plus grand (en volume) dans la variable de l'union. La même syntaxe est utilisée pour accéder à un élément de l'union que pour une structure, c'est à dire l'opérateur point.
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    //+------------------------------------------------------------------+
    //| Fonction de démarrage du script                                  |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       LongDouble lb;
    //--- récupère et affiche le nombre invalide -nan(ind)
       lb.double_value=MathArcsin(2.0);
       printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
    //--- plus grande valeur normalisée (DBL_MAX)
       lb.long_value=0x7FEFFFFFFFFFFFFF;
       printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
    //--- plus petite valeur normalisée (DBL_MIN)
       lb.long_value=0x0010000000000000;    
       printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
      }
    /*  Résultat de l'exécution
        1.  double=-nan(ind)                integer=FFF8000000000000
        2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
        3.  double=2.2250738585072014e-308  integer=0010000000000000
    */

  3. Ajout de la génération automatique d'un opérateur de copie implicite pour les objets des structures et des classes. Le compilateur crée maintenant automatiquement les opérateurs de copie, qui permettent d'écrire des entrées simples pour les objets, tel que b=a :
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- constructeur par défaut
                         Foo(void){value=-1;};
       //--- constructeur paramétré   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  structure contenant des objets de type Foo                      |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| Fonction de démarrage du programme                               |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Résultat de l'exécution;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    La copie des membres des objets est effectuée dans l'opérateur implicite.

    • Si un membre est un objet, l'opérateur de copie correspondant à cet objet est appelé.
    • Si un membre est un tableau d'objets, le tableau destination est agrandi ou réduit à la taille nécessaire en utilisant ArrayResize avant d'appeler l'opérateur de copie correspondant à chaque élément.
    • Si un membre est un tableau d'objets simples, la fonction ArrayCopy est utilisée pour la copie.
    • Si un membre est un pointeur sur un objet, le pointeur est copié plutôt que l'objet sur lequel il pointe.

    Si nécessaire, vous pouvez surcharger le comportement et créer votre propre comportement au lieu de celui d'un opérateur de copie implicite, en utilisant la surcharge.

  4. Optimisation de la mémoire utilisée lors de l'accès à l'historique des prix depuis les Expert Advisors utilisant les fonctions Copy*. La consommation de la mémoire sera réduite énormément lors de l'utilisation de grandes quantités de données.

  5. La fonction TimeToStruct retourne maintenant une valeur de type boolean, permettant de vérifier le succès de la conversion d'une datetime en MqlDateTime.
  6. Ajout de l'interdiction d'utiliser les fonctions FileWriteStruct et FileReadStruct pour les structures contenant des string, des tableaux dynamiques, des objets et des pointeurs.
  7. Les codes de retour suivants ont été ajoutés :

    • TRADE_RETCODE_REJECT_CANCEL — la requête d'activation d'un ordre en attente est rejetée, l'ordre est annulé
    • TRADE_RETCODE_LONG_ONLY — la requête est rejetée car la règle "Seules les positions long sont autorisées" est définie pour le symbole
    • TRADE_RETCODE_SHORT_ONLY — la requête est rejetée car la règle "Seules les positions short sont autorisées" est définie pour le symbole
    • TRADE_RETCODE_CLOSE_ONLY — la requête est rejetée car la règle "Seules les clôtures des positions existantes sont autorisées" est définie pour le symbole

  8. Ajout de la valeur de retour de la fonction SymbolInfoInteger avec le paramètre SYMBOL_ORDER_MODE. SYMBOL_ORDER_CLOSEBY — permission d'une opération Close By, c'est à dire la clôture d'une position par une position opposée.
  9. La propriété de type boolean SYMBOL_CUSTOM a été ajoutée à l'énumération ENUM_SYMBOL_INFO_INTEGER. La propriété permet de savoir si un symbole est un symbole personnalisé. Utilisez la fonction SymbolInfoInteger pour récupérer la propriété.
  10. Il est maintenant possible d'obtenir la raison de la création d'un ordre, d'une transaction ou d'une position.

    Nouvelles propriétés


    Raisons pour la création d'un ordre, d'une transaction et d'une position
    Trois variables ont été ajoutées pour obtenir les raisons de la création d'opérations de trading :
    ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON Description de la raison
    POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT L'opération a été exécutée en raison de l'activation d'un ordre placé depuis un terminal de bureau
    POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE L'opération a été exécutée en raison de l'activation d'un ordre placé depuis une application mobile
    POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB L'opération a été exécutée en raison de l'activation d'un ordre placé depuis une plateforme web
    POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT L'opération a été exécutée en raison de l'activation d'un ordre placé depuis un programme MQL5, c'est à dire par Expert Advisor ou un script
    - DEAL_REASON_SL ORDER_REASON_SL L'opération a été exécutée en raison de l'activation d'un Stop Loss
    - DEAL_REASON_TP ORDER_REASON_TP L'opération a été exécutée en raison de l'activation d'un Take Profit
    - DEAL_REASON_SO ORDER_REASON_SO L'opération a été exécutée en raison d'un évènement Stop Out
    - DEAL_REASON_ROLLOVER - La transaction a été exécutée en raison d'un rollover
    - DEAL_REASON_VMARGIN - La transaction a été exécutée après la facturation de la marge de variation
    - DEAL_REASON_SPLIT - La transaction a été exécutée après le découpage (réduction du prix) d'une action ou d'un autre actif, qui a ouvert une position au moment de l'annonce du découpage

  11. Optimisation de la synchronisation et de l'accès à l'historique des ticks.
  12. Correction du retour des ticks dans un tableau statistique dans la fonction CopyTicksRange. Dans les précédentes versions, la fonction ne retournait aucun tick dans ce cas.
  13. Diverses corrections ont été apportées dans la Bibliothèque de Logique Floue.

Signals

  1. Correction de l'ouverture d'un signal depuis le site web lorsqu'un compte de trading n'est connecté.

Tester

  1. Optimisation et accélération du travail avec l'historique des ordres et des transactions. La vitesse d'opération sera augmentée énormément lors de l'utilisation de grandes quantités de données (dizaines de milliers d'entrées dans l'historique).
  2. Correction du calcul de la durée de détention d'une position dans le rapport de test.

MetaEditor

  1. Correction de l'affichage du contenu des tableaux membres de classe statique dans le debugger.
  2. Ajout d'une liste de points d'arrêt dans le programme en cours de déboguage. La liste peut être ouverte avec le menu contextuel dans l'onglet Debug :


    Pour aller sur un point d'arrêt, double cliquez dessus.
Mise à jour de la documentation.