MQL5에서 ICQ 와 Expert Advisor 사이의 연결

Andriy Voitenko | 5 7월, 2021

들어가며

ICQ는 OSCAR 프로토콜을 사용하는 오프라인 모드를 통해 문자 메시지를 즉시 교환하는 중앙 집중식 서비스입니다. 트레이더에게 ICQ는 터미널 역할을 할 수 있으며, 제어 패널뿐만 아니라 제 때 정보를 표시할 수 있습니다. 본 문서에서는 가능한 적은 함수만 가지고 ICQ 클라이언트를 Expert Advisor 내에서 구현하는 방법에 대한 예시를 보여드릴 것입니다.

오픈 오리지널 코드가 포함된 IcqMod 프로젝트의 초안이 본 문서의 기반으로 활용 및 처리되었습니다 ICQ 서버와의 교환 프로토콜은 icq_mql5.dll DLL 모듈에 구현되었습니다.. C++로 쓰였으며, 윈도우 라이브러리 winsock2을 이용합니다. Visual Studio 2005를 위한 컴파일 모듈 및 소스 코드가 이 문서에 첨부되어있습니다.

이 클라이언트의 구현 기능 및 제한 사항 구분:

라이브러리 함수 설명

dll 모듈의 상수 및 함수에 대한 설명은 실행 파일 icq_mql5.mqh에 있습니다.

서버 연결에는 ICQConnect 함수가 사용됩니다:

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을 통한 반환 값의 설명:

상수명
    값
설명
 ICQ_CONNECT_STATUS_OK
0xFFFFFFFF  연결 성공
 ICQ_CONNECT_STATUS_RECV_ERROR
0xFFFFFFFE
 데이터 읽기 에러
 ICQ_CONNECT_STATUS_SEND_ERR
0xFFFFFFFD
 데이터 송신 에러
 ICQ_CONNECT_STATUS_CONNECT_ERROR
0xFFFFFFFC
 서버 연결 에러
 ICQ_CONNECT_STATUS_AUTH_ERROR 0xFFFFFFFB  인증 에러: 올바르지 못한 비밀번호 혹은 연결 리밋 초과

 

연결에 대한 데이터를 저장하기 위한 구조:

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

 실제로 이 구조의 연결 상태를 분석하기 위해 다음 값을 추측할 수 있는 변수 상태를 사용합니다:

상수명
값 
설명
 ICQ_CLIENT_STATUS_CONNECTED 0x01  서버 연결 성공
 ICQ_CLIENT_STATUS_DISCONNECTED
0x02  서버 연결 실패

 

서버에 빈번하게 연결하려고 하면 계정에 대한 액세스가 일시적으로 차단될 수 있습니다. 따라서 서버에 연결 시도할 때엔 어느정도 시간차를 두는 것이 중요합니다.

20-30 초 정도를 추천드립니다.

ICQClose 함수를 통해 서버로의 연결을 중단시킬 수 있습니다:

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

ICQSendMsg 함수는 문자 메세지를 보내는데에 사용됩니다.

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

만약 메세지가 성공적으로 송신되었다면 반환 값은 0x01, 만약 송신 에러가 있었다면 반환 값은 0x00입니다. 

ICQReadMsg 함수는 수신된 메세지를 체크합니다:

 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

들어오는 메시지가 있으면 반환 값은 0x01이고 메시지가 없으면 0x00입니다.

COscarClient 클래스

MQL5의 객체 지향 환경에서 ICQ로 편리하게 작업할 수 있도록 COScarClient 클래스가 개발되었습니다. 위에서 설명한 기본 기능 외에도 특정 시간 후 서버에 자동으로 다시 연결되는 메커니즘이 포함되어 있습니다(autocon = true인 경우). 이 클래스에 대한 설명은 첨부파일 icq_mql5.mqh 에서 확인하실 수 있고, 아래에 있습니다: 

//+------------------------------------------------------------------+
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 기반 Expert Advisor

COscarClient 클래스를 이용하여 ICQ 대응 작업을 하기 위한 최소한의 Expert Advisor 코드는 icq_demo.mq5 파일 그리고 이 아래에 있습니다:

