Connexion de l'Expert Advisor avec ICQ en MQL5
Andriy Voitenko | 16 novembre, 2021
Introduction
ICQ est un service centralisé d'échange instantané de messages texte, avec un mode hors ligne, qui utilise le protocole OSCAR. Pour un trader, ICQ peut servir de terminal, qui affiche des informations en temps opportun, ainsi qu'un panneau de commande. Cet article présentera un exemple d'implémentation d'un client ICQ, avec un minimum de fonctions, au sein d'un Expert Advisor.
Le brouillon du projet IcqMod, comportant un code original ouvert, a été utilisé et traité comme base de l'article. Le protocole d'échange avec le serveur ICQ est implémenté dans le module DLL icq_mql5.dll. Il est écrit en C++ et fait usage de la seule bibliothèque Windows winsock2. Un module compilé et un code source pour Visual Studio 2005 sont joints à cet article.
Caractéristiques distinctives et limites de la mise en œuvre de ce client :
- le nombre maximum de clients travaillant simultanément est théoriquement illimité.
- la taille maximale d'un message entrant - 150 caractères. La réception de messages plus longs n'est pas prise en charge.
- Prise en charge d'Unicode.
- ne prend en charge qu'une connexion directe. La connexion établie via un serveur proxy (HTTP / SOCK4 / SOCK5) n'est pas prise en charge.
- les messages hors ligne ne sont pas traités.
Description des fonctions de la bibliothèque
Les descriptions des constantes et des fonctions du module dll se trouvent dans le fichier exécutable icq_mql5.mqh.
La fonction ICQConnect permet de se connecter au serveur :
uint ICQConnect (ICQ_CLIENT & cl, // Variable for storing data about the connection string host, // Server name, such as login.icq.com ushort port, // Server port, eg 5190 string login, // Account Number (UIN) string pass // Account password for)
Description de la valeur de retour via ICQConnect :
Nom de Constant | Valeur | Description |
---|---|---|
ICQ_CONNECT_STATUS_OK | 0xFFFFFFFF | connexion établie |
ICQ_CONNECT_STATUS_RECV_ERROR | 0xFFFFFFFE | Erreur de lecture des données |
ICQ_CONNECT_STATUS_SEND_ERR | 0xFFFFFFFD | Erreur d'envoi de données |
ICQ_CONNECT_STATUS_CONNECT_ERROR | 0xFFFFFFFC | erreur de connexion au serveur |
ICQ_CONNECT_STATUS_AUTH_ERROR | 0xFFFFFFFB | Erreur d'autorisation : mot de passe incorrect ou dépassement de la limite de connexions |
Structure de stockage des données sur la connexion :
struct ICQ_CLIENT ( uchar status; // connection status code ushort sequence; // sequence meter uint sock; // socket number )
En pratique, pour effectuer une analyse de l'état de la connexion dans cette structure, on utilise la variable status, qui peut prendre les valeurs suivantes :
Nom de Constant | Valeur | Description |
---|---|---|
ICQ_CLIENT_STATUS_CONNECTED | 0x01 | Une connexion au serveur est établie |
ICQ_CLIENT_STATUS_DISCONNECTED | 0x02 | Échec de la connexion au serveur |
Des tentatives fréquentes de connexion au serveur peuvent entraîner un blocage temporaire de l'accès à votre compte. Il est donc nécessaire d'attendre un intervalle de temps entre les tentatives de connexion au serveur.
Le délai d'attente recommandé est de 20 à 30 secondes.
La fonction ICQClose sert à terminer la connexion au serveur :
void ICQClose ( ICQ_CLIENT & cl // Variable for storing connection data)
La fonction ICQSendMsg est utilisée pour envoyer des messages texte :
uint ICQSendMsg ( ICQ_CLIENT & cl, // Variable to store data about the connection. string uin, // Account number of the recipient string msg // Message)
La valeur de retour est égale à 0x01, si le message est envoyé avec succès, et égale à 0x00 s'il y a eu une erreur d'envoi.
La fonction ICQReadMsg vérifie les messages entrants :
uint ICQReadMsg ( ICQ_CLIENT & cl, // Variable for storing connection data string & Uin, // Account number of the sender string & Msg, // Message uint & Len // Number of received symbols in the message)
La valeur de retour est égale à 0x01 s'il y a un message entrant et égale à 0x00 s'il n'y a pas de message.
Classe COscarClient
Pour la commodité de travailler avec ICQ dans un environnement orienté -objet de MQL5, la classe COscarClient a été élaborée. Outre les fonctions de base décrites ci-dessus, il comporte un mécanisme qui, après un intervalle de temps spécifique, se reconnecte automatiquement au serveur (lorsque autocon = true). La description de la classe est incluse dans le fichier joint icq_mql5.mqh et est donnée ci-dessous :
//+------------------------------------------------------------------+ class COscarClient //+------------------------------------------------------------------+ { private: ICQ_CLIENT client; // storing connection data uint connect; // flag of status connection datetime timesave; // the time of last connection to the server datetime time_in; // the time of last reading of messages public: string uin; // buffer for the storage of the uin of the sender for a received message string msg; // buffer for the storage of text for a received message uint len; // the number of symbols in the received message string login; // number of the sender's account (UIN) string password; // password for UIN string server; // name of the server uint port; // network port uint timeout; // timeout tasks (in seconds) between attempts to reconnect to the server bool autocon; // automatic connection resume COscarClient(); // constructor for initialization of variable classes bool Connect(void); // establishment of a connection with a server void Disconnect(void); // breaking a connection with a server bool SendMessage(string UIN, string msg); // sending a message bool ReadMessage(string &UIN, string &msg, uint &len); // receiving a message };
Expert Advisor sur les bases d’ COscarClient
Le code Expert Advisor minimum nécessaire pour travailler avec ICQ à l'aide de la classe COscarClient se trouve dans le fichier icq_demo.mq5 et ci-dessous :
#include <icq_mql5.mqh> COscarClient client; //+------------------------------------------------------------------+ int OnInit() //+------------------------------------------------------------------+ { printf("Start ICQ Client"); client.login = "641848065"; //<- login client.password = "password"; //<- password client.server = "login.icq.com"; client.port = 5190; client.Connect(); return(0); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) //+------------------------------------------------------------------+ { client.Disconnect(); printf("Stop ICQ Client"); } //+------------------------------------------------------------------+ void OnTick() //+------------------------------------------------------------------+ { string text; static datetime time_out; MqlTick last_tick; // reading the messages while(client.ReadMessage(client.uin,client.msg,client.len)) printf("Receive: %s, %s, %u", client.uin, client.msg, client.len); // transmission of quotes every 30 seconds if((TimeCurrent()-time_out)>=30) { time_out = TimeCurrent(); SymbolInfoTick(Symbol(), last_tick); text = Symbol()+" BID:"+DoubleToString(last_tick.bid, Digits())+ " ASK:"+DoubleToString(last_tick.ask, Digits()); if (client.SendMessage("266690424", //<- number of the recipient text)) //<- message text printf("Send: " + text); } } //+------------------------------------------------------------------+
La figure 1. sert de démonstration du travail de l'Expert Advisor, qui permet l'échange de messages texte avec le client ICQ.
Figure 1. Messagerie texte entre MetaTrader 5 et ICQ2Go
Renforcement des capacités
Compliquons la tâche en la rapprochant de l'application pratique. Par exemple, nous devons gérer le travail de notre Expert Advisor, et obtenir les informations nécessaires à distance, à l'aide d'un téléphone portable ou d'un autre PC connecté à Internet. Pour se faire, nous décrivons un ensemble de commandes permettant de piloter le futur Expert Advisor. Complétons également le conseiller avec une fonction d'analyse pour décoder les commandes entrantes.
Le format, commun à toutes les commandes, sera le suivant :
[? |!] [commande] [paramètre] [valeur] ,
où? - Un symbole de lecture de commande ; ! - Un symbole d'écriture d'opération.
Une liste de commandes donnée dans le tableau ci-dessous :
aide | lecture | Affichage de référence de la syntaxe et de la liste des commandes |
info | lecture | Affichage des données du récapitulatif du compte |
symbole | lecture | Prix du marché pour une paire de devises donnée |
commandes | lecture /écriture | Gestion des commandes ouvertes |
param | lecture /écriture | gestion des paramètres de l'Expert Advisor |
Clôturer | enregistrer | Fin des travaux de l'Expert Advisor et fermeture du terminal |
shdwn | enregistrer | Arrêt du PC |
L'Expert Advisor, qui implémente le traitement de cet ensemble de commandes, se trouve dans le fichier icq_power.mq5 .
La figure 2 montre une démonstration claire du travail de l'Expert Advisor. Les commandes sont reçues depuis CCP avec un client ICQ installé (Figure 2a), ainsi que via le serveur WAP http://wap.ebuddy.com qui implémente le travail avec ICQ (Figure 2b). La deuxième option est préférable pour ceux qui ne souhaitent pas s’occuper de la recherche, l’installation et le configuration des logiciels pour ICQ sur leur téléphone mobile.
Figure 2. Travailler avec un conseiller via le client ICQ pour Pocket PC (Figure 2a), ainsi que via le site wap wap.ebuddy.com (Figure 2b).
Composant visuel ICQ
Cette section considère brièvement un exemple de script icq_visual.mq5 qui implémente un composant, dont l'apparence visuelle est illustrée en figure 3.
Figure 3. Composant visuel ICQ
La forme du composant ressemble à une fenêtre Windows et est construite à partir de tableaux d'éléments de contrôle, tels que des boutons, des zones de texte et des étiquettes de texte.
Par souci de commodité, un élément de contrôle intégré pour stocker une liste de comptes et de contacts est implémenté dans le formulaire. Les valeurs sont sélectionnées dans la liste à l'aide des boutons de navigation appropriés.
Pour créer une fenêtre dans le style d' ICQ 6.5, nous pouvons remplacer les boutons par des balises d'image. La figure 4 montre l'apparence visuelle du composant, implémentée dans le script icq_visual_skin.mq5. Pour ceux qui souhaitent créer leur propre design de composant, il suffit d’élaborer et de remplacer le fichier skin.bmp, qui est responsable de l'apparence de la fenêtre.
Figure 4. Couleur conception du composant visuel ICQ
Conclusion
Cet article montre l'un des moyens les plus simples d'implémenter un client ICQ pour MetaTrader 5 en utilisant les moyens d'un langage de programmation intégré.