English Русский 中文 Español Deutsch 日本語 Português Français Italiano Türkçe
MQL5에서 ICQ 와 Expert Advisor 사이의 연결

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

MetaTrader 5통합 | 5 7월 2021, 13:45
58 0
Andriy Voitenko
Andriy Voitenko

들어가며

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

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

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

  • 이론적으로 동시에 작동하는 클라이언트의 최대 수는 무제한입니다.
  • 수신 메세지의 최대 글자 수 - 150자 긴 메세지 수신은 지원되지 않음.
  • 유니코드 지원.
  • 오직 직접 연결만 지원. 프록시 서버 (HTTP / SOCK4 / SOCK5)를 통한 연결은 지원되지 않음.
  • 오프라인 메세지는 처리되지 않음.

라이브러리 함수 설명

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 클라이언트를 구현하는 가장 쉬운 방법 중 하나를 설명했습니다.


MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/64

파일 첨부됨 |
icq_mql5_doc.zip (406.44 KB)
icq_mql5.zip (98.31 KB)
MQL5으로 "스네이크" 게임 만들기 MQL5으로 "스네이크" 게임 만들기
본 문서에서는 "스네이크" 게임을 만드는 법에 대해서 설명하겠습니다. MQL5에서 게임 프로그래밍은 이벤트 핸들러 기능 덕분에 가능하게 되었다고 볼 수 있습니다. 객체 지향 프로그래밍이기에 이 프로세스가 크게 간소화됩니다. 이 문서에서는 이벤트 처리 기능, 표준 MQL5 라이브러리 클래스의 사용 예, 정기적 함수 호출에 대하여 살펴보겠습니다.
MQL5으로 거래용 능동 제어판 만들기 MQL5으로 거래용 능동 제어판 만들기
이 문서는 MQL5의 활성 제어 패널 개발 문제를 다룹니다. 인터페이스 요소는 이벤트 처리 메커니즘에 의해 관리됩니다. 또한 제어 요소 속성의 범용적인 설정 옵션을 사용할 수 있습니다. 활성 제어판을 사용하면 포지션을 다루거나, 시장 혹은 보류 중인 주문을 설정, 수정 및 삭제할 수 있습니다.
MQL4에서 MQL5로 인디케이터 넘기기 MQL4에서 MQL5로 인디케이터 넘기기
이 문서에서는 MQL4로 쓰인 가격 생성을 MQL5로 넘길때의 특이성에 대해 다뤄보겠습니다. MQL4에서 인디케이터 계산을 MQL5로 보다 쉽게 이전하기 위해선 mql4_2_mql5.mqh 라이브러리 함수를 추천드립니다. 기본적으로 활용법은 MACD, Stochastic 그리고 RSI 인디케이터 이전의 기초입니다.
문자 알림과 트레이드 리포트 생성 및 발간 문자 알림과 트레이드 리포트 생성 및 발간
트레이더라고해도 터미널 앞에서 수 시간씩 계속 앉아서 일할 능력이나 동기가 항상 유지되는 것은 아닙니다. 특히나 트레이딩 시스템의 적게건 많게건 표준화되었거나 시장 현황을 자동으로 판별할 수 있을때면 더더욱이죠. 본 문서는 매매 결과 리포트를 (Expert Advisor, 인디케이터 혹은 스크립트를 사용하여) HTML 파일로 생성하여 FTP를 통해 WWW 서버에 업로드하는 법을 다룹니다. 또한 문자를 통해 핸드폰에 매매 알림을 보내는 것 또한 다루겠습니다.