#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);
     }
  }
//+------------------------------------------------------------------+

1번 그림. ICQ 클라이언트와 문자 메시지를 교환할 수 있게 해주는 Expert Advisor를 시연중

1번 그림. MetaTrader5와 ICQ2Go간에 텍스트 메세지 보내기

1번 그림. MetaTrader5와 ICQ2Go간에 텍스트 메세지 보내기

허용량 처리

실전에 가깝게 약간 더 복잡하게 해 봅시다. 예를 들어 휴대폰이나 인터넷에 연결된 다른 PC를 사용하여 Expert Advisor의 작업을 관리하고 필요한 정보를 원격으로 얻어야 합니다. 이를 위해 향후 Expert Advisor를 제어하는 커맨드들에 대해 설명하겠습니다. 또한, 입력되는 커맨드들을 디코딩 할 수 있도록 파싱하는 함수도 Advisor에 탑재해봅시다.

모든 커맨드가 공유하는 양식은 다음과 같습니다: 

[? |!] [command] [parameter] [value] ,

? - 커맨드 읽기 심볼; ! - 작업 쓰기 심볼.

커맨드 목록은 아래 테이블에서 확인할 수 있습니다:

     
 help  읽기  신택스의 레퍼런스와 커맨드 리스트를 보여줍니다.
 info  읽기  계좌의 요약 데이터를 보여줍니다.
 symb  읽기  현 화폐쌍의 시장가를 보여줍니다
 ords  읽기/쓰기  개방 주문 관리
 param  읽기/쓰기  Expert Advisor 패러미터 관리
 close  record  Expert Advisor 작업 취소 및 터미널 닫기
 shdwn  record  PC 셧다운


이 커맨드들을 구현한 Expert Advisor는 icq_power.mq5 파일에서 찾아볼 수 있습니다.

2번 그림을 보시면 Expert Advisor 작업을 이해하기 쉽습니다. 커맨드들은 ICQ 클라이언트가 설치된 CCP(그림 2a)와 ICQ 작업을 구현하는 WAP 서버 http://wap.ebuddy.com를 통해 수신됩니다(그림 2b). 두 번째 옵션은 스마트폰에서 ICQ용 소프트웨어를 검색, 설치 및 구성하기를 원치 않는 사용자에게 적합합니다.

         

2번 그림. Pocket PC용 ICQ 클라이언트를 통해 Advisor 다루기 (그림 2a), wap.ebuddy.com WAP 웹사이트를 통해 Advisor를 다루기 (그림 2b).

시각적 ICQ 구성 요소

이 섹션에서는 3번 그림에서 보여지듯, 구성 요소를 구현하는 <b0 > icq_visual.mq5 스크립트의 예시를 간략히 살펴보겠습니다.

3번 그림. 시각적 ICQ 구성 요소

3번 그림. 시각적 ICQ 구성 요소

구성 요소의 형태는 윈도우즈 창과 유사하며 버튼, 텍스트 상자 및 텍스트 레이블과 같은 제어 요소 어레이로 구성됩니다.

편의를 위해 계정 및 연락처 목록을 저장하기 위한 통합 제어 요소를 양식에 구현합니다. 목록에서 적절한 탐색 버튼을 사용하여 값을 선택합니다

ICQ 6.5 스타일로 창을 만들기 위해서는 버튼을 이미지 태그로 대체하면 됩니다. 4번 그림에서 icq_visual_skin.mq5 스크립트 안에 구현된 구성 요소의 겉모습을 확인할 수 있습니다. 스스로 구성 요소 디자인이 하고싶은분은 개발하시고 창의 디자인을 담당하는 skin.bmp 파일을 대체시키면 됩니다.

4번 그림. 시각적 ICQ 구성 요소의 색상 디자인

4번 그림. 시각적 ICQ 구성 요소의 색상 디자인

마치며

지금까지 이 문서에서는 내장 프로그래밍 언어를 사용하여 MetaTrader 5용 ICQ 클라이언트를 구현하는 가장 쉬운 방법 중 하나를 설명했습니다.