MQL5でICQを用いたExpert Advisorの連携

Andriy Voitenko | 5 10月, 2015

はじめに

ICQ はテキストメッセージの即時交換の統合されたサービスで、それはOSCAR プトロコルを使用しています。トレーダーにとっては、For a trader, ICQ は、コントロールパネル同様タイムリーな情報を表示する端末のようなものです。本稿では Expert Advisor内で最低限の関数を使用し、ICQクライアントを実装する方法例を示します。

IcqMod プロジェクトの原稿は公開されたオリジナルコードを含み、本稿の基礎として使用され、処理されています。ICQ サーバーとの交換プロトコルはDLL モジュール icq_mql5.dllに実装されています。それはC++ 言語で書かれ、 Windows ライブラリ 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  )

実際には、このストラクチャにおいて接続状況を分析するためには、変数 status を使用します。これには以下の値を仮定することができます。

定数名 内容
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 を使用して間的に動作するために、iCOscarClient クラスが作成されました。上述の基本関数以外に、一定の時間間隔後自動的にサーバーに接続する(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 は Expert Advisor動作の証明です。それにより ICQ クライアントとテキストメッセージの交換が可能となります。

図1 MetaTrader5 と ICQ2Go 間のテキストメッセージ

図1 MetaTrader5 と ICQ2Go 間のテキストメッセージ


機能構築

現実のアプリケーションに近づけて、タスクを複雑化します。たとえば、携帯電話やインターネットに接続されたその他のOCを使用して Expert Advisorの動作を管理し遠隔で必要な情報を取得する必要があるとします。そのためには、将来のExpert Advisorを操作するコマンドを一式書きます。また、アドバイザーに受け取るコマンドをデコードするために説明する関数を補います。

すべてのコマンドに共通のフォーマットは以下です。

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

どこに?- コマンド読み出しのシンボルです !- 処理書き込みのシンボルです。

下記の表に記載されるコマンドのリスト:

help 読み出し シンタックスとコマンドリストの参照表示
info 読み出し アカウント概略のデータ表示
symb 読み出し 現在通貨ペアのマーケット価格
ords 読み出し/書き込み オープンな注文の管理
param 読み出し/書き込み Expert Advisorパラメータの管理
close 記録 Expert Advisor動作停止と端末終了
shdwn 記録 PCのシャットダウン

このコマンド一式を実装するExpert Advisorはファイル icq_power.mq5 にあります。

図2は Expert Advisorの動作を明確に表しています。コマンドはインストールされた ICQ クライアント(図2a)を伴いCCP から受け取られます。また、同様にICQとの連携を実装する WAP (図2b)からも受け取られます。第二の選択肢は携帯電話で、ICQ ソフトウェアを検索、インストール、構成したくない方に好まれる方法です。

PDA向けICQクライアントを用いたExpert Advisorとの連携 wap.ebuddy.com wapサイトからのExpert Advisorへの連携

図2 ポケット PC向けICQクライアントを用いたアドバイザーとの連携 (図2a)、同様に wap.ebuddy.com wapサイト (図2b)からの連携

ビジュアル ICQ コンポーネント

本稿は手短にスクリプト icq_visual.mq5 について考察します。これは、コンポーネントの実装を行います。図3に外観を示しています。

図3 ビジュアル ICQ コンポーネント

図3 ビジュアル ICQ コンポーネント

コンポーネント形式は Windows window に似ており、ボタン、テキストボックス、テキストラベルなどのようなエレメントコントロール配列から構築されています。

便宜のために、フォームには、アカウントと連絡先リストを格納する統合されたコントロールエレメントを実装します。値は適切なナビゲーションボタンを使ってリストから選択されます。

ICQ 6.5形式のウィンドウを作成しするには、ボタンをイメージタグに置き換えます。図4に示されるのは、コンポーネントの外観で、 icq_visual_skin.mq5 スクリプトに実装されています。ご自身のコンポーネントをデザインされたい方にとっては、これはskin.bmp fileを作成し置き換えるだけで十分でしょう。それはウィンドウの見栄えに影響をあたえるものです。

図4 ICQ コンポーネントのカラーデザイン

図4 ICQ コンポーネントのカラーデザイン


おわりに

本稿は埋め込まれたプログラム言語を用いてMetaTrader 5 用ICQクライアントを実装するもっとも簡単な方法の一つを提示してきました。