MQL5에서 ICQ 와 Expert Advisor 사이의 연결
들어가며
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간에 텍스트 메세지 보내기
허용량 처리
실전에 가깝게 약간 더 복잡하게 해 봅시다. 예를 들어 휴대폰이나 인터넷에 연결된 다른 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 구성 요소
구성 요소의 형태는 윈도우즈 창과 유사하며 버튼, 텍스트 상자 및 텍스트 레이블과 같은 제어 요소 어레이로 구성됩니다.
편의를 위해 계정 및 연락처 목록을 저장하기 위한 통합 제어 요소를 양식에 구현합니다. 목록에서 적절한 탐색 버튼을 사용하여 값을 선택합니다
ICQ 6.5 스타일로 창을 만들기 위해서는 버튼을 이미지 태그로 대체하면 됩니다. 4번 그림에서 icq_visual_skin.mq5 스크립트 안에 구현된 구성 요소의 겉모습을 확인할 수 있습니다. 스스로 구성 요소 디자인이 하고싶은분은 개발하시고 창의 디자인을 담당하는 skin.bmp 파일을 대체시키면 됩니다.
4번 그림. 시각적 ICQ 구성 요소의 색상 디자인
마치며
지금까지 이 문서에서는 내장 프로그래밍 언어를 사용하여 MetaTrader 5용 ICQ 클라이언트를 구현하는 가장 쉬운 방법 중 하나를 설명했습니다.
MetaQuotes 소프트웨어 사를 통해 러시아어가 번역됨.
원본 기고글: https://www.mql5.com/ru/articles/64