Collegamento di Expert Advisor con ICQ in MQL5

Andriy Voitenko | 16 dicembre, 2021

Introduzione

ICQ è un servizio centralizzato di scambio istantaneo di messaggi di testo, con modalità offline, che utilizza il protocollo OSCAR. Per un trader, ICQ può fungere da terminale, che visualizza informazioni tempestive, nonché da pannello di controllo. Questo articolo mostrerà un esempio di come implementare un client ICQ, con un insieme minimo di funzioni, all'interno di un Expert Advisor.

La bozza del progetto IcqMod, contenente un codice originale aperto, è stata utilizzata ed elaborata come base per l'articolo. Il protocollo di scambio con il server ICQ è implementato nel modulo DLL icq_mql5.dll. È scritto in C++ e utilizza l'unica libreria Windows winsock2. Un modulo compilato e un codice sorgente per Visual Studio 2005 sono allegati a questo articolo.

Caratteristiche distintive e limitazioni dell'implementazione di questo client:

Descrizione delle funzioni della libreria

Le descrizioni delle costanti e delle funzioni del modulo dll si trovano nel file eseguibile icq_mql5.mqh.

La funzione ICQConnect viene utilizzata per connettersi al server:

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)

Descrizione del valore restituito tramite ICQConnect:

Nome della Costante
    Valore
Descrizione
 ICQ_CONNECT_STATUS_OK
0xFFFFFFFF  Connessione stabilita
 ICQ_CONNECT_STATUS_RECV_ERROR
0xFFFFFFFE
 Errore di lettura dei dati
 ICQ_CONNECT_STATUS_SEND_ERR
0xFFFFFFFD
 Errore di invio dei dati
 ICQ_CONNECT_STATUS_CONNECT_ERROR
0xFFFFFFFC
 errore di connessione al server
 ICQ_CONNECT_STATUS_AUTH_ERROR 0xFFFFFFFB  Errore di autorizzazione: password errata o superato il limite di connessioni

 

