Tester : Correction du calcul des commissions comme un pourcentage annuel pendant le test.
Après deux mois de test public, la version web de la plateforme multi-actifs MetaTrader 5 a été publiée officiellement. Elle permet de trader le Forex et les bourses depuis n'importe quel navigateur et n'importe quel système d'exploitation. Seule une connexion Internet est nécessaire, aucune installation de logiciel n'est demandée.
L'application combine les principaux avantages des versions de bureau (haute vitesse, support de plusieurs marchés et fonctions étendues de trading) avec l'aspect pratique de la nature multi-plateformes du terminal web. La fonctionnalité principale de la nouvelle version est le Depth of Market, qui n'était pas présent dans la version beta.
La plateforme web permet aux traders d'effectuer des analyses
techniques et des opérations de trading comme dans la version de bureau.
La plateforme web fournit les fonctionnalités suivantes :
Avant |
Après |
|
---|---|---|
Déclencheur | Bid/Ask pour tous les types d'Ordres en Attente et SL/TP |
Bid/Ask pour les Ordres Limit Last pour les ordres Stop, Stop-Limit et SL/TP |
Exécution | Le prix spécifié dans l'ordre pour tous les types d'Ordres en Attente et les SL/TP |
Bid/Ask au moment du déclenchement de l'ordre pour tous les types d'Ordres en Attente et les SL/TP |
Considérons l'exemple sur le symbole Si-6.16. Un nouvel ordre Buy Stop au prix de déclenchement = 72580 est défini alors que les prix actuels sont : Bid=72570, Ask=72572, Last=72552. De nouveaux prix courants sont reçus dans un flux de prix :
Le déclencheur pour les Ordres Stops des instruments échangés est le prix Last. Donc le prix Last=72580 reçu dans le flux active l'ordre Buy Stop. Dans les versions précédentes, le même prix était utilisé pour exécuter cet ordre. Ce comportement est incorrect car il n'y a plus de prix Ask=72580 sur la marché pour exécuter la transaction Buy.
Correction d'erreurs reportées dans les journaux des crash.
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
);
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.
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.
Some improvements and bug fixes have been made in the operation of the Strategy Tester. Time spent on intermediate preparatory operations and network latency has been significantly reduced. Testing and optimization are now faster in all operating modes: working with local testing agents, with a farm of agents in the local network and using MQL5 Cloud Network.
Fixed errors reported in crash logs.
Updated documentation.
The update is available through the LiveUpdate system.
Une nouvelle mise à jour de la plateforme MetaTrader 5 a été publiée. Elle contient les changements suivants :
Vous devez donc toujours changer le nombre de graphiques et la liste des symboles, l'ensemble des programmes lancés et leurs paramètres d'entrée, les paramètres du terminal et les abonnements aux Signaux.
Lors de la migration, toutes les données sont enregistrées dans le journal du terminal client.
MetaTrader 5 Android build 1052
La nouvelle version de MetaTrader 5 pour Android est maintenant disponible dans Google Play. Elle contient des corrections et une stabilité amliorée. Les objets d'analyse et le système de messagerie seront bientôt ajoutés.
L'application peut être téléchargée ici : https://download.mql5.com/cdn/mobile/mt5/android?hl=en&utm_source=www.metatrader5.com
La mise à jour est disponible via le système LiveUpdate.
Les agents du testeur ne fonctionne maintenant que sur les systèmes 64 bits. Cette décision est conduite par le besoin de suivre le développement de l'industrie IT. Basculer vers de nouvelles technologies augmente les performances de calcul et autorise de futurs développements du MQL5 Cloud Network.
Changements dans les composants de la plateforme :
int WebRequest (string method, string url,string headers,int timeout, const char &data[], int data_size,char &result[], string &result_headers)Cette fonction vous permet de former explicitement les contenus des en-têtes des requêtes HTTP fournissant une mécanisme plus flexible pour intéragir avec différents services Web.
Correction d'erreurs reportées dans les journaux de crash.
Mise à jour de la documentation.
La mise à jour sera disponible via le système LiveUpdate.
int CopyTicks( const string symbol_name, // Symbol name MqlTick &ticks_array[], // the array where ticks will be placed uint flags=COPY_TICKS_ALL, // the flag that defines the type of received ticks ulong from=0, // the date starting from which ticks will be received, specified in milliseconds since 01.01.1970 uint count=0 // the number of latest ticks that should be received );Ticks can be requested by the date if the 'from' value is specified, or based on their number using the 'count' value. If none of the parameters are specified, all available ticks are received, but not more than 2000. Ticks can also be requested based on their type using the 'flags' parameter. Available values:
Fixed errors reported in crash logs.
Documentation has been updated.
The update is available through the LiveUpdate system.
//+------------------------------------------------------------------+ //| MacroExample | //| Copyright 2014, MetaQuotes Software Corp. | //| https://www.metaquotes.net | //+------------------------------------------------------------------+ #property script_show_inputs input bool InpSecond=true; #define DEFCLASS(class_name) class class_name:public CBase{public:class_name(string name):CBase(name){}}; #define TOSTR(x) #x #define AUTODEL(obj) CAutoDelete auto_##obj(obj) #define NEWOBJ(type,ptr) do { ptr=new type(TOSTR(ptr)); \ Print("Create object '",TOSTR(type)," ",TOSTR(ptr),"' by macro NEWOBJ"); } \ while(0) //+------------------------------------------------------------------+ //| The basic class required for automatic deletion of objects | //+------------------------------------------------------------------+ class CBase { protected: string m_name; public: CBase(string name):m_name(name) { } string Name(void) const{ return(m_name); } }; //+------------------------------------------------------------------+ //| The object auto-delete class makes watching of created | //| objects unnecessary. It deletes them in its destructor | //+------------------------------------------------------------------+ class CAutoDelete { CBase *m_obj; public: CAutoDelete(CBase *obj):m_obj(obj) { } ~CAutoDelete() { if(CheckPointer(m_obj)==POINTER_DYNAMIC) { Print("Delete object '",m_obj.Name(),"' by CAutoDelete class"); delete m_obj; } } }; //+------------------------------------------------------------------+ //| Declaring two new classes CFoo and CBar | //+------------------------------------------------------------------+ DEFCLASS(CFoo); DEFCLASS(CBar); //+------------------------------------------------------------------+ //| The main script function | //+------------------------------------------------------------------+ void OnStart() { CFoo *foo; //--- Creating an object of the CFoo class NEWOBJ(CFoo,foo); //--- Creating an instance of the CFoo foo object auto-deletion class AUTODEL(foo); //--- if(InpSecond) { CBar *bar; //--- NEWOBJ(CBar,bar); AUTODEL(bar); } //--- No need to delete foo, it will be deleted automatically } //+------------------------------------------------------------------+
Fixed errors reported in crash logs.
Documentation has been updated.
Fixed errors reported in crash logs.
Updated documentation.
The update is available through the LiveUpdate system.
The money transfer option should be enabled on the trade
server. Depending on the settings, there are some restrictions on the
accounts, between which transfer is allowed. In particular, money
transfer can be allowed only for accounts with identical names and
emails.
Fixed display of the Label and Bitmap Label graphical objects with the anchor point located in one of the bottom corners of a chart.
int CryptEncode(ENUM_CRYPT_METHOD method,const uchar &data[],const uchar &key[],uchar &result[]); int CryptDecode(ENUM_CRYPT_METHOD method,const uchar &data[],const uchar &key[],uchar &result[]);A new enumeration ENUM_CRYPT_METHOD has been added for working with the functions:
CRYPT_BASE64, // BASE64 encryption (re-encoding) CRYPT_AES128, // AES encryption with 128-bit key CRYPT_AES256, // AES encryption with 256-bit key CRYPT_DES, // DES encryption (key length is 56 bits - 7 bytes) CRYPT_HASH_SHA1, // calculation of HASH SHA1 CRYPT_HASH_SHA256, // calculation of HASH SHA256 CRYPT_HASH_MD5, // calculation of HASH MD5 CRYPT_ARCH_ZIP, // ZIP archive
Fixed errors reported in crash logs.
Updated documentation.
The update will be available through the LiveUpdate system.
Fixed errors reported in crash logs.
Updated documentation.The update will be available through the LiveUpdate system.