MQL5でICQを用いたExpert Advisorの連携
はじめに
ICQ はテキストメッセージの即時交換の統合されたサービスで、それはOSCAR プトロコルを使用しています。トレーダーにとっては、For a trader, ICQ は、コントロールパネル同様タイムリーな情報を表示する端末のようなものです。本稿では Expert Advisor内で最低限の関数を使用し、ICQクライアントを実装する方法例を示します。
IcqMod プロジェクトの原稿は公開されたオリジナルコードを含み、本稿の基礎として使用され、処理されています。ICQ サーバーとの交換プロトコルはDLL モジュール icq_mql5.dllに実装されています。それはC++ 言語で書かれ、 Windows ライブラリ winsock2 のみ使用します。Visual Studio 2005 向けにコンパイルされたモジュールとソースコードは本稿に添付されています。
本クライアントの特徴的機能と制約:
- 同時動作クライアント最大数は理論的には無制限です。
- 受信メッセージの最大数は150 文字です。それ以上に長いメッセージはサポートされていません。
- Unicode をサポートしています。
- 直接連携のみサポートしています。プロキシサーバー (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 )
実際には、このストラクチャにおいて接続状況を分析するためには、変数 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 間のテキストメッセージ
機能構築
現実のアプリケーションに近づけて、タスクを複雑化します。たとえば、携帯電話やインターネットに接続されたその他の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 ソフトウェアを検索、インストール、構成したくない方に好まれる方法です。
図2 ポケット PC向けICQクライアントを用いたアドバイザーとの連携 (図2a)、同様に wap.ebuddy.com wapサイト (図2b)からの連携
ビジュアル ICQ コンポーネント
本稿は手短にスクリプト icq_visual.mq5 について考察します。これは、コンポーネントの実装を行います。図3に外観を示しています。
図3 ビジュアル ICQ コンポーネント
コンポーネント形式は Windows window に似ており、ボタン、テキストボックス、テキストラベルなどのようなエレメントコントロール配列から構築されています。
便宜のために、フォームには、アカウントと連絡先リストを格納する統合されたコントロールエレメントを実装します。値は適切なナビゲーションボタンを使ってリストから選択されます。
ICQ 6.5形式のウィンドウを作成しするには、ボタンをイメージタグに置き換えます。図4に示されるのは、コンポーネントの外観で、 icq_visual_skin.mq5 スクリプトに実装されています。ご自身のコンポーネントをデザインされたい方にとっては、これはskin.bmp fileを作成し置き換えるだけで十分でしょう。それはウィンドウの見栄えに影響をあたえるものです。
図4 ICQ コンポーネントのカラーデザイン
おわりに
本稿は埋め込まれたプログラム言語を用いてMetaTrader 5 用ICQクライアントを実装するもっとも簡単な方法の一つを提示してきました。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/64
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索