Struttura per la memorizzazione dei dati sulla connessione:

 struct  ICQ_CLIENT (
uchar  status;     // connection status code  
ushort  sequence;  // sequence meter  
uint  sock;        // socket number  )

 In pratica, per effettuare un'analisi dello stato della connessione in questa struttura, si utilizza la variabile status, che può assumere i seguenti valori:

Nome della Costante
Valore 
Descrizione
 ICQ_CLIENT_STATUS_CONNECTED 0x01  Viene stabilita una connessione al server
 ICQ_CLIENT_STATUS_DISCONNECTED
0x02  Connessione al server non riuscita

 

Tentativi frequenti di connessione al server possono portare a un blocco temporaneo dell'accesso al tuo account. Pertanto è necessario attendere un intervallo di tempo tra i tentativi di connessione al server.

Il timeout consigliato è di 20-30 secondi.

La funzione ICQClose serve per terminare la connessione al server:

 void  ICQClose (
ICQ_CLIENT & cl  // Variable for storing connection data)

La funzione ICQSendMsg viene utilizzata per inviare messaggi di testo:

 uint  ICQSendMsg (
ICQ_CLIENT & cl,  // Variable to store data about the connection.  
string  uin,        // Account number of the recipient  
string  msg         // Message)

Il valore restituito è uguale a 0x01, se il messaggio è stato inviato con successo, ed è uguale a 0x00 se si è verificato un errore di invio. 

La funzione ICQReadMsg controlla i messaggi in arrivo:

 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

Il valore restituito è uguale a 0x01 se c'è un messaggio in arrivo ed è uguale a 0x00 se non c'è nessun messaggio.

Classe COscarClient

Per la comodità di lavorare con ICQ in un ambiente orientato agli oggetti di MQL5, è stata sviluppata la classe COscarClient. Oltre alle funzioni di base sopra descritte, contiene un meccanismo che, dopo un determinato intervallo di tempo, si riconnette automaticamente al server (quando autocon = true). La descrizione della classe è contenuta nel file allegato icq_mql5.mqh ed è riportata di seguito: 

//+------------------------------------------------------------------+
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 sulle basi COscarClient

Il codice minimo Expert Advisor necessario per lavorare con ICQ utilizzando la classe COscarClient si trova nel file icq_demo.mq5 e sotto:

#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 Figura 1. serve come dimostrazione del lavoro dell'Expert Advisor, che consente lo scambio di messaggi di testo con il client ICQ.

Figura 1. Messaggi di testo tra MetaTrader5 e ICQ2Go

Figura 1. Messaggi di testo tra MetaTrader 5 e ICQ2Go

Sviluppo delle capacità

Complichiamo il compito avvicinandolo all'applicazione pratica. Ad esempio, dobbiamo gestire il lavoro del nostro Expert Advisor, e ottenere le informazioni necessarie da remoto, utilizzando un telefono cellulare o un altro PC connesso a Internet. Per fare ciò, descriviamo una serie di comandi per controllare il futuro Expert Advisor. Inoltre, completiamo l'advisor con una funzione di analisi per decodificare i comandi in arrivo.

Il formato, comune a tutti i comandi, sarà il seguente: 

[? |!] [comando] [parametro] [valore],

dove? - Un simbolo di lettura del comando; ! - Un simbolo di un'operazione di scrittura.

Un elenco di comandi forniti nella tabella seguente:

     
 aiuto  lettura  Visualizzazione del riferimento della sintassi e dell'elenco dei comandi
 info  lettura  Visualizzazione dei dati del riepilogo del conto
 symb  lettura  Prezzo di mercato per una determinata coppia di valute
 ordini  leggere/scrivere  Gestione degli ordini aperti
 param  leggere/scrivere  gestire i parametri di Expert Advisor
 close  disco  Fine dei lavori dell'Expert Advisor e chiusura del terminal
 shdwn  disco  Spegnimento del PC


L'Expert Advisor, che implementa l'elaborazione di questo insieme di comandi, si trova nel file icq_power.mq5 .

La Figura 2 mostra una chiara dimostrazione del lavoro dell'Expert Advisor. I comandi vengono ricevuti dal CCP con un client ICQ installato (Figura 2a), nonché tramite il server WAP http://wap.ebuddy.com che implementa il lavoro con ICQ (Figura 2b). La seconda opzione è preferibile per coloro che non desiderano occuparsi di ricerca, installazione e configurazione di software per ICQ sul proprio telefono cellulare.

  

Figura 2. Lavorare con un consulente tramite il client ICQ per Pocket PC (Figura 2a), nonché tramite il sito wap wap.ebuddy.com (Figura 2b).

Componente ICQ visivo

Questa sezione considererà brevemente un esempio di uno script icq_visual.mq5 che implementa un componente, il cui aspetto visivo è mostrato nella Figura 3.

Figura 3. Componente Visual ICQ

Figura 3. Componente ICQ visivo

La forma del componente è simile a una finestra di Windows ed è costituita da matrici di elementi di controllo, come pulsanti, caselle di testo ed etichette di testo.

Per comodità, nel modulo è implementato un elemento di controllo integrato per la memorizzazione di un elenco di account e contatti. I valori vengono selezionati dall'elenco mediante l'utilizzo di appositi pulsanti di navigazione.

Per creare una finestra nello stile di ICQ 6.5, possiamo sostituire i pulsanti con tag immagine. La Figura 4 mostra l'aspetto visivo del componente, implementato nello script icq_visual_skin.mq5. Per coloro che desiderano creare il proprio design dei componenti, è sufficiente sviluppare e sostituire il file skin.bmp, che è responsabile dell'aspetto della finestra.

Figura 4. Color design della componente visiva di ICQ

Figura 4. Color design della componente visiva ICQ

Conclusione

Questo articolo dimostra uno dei modi più semplici per implementare un client ICQ per MetaTrader 5 utilizzando i mezzi di un linguaggio di programmazione integrato.