
Expert Advisor'ın MQL5'te ICQ ile Bağlantısı
Giriş
ICQ, OSCAR protokolünü kullanan bir çevrimdışı mod ile metin mesajlarının anında değiş tokuşunun merkezi bir hizmetidir. Bir yatırımcı için ICQ, bir kontrol panelinin yanı sıra bilgileri zamanında görüntüleyen bir terminal görevi görebilir. Bu makalede, bir Expert Advisor içinde minimum işlev kümesiyle bir ICQ istemcisinin nasıl uygulanacağına ilişkin bir örnek gösterilecektir.
Açık bir orijinal kod içeren IcqMod projesinin taslağı, makale için temel olarak kullanılmış ve işlenmiştir. ICQ sunucusuyla değiş tokuş protokolü, DLL modülünde icq_mql5.dll uygulanır. C++ ile yazılmış olup tek Windows kitaplığı olan winsock2'yi kullanır. Bu makaleye, Visual Studio 2005 için derlenmiş bir modül ve bir kaynak kodu eklenmiştir.
Bu istemcinin uygulanmasının ayırt edici özellikleri ve sınırlamaları şu şekildedir:
- Aynı anda çalışan maksimum istemci sayısı teorik olarak sınırsızdır.
- Gelen mesajların maksimum boyutu 150 karakterdir. Daha uzun mesajların alınması desteklenmez.
- Unicode desteği.
- Yalnızca doğrudan bağlantıyı destekler. Bir proxy sunucusu (HTTP / SOCK4 / SOCK5) üzerinden yapılan bağlantı desteklenmez.
- Çevrimdışı mesajlar işlenmez.
Kitaplık işlevlerinin açıklaması
dll modülünün sabitlerinin ve işlevlerinin açıklamaları, icq_mql5.mqh yürütülebilir dosyasında yer alır.
ICQConnect işlevi, sunucuya bağlanmak için kullanılır:
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)
ICQConnect aracılığıyla dönüş değerinin açıklaması:
Sabitin Adı | Değeri | Açıklama |
---|---|---|
ICQ_CONNECT_STATUS_OK | 0xFFFFFFFF | Bağlantı kuruldu |
ICQ_CONNECT_STATUS_RECV_ERROR | 0xFFFFFFFE | Veri okuma hatası |
ICQ_CONNECT_STATUS_SEND_ERR | 0xFFFFFFFD | Veri gönderme hatası |
ICQ_CONNECT_STATUS_CONNECT_ERROR | 0xFFFFFFFC | sunucu bağlantı hatası |
ICQ_CONNECT_STATUS_AUTH_ERROR | 0xFFFFFFFB | Yetkilendirme hatası: Yanlış parola veya bağlantı sınırı aşıldı |
Bağlantı hakkında veri depolamak için yapı:
struct ICQ_CLIENT ( uchar status; // connection status code ushort sequence; // sequence meter uint sock; // socket number )
Uygulamada, bu yapıdaki bağlantı durumunun analizini yapmak için aşağıdaki değerleri alabilen değişkeninin durumunu kullanırız:
Sabitin Adı | Değeri | Açıklama |
---|---|---|
ICQ_CLIENT_STATUS_CONNECTED | 0x01 | Sunucuyla bağlantı kuruldu |
ICQ_CLIENT_STATUS_DISCONNECTED | 0x02 | Sunucuya bağlanılamadı |
Sunucuya sık sık bağlanma girişimleri, hesabınıza erişimin geçici olarak engellenmesine yol açabilir. Bu nedenle, sunucuya bağlantı denemeleri arasında bir zaman aralığı beklemek gerekir.
Önerilen zaman aşımı 20-30 saniyedir.
ICQClose işlevi, sunucuyla bağlantının sonlandırılmasını sağlar:
void ICQClose ( ICQ_CLIENT & cl // Variable for storing connection data)
ICQSendMsg işlevi, metin mesajları göndermek için kullanılır:
uint ICQSendMsg ( ICQ_CLIENT & cl, // Variable to store data about the connection. string uin, // Account number of the recipient string msg // Message)
Mesaj başarıyla gönderilirse dönüş değeri 0x01'e, gönderme hatası varsa 0x00'a eşittir.
ICQReadMsg işlevi gelen mesajları kontrol eder:
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)
Gelen mesaj varsa dönüş değeri 0x01'e, mesaj yoksa 0x00'a eşittir.
COscarClient sınıfı
MQL5'in nesne yönelimli ortamında ICQ ile çalışmanın rahat olması için COscarClient sınıfı geliştirilmiştir. Yukarıda açıklanan temel işlevlerin yanı sıra, belirli bir zaman aralığından sonra otomatik olarak sunucuya yeniden bağlanan bir mekanizma içerir (autocon = true olduğunda). Sınıfın açıklaması ekteki icq_mql5.mqh dosyasına dahil edilmiş olup aşağıda verilmiştir:
//+------------------------------------------------------------------+ 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 };
COscarClient tabanlarında Expert Advisor
COscarClient sınıfı kullanılarak ICQ ile çalışmak için gereken minimum Expert Advisor kodu, icq_demo.mq5 dosyasında ve aşağıda yer alır:
#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); } } //+------------------------------------------------------------------+
Şekil 1'de ICQ istemcisi ile metin mesajlarının değiş tokuşuna olanak tanıyan Expert Advisor'ın çalışmasının bir gösterimi sunulmuştur.
Şekil 1. MetaTrader 5 ve ICQ2Go arasındaki SMS mesajlaşması
Kapasite oluşturma
Görevi pratik uygulamaya yaklaştırarak karmaşıklaştıralım. Örneğin, bir cep telefonu veya internete bağlı başka bir bilgisayar kullanarak Expert Advisor'ımızın çalışmalarını yönetmemiz ve gerekli bilgileri uzaktan almamız gerekiyor. Bunu yapmak için, ilerde Expert Advisor'ı kontrol etmek için bir dizi komut tanımlıyoruz. Ayrıca, gelen komutların kodunu çözmek için advisor'ı bir ayrıştırma işleviyle tamamlayalım.
Tüm komutlar için ortak olan biçim aşağıdaki gibi olacaktır:
[? |!] [komut] [parametre] [değer] ,
burada? - Komut okuma sembolü, ! - Bir işlem yazma sembolü.
Aşağıdaki tabloda komutların listesi verilmiştir:
yardım | okuma | Sözdizimi referansını ve komutların listesini görüntüleme |
bilgi | okuma | Hesap hareketi verilerini görüntüleme |
sembol | okuma | Verilen para birimi çifti için piyasa fiyatı |
talimatlar | okuma/yazma | Açık talimatları yönetme |
parametre | okuma/yazma | Expert Advisor'ın parametrelerini yönetme |
kapat | kayıt | Expert Advisor'ın çalışmasını sonlandırma ve terminali kapatma |
kapatma | kayıt | Bilgisayarı kapatma |
Bu komut kümesinin işlenmesini uygulayan Expert Advisor, icq_power.mq5 dosyasında yer alır.
Şekil 2'de, Expert Advisor'ın çalışmasının açık bir gösterimi sunulmuştur. Komutlar, yüklü bir ICQ istemcisi ile CCP'den (Şekil 2a) ve ICQ ile çalışmayı uygulayan WAP sunucusu http://wap.ebuddy.com aracılığıyla alınır (Şekil 2b). İkinci seçenek, cep telefonlarında ICQ için yazılım arama, yükleme ve yapılandırma ile uğraşmak istemeyen kişiler için tercih edilebilir.
Şekil 2. Pocket PC için ICQ istemcisi (Şekil 2a) ve ayrıca wap.ebuddy.com wap sitesi (Şekil 2b) aracılığıyla bir advisor ile çalışma.
Görsel ICQ bileşeni
Bu bölümde, görsel görünümü Şekil 3'te gösterilen bir bileşeni uygulayan bir icq_visual.mq5 script dosyasının bir örneği kısaca ele alınacaktır.
Şekil 3. Görsel ICQ bileşeni
Bileşenin biçimi bir Windows penceresine benzer ve düğmeler, metin kutuları ve metin etiketleri gibi kontrol öğeleri dizilerinden oluşturulmuştur.
Kolaylık sağlamak için, biçimde hesapların ve ilgili kişilerin listesini depolamak için entegre bir kontrol öğesi uygulanır. Değerler, uygun gezinti düğmeleri kullanılarak listeden seçilir.
ICQ 6.5 stilinde bir pencere oluşturmak için düğmeleri resim etiketleriyle değiştirebiliriz. Şekil 4'te, bileşenin icq_visual_skin.mq5 script dosyasında uygulanan görsel görünümü gösterilmiştir. Kendi bileşen tasarımını oluşturmak isteyen kişilerin pencerenin görünümünden sorumlu olan skin.bmp dosyasını geliştirip değiştirmeleri yeterlidir.
Şekil 4. ICQ'nun görsel bileşeninin renk tasarımı
Sonuç
Bu makalede, gömülü bir programlama dili kullanılarak MetaTrader 5 için bir ICQ istemcisi uygulamanın en kolay yollarından biri gösterilmiştir.
MetaQuotes Ltd tarafından Rusçadan çevrilmiştir.
Orijinal makale: https://www.mql5.com/ru/articles/64





- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz