La version beta de la Plateforme Web MetaTrader 5 a été publiée. Le nouveau produit combine l'aspect pratique et la nature multi-plateformes du terminal web avec les avantages de la version de bureau de MetaTrader 5 – vitesse, support de plusieurs marchés et fonctions étendues de trading.
La plateforme web MetaTrader 5 est disponible sur la MQL5.community et elle permet aux traders d'effectuer des opérations de trading sur les marchés financiers depuis n'importe quel navigateur et n'importe quel système d'exploitation, incluant Windows, Mac et Linux. Vous n'avez besoin que d'une connexion internet. Aucun logiciel supplémentaire n'est requis.
Les fonctionnalités suivantes sont disponibles dans la version beta :
Système de compensation
Avec ce système, vous ne pouvez avoir qu'une seule position pour un symbole au même moment :
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 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.
Les tickets des ordres et des positions (incluant l'historique des ordres) ne sont pas conservés pendant l'import, car un enregistrement de l'historique de MetaTrader 4 peut être importé en 4 opérations d'historique dans MetaTrader 5. Les nouveaux tickets sont assignés à tous les enregistrements de trading.
Les numéros des comptes peuvent être préservés ou remplacés suivant la façon dont le courtier les importe.
class CAnimal { public: CAnimal(); // Constructeur virtual void Sound() = 0; // Une fonction virtuelle pure private: double m_legs_count; // Le 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).
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 }; //--- Dérivée d'une 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 abstraiteRestrictions concernant les classes abstraites
//+------------------------------------------------------------------+ //| 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.
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ètresLes 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.
ulong PositionGetTicket( int index // index dans la liste des positions );
bool PositionSelectByTicket(
ulong ticket // ticket de la position
);
Système de compensation
Avec ce système, vous pouvez n'avoir qu'une seule position commune pour un symbole à la fois :
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 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.
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).
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 abstraiteRestrictions concernant les classes abstraites
//+------------------------------------------------------------------+ //| 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.
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ètresLes 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.
ulong PositionGetTicket( int index // index dans la liste des positions );
bool PositionSelectByTicket(
ulong ticket // ticket de la position
);
Le nouveau système de comptabilité d'une position est similaire à celle de MetaTrader 4, combiné avec tous les avantages de la plateforme de cinquième génération - exécution des ordres en utilisant plusieurs offres (y compris remplissage partiel), ordres stop-limit, etc.
Mettez maintenant à jour la plateforme pour voir comment fonctionne l'option de couverture. Lors de l'ouverture d'un nouveau compte de démonstration, activez l'option \ "Utiliser couverture \". L'option sera disponible si le serveur de votre courtier a été mis à jour et configuré.
Le nouveau système de comptabilité d'une position est similaire à celle de MetaTrader 4, combiné avec tous les avantages de la plateforme de cinquième génération - exécution des ordres en utilisant plusieurs offres (y compris remplissage partiel), ordres stop-limit, etc.
Mettez maintenant à jour la plateforme pour voir comment fonctionne l'option de couverture. Lors de l'ouverture d'un nouveau compte de démonstration, activez l'option "Utiliser couverture". L'option sera disponible si le serveur de votre courtier a été mis à jour et configuré.
MetaEditor : Ajout d'un lien vers le tutoriel vidéo "Comment Créer un Robot de Trading dans l'Assistant MQL5" pour l'Assistant MQL5. Regardez cette vidéo de trois minutes et développez un robot de trading sans écrire une seule ligne de code.
2015.10.14 14:48:18.486 Data Folder: C:\Program Files\MetaTrader 5 2015.10.14 14:48:18.486 Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7 920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00 2015.10.14 14:48:18.486 MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
struct MqlTick { datetime time; // Heure de la dernière mise à jour d'un prix double bid; // Prix Bid actuel double ask; // Prix Ask actuel double last; // Prix Last actuel ulong volume; // Volume du prix Last actuel long time_msc; // Heure de la dernière mise à jour d'un prix en millisecondes uint flags; // Flags du tick };Les paramètres de chaque tick sont remplis indépendamment du fait qu'il y ait des changements par rapport au tick précédent. Ainsi, il est possible de trouver un prix correct pour un moment donné dans le passé, sans avoir besoin de rechercher des valeurs antérieures. Par exemple, même si le prix Bid change pendant l'arrivée d'un tick, la structure contient toujours les autres paramètres, notamment le prix Ask précédent, le volume, etc. Vous pouvez analyser les flags des ticks pour savoir exactement quelles données ont été modifiées :
//+------------------------------------------------------------------+ //| TemplTest.mq5 | //| Copyright 2015, MetaQuotes Software Corp. //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Déclare un modèle de classe | //+------------------------------------------------------------------+ template<typename T> class TArray { protected: T m_data[]; public: bool Append(T item) { int new_size=ArraySize(m_data)+1; int reserve =(new_size/2+15)&~15; //--- if(ArrayResize(m_data,new_size,reserve)!=new_size) return(false); //--- m_data[new_size-1]=item; return(true); } T operator[](int index) { static T invalid_index; //--- if(index<0 || index>=ArraySize(m_data)) return(invalid_index); //--- return(m_data[index]); } }; //+------------------------------------------------------------------+ //| Modèle de classe d'un tableau de pointeurs. Le destructeur supprime | //| les objets stockés dans le tableau. | //| | //| Noter l'héritage de la classe templatée TArray | //+------------------------------------------------------------------+ template<typename T> class TArrayPtr : public TArray<T *> { public: void ~TArrayPtr() { for(int n=0,count=ArraySize(m_data);n<count;n++) if(CheckPointer(m_data[n])==POINTER_DYNAMIC) delete m_data[n]; } }; //+--------------------------------------------------------------------------+ //| Déclare la classe. Les pointeurs vers ses objets seront stockés dans le tableau | //+--------------------------------------------------------------------------+ class CFoo { int m_x; public: CFoo(int x):m_x(x) { } int X(void) const { return(m_x); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ TArray<int> ExtIntArray; // instancie TArray (spécialiee TArray avec le type int) TArray<double> ExtDblArray; // instancie TArray (spécialise TArray avec le type double) TArrayPtr<CFoo> ExtPtrArray; // instancie TArrayPtr (spécialise TArrayPtr avec le type CFoo) //+------------------------------------------------------------------+ //| Fonction de démarrage du script | //+------------------------------------------------------------------+ void OnStart() { //--- remplit les tableaux avec les données for(int i=0;i<10;i++) { int integer=i+10; ExtIntArray.Append(integer); double dbl=i+20.0; ExtDblArray.Append(dbl); CFoo *ptr=new CFoo(i+30); ExtPtrArray.Append(ptr); } //--- extrait les contenus du tableau string str="Int:"; for(int i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(int i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(int i=0;i<10;i++) str+=" "+(string)ExtPtrArray[i].X(); Print(str); //--- Les objets CFoo créés via new ne devraient pas être effacés puisqu'ils sont supprimés dans le destructeur de l'objet TArrayPtr<CFoo> }Résultats d'exécution :
int ObjectsDeleteAll( long chart_id, // identifiant du graphique const string prefix, // préfixe du nom de l'objet int sub_window=-1, // indice de la fenêtre int object_type=-1 // type d'objet pour la suppression );
Documentation mise à jour.
Lisez le texte entier ici.
Maintenant, vous pouvez acheter n'importe quelle application du Market en une seule étape directement à partir de votre terminal MetaTrader 4/5 sans inscription. Il suffit de cliquer sur Acheter et de sélectionner le mode de paiement.
Vous serez, ensuite, redirigé vers la page du système de paiement Web pour finaliser votre achat. PayPal, WebMoney, Neteller ou carte bancaire - vous pouvez choisir comment payer vos achats dans la boutique de robots et d'indicateurs prêts à l'emploi.
Après avoir effectué un achat, nous vous recommandons toujours de vous créer un compte MQL5.community, afin que votre produit acheté soit automatiquement lié à votre compte. Un compte MQL5 vous permet de mettre à jour le produit et de l'installer sur plusieurs ordinateurs. En outre, un compte MQL5.community vous donne accès un ensemble de services pour les plateformes MetaTrader tels que les signaux de trading pour copier les transactions de traders à succès, l'hébergement virtuel pour une utilisation continue de vos applications et le service Freelance pour commander des robots uniques auprès des développeurs.
Maintenant, vous connaissez la façon la plus rapide et la plus facile d'obtenir un robot de trading. Plus de 5.000 applications de MetaTrader sont déjà disponibles dans le Market - choisissez et achetez tout simplement !
Les Actifs sont ajoutés aux Fonds du client et augmentent la Marge Libre, augmentant donc les volumes des opérations de trading admises sur le compte.
Ainsi, il est maintenant possible d'ouvrir des comptes avec différents types de marge.
ulong GetMicrosecondCount();
Cette fonction peut être utilisée pour profiler l'exécution du programme et identifier des "étranglements".Correction d'erreurs rapportées dans les journaux.
Documentation mise à jour.
La mise à jour est disponible via le système LiveUpdate.