
Collegamento di Expert Advisor con ICQ in MQL5
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:
- il numero massimo di clienti che lavorano contemporaneamente è teoricamente illimitato.
- la dimensione massima di un messaggio in arrivo - 150 caratteri. La ricezione di messaggi più lunghi non è supportata.
- Supporto Unicode.
- supporta solo una connessione diretta. La connessione effettuata tramite un server proxy (HTTP / SOCK4 / SOCK5) non è supportata.
- i messaggi offline non vengono elaborati.
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 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 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 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.
Tradotto dal russo da MetaQuotes Ltd.
Articolo originale: https://www.mql5.com/ru/articles/64





- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso