English Русский 中文 Español Deutsch Português
Skypeを用いて、エキスパートアドバイザーからメッセージを送る方法

Skypeを用いて、エキスパートアドバイザーからメッセージを送る方法

MetaTrader 4 | 16 3月 2016, 09:25
560 0
Alexey Koshevoy
Alexey Koshevoy

はじめに

Skypeは、インターネットで電話やチャット機能を提供する通信プログラムです。この種類の他のプログラムと比べて、Skypeの一つの重要な利点は、実際のモバイルネットワークオペレーターへのゲートウェイであるということです。実際の携帯に電話したり、SMSを送るなどできます。携帯電話バージョンのSkypeもあります。プログラムで普通のメッセージを送ることは無料なので節約することができます。基本的に、携帯電話はオペレーティングシステム下で作動します。必要であればすべてモバイルでも可能です。それは最近たくさんの人々が利用している機会でもあります。


なぜ、そして誰がこれを必要とするのでしょうか?

トレーダーはトレーディングターミナルの前で常に座って、どのようにトレーディングが実行されているかを関しすることが¥はできません。しかし、特定の瞬間にマーケットの状態やエキスパートアドバイザーのアクションに関してトレーダーに通知してくれるシグナルを得ることができることは便利です。このような情報は携帯電話で取得すべきではないでしょうか?


どのような情報が便利でしょう?

モバイル電話のメッセージを用いて得られる情報は二つのグループに分けられます:

  1. 何にも影響を与えないログファイル内の現在のデータ:
  2. 収入に関して、トレーダーに役にたつ情報。

現在のデータの例について考察していきます:

  • 注文状態. 注文がオープンされる時、どの方向で、どの額でストップがかけられ、クローズされる時、どのような理由で、損益はいくらかなど。
  • 様々なマーケットの状態. 例えば、インジケーターが特定のレベルに達した時や、トレンドが方向を変えた時.

役にたつ情報:

  • エラーレポート. すべてのプログラマは人であり、時折、エキスパートアドバイザーが不適切に動いた時不快な状況が発生します。どのようなエラーが発生したか、致命的な停止につながったか否かなどの条件について知ることは悪くありません。これは、もしエキスパートアドバイザーのロジックがエラーを検知できるのであれば、作動します。
  • エキスパートアドバイザーの実行状況例えば、EAが出張中毎時間実行状態に関してのメッセージを送信する方法でセットアップされているとします。期待されているメッセージが開始された時間にこないことが起こります。停電やインターネットの接続切れなどが発生することもあります。もしターミナルがあなたの自宅で動作するのであれば、真っ暗の中1週間待つ代わりに、原因を突き止め、設定するため配偶者や同僚に聞くことが妥当です。

これは記事に関連することですが、起こりうる事のリストはこの記事の範疇を超えます。すべてのトレーダーはどのような内容のメッセージを取得するか決定できます。重要なことは、この関数がとても便利だということです。

Skypeでのどのように動作するのか?

  • SMS

    このサービスはもちろん有料です。すべて普通に見えます:加入者の番号に電話し、メッセージを入力し、"Send"を押します。
  • 通常のメッセージ

    これは完全に無料です。ユーザーを選択し、メッセージを入力、"Send"を押します。

これをエキスパートアドバイザーからどのように行うのでしょうか?

これを行う二つの方法を見つけました。両方DLLを使用する必要があります:

  1. 前もってマクロファイルを用意する必要があります。そのファイルを立ち上げる際、キーボード、マウスの操作が妨害されます。したがって、その一連のアクションを起こし、SKypeを起動させ、SMSを見つけ、表示されるウィンドウの加入者の番号に通信し、エキスパートアドバイザーに入力されたテキストメッセージを貼り付けます。前もってその処理を練習することができます。関連するドキュメントで、標準のアプリとして立ち上げることのできるファイルを準備しました。マクロファイルを記録し、再生するたくさんのアプリケーションがありますが、この記事ではその特定の問題は扱いません。

    それから、以下の通りに動作するDLLを開発する必要があります。最初の処理は、エキスパートアドバイザーからテキストをクリップボードに貼り付けるます。その次に、事前に定義されたマクロファイルを立ち上げます。もしすべてセットアップされ、すべてのウィンドウやボタンが適切な位置に現れた場合、いかなる問題も発生せず、メッセージが送られます。

    しかし、これは少し恐ろしいものです。もし脳がそのようなものを発明すれば、より快適なソリューションを見つけるか、そのアイディアを捨てる必要があります。新しいアイディアを思いつきました:SkypeのAPIはあるのでしょうか?ウェブサイトにてAPIとActiveXインターフェースを見つけました。すばらしい!エキスパートアドバイザーからSkypeを扱う別の方法を考えてみましょう。
  2. 大半は同じです。加入者の番号と送信されるテキストがEAからDLLに渡され、Skype COMオブジェクトを通してメッセージを送信します。

2番目の方法の実現の仕方

DLL.から始めましょう。主なところとして、DLLのエキスパートアドバイザーとの連携準備を行うことがあります。まず、複数のエキスパートアドバイザーから呼び出される際に動作するライブラリを記述します。不幸にも関数を書き、よび出すだけでは不十分です。ActiveXを使用しているので、そのための特別なスレッドを作成する必要があります。Mutex関数のための標準並列化ツールは役に立ちません。発見できないクラッシュがあります。なので、カスタムメッセージシステムを通して数回の呼び出しを実現します。

DLLソースコード

#include "stdafx.h"
 
#pragma once
// Allow use of features specific to Windows XP or later. 
#ifndef WINVER
// Change this to the appropriate value to target other versions of Windows.
#define WINVER 0x0501      
#endif
// Exclude rarely-used stuff from Windows headers 
#define WIN32_LEAN_AND_MEAN
 
// Include Skype4COM.dll, preliminarily downloaded 
// from the Skype developers website – http://developers.skype.com/
#import "Skype4COM.dll" rename("CreateEvent","CreatePluginEvent"), 
                        rename("SendMessage","SendChatMessage")
 

#define MT4_EXPFUNC __declspec(dllexport)
 
// Declare message codes for our functions.
#define WM_PROC_SENDSKYPESMS WM_USER + 01
#define WM_PROC_SENDSKYPEMESSAGE WM_USER + 02
 
// Variables for the thread to be used for 
// sending messages
HANDLE hUserThread;
DWORD ThreadId;
 
// Structures to store parameters of functions
// SendSkypeSMS
struct fcpSendSkypeSMS
  {
    int ExitCode;
    char * UserNum;
    char * Message;
  };
 
// SendSkypeMessage
struct fcpSendSkypeMessage
  {
    int ExitCode;
    char * UserName;
    char * Message;
  };
//+------------------------------------------------------------------+
//| Thread function                                                  |
//+------------------------------------------------------------------+
DWORD WINAPI ThreadProc(LPVOID lpParameter)
  {
    MSG msg;
    HANDLE hEvent;
  
    while(true)
      {
        if(PostThreadMessage(GetCurrentThreadId(), WM_USER, 0, 0))
            break;
      };
    // Initialize COM
    CoInitialize(NULL);
    while(GetMessage(&msg, 0, 0, 0))
      {
        if(msg.message == WM_QUIT)
          {
            break;
          }
        // Message processor WM_PROC_SENDSKYPESMS
        else 
            if(msg.message == WM_PROC_SENDSKYPESMS)
              {
                fcpSendSkypeSMS* fcp = (fcpSendSkypeSMS*)msg.wParam;
                hEvent = (HANDLE)msg.lParam;
                try
                  {
                    // Initialize Skype 
                    SKYPE4COMLib::ISkypePtr pSkype(__uuidof(SKYPE4COMLib::Skype));
                    // Connect to Skype. 6 is the protocol version
                    HRESULT hr=pSkype->Attach(6,VARIANT_TRUE);
                    // If everything is ok, start sending the message
                    if(!FAILED(hr))
                      {
                        try
                          {
                            fcp->ExitCode = 1;
                            // Try to send an SMS
                            pSkype->SendSms(fcp->UserNum,fcp->Message,"");
                          }
                        catch(...)
                          {
                            fcp->ExitCode=-1;
                          }
                      }
                    // Deinitialize Skype
                    pSkype = NULL;
                  }
                catch(...)
                  {
                    //Error is processed here
                  }
                // Set the event
                SetEvent(hEvent);
              }
            // Message processor WM_PROC_SENDSKYPEMESSAGE
            else 
                if(msg.message == WM_PROC_SENDSKYPEMESSAGE)
                  {
                    fcpSendSkypeMessage* fcp = 
                                   (fcpSendSkypeMessage*)msg.wParam;
                    hEvent = (HANDLE)msg.lParam;
        
                    try
                      {
                        // Initialize Skype 
                        SKYPE4COMLib::ISkypePtr pSkype(__uuidof
                                              (SKYPE4COMLib::Skype));
                        // Connect to Skype. 6 is the protocol version
                        HRESULT hr=pSkype->Attach(6,VARIANT_TRUE);
                        // If everything is ok, start sending the message
                        if(!FAILED(hr))
                          {
                            try
                              {
                                fcp->ExitCode = 1;
                                // Try to send the message
                                pSkype->SendChatMessage(fcp->UserName,
                                                        fcp->Message);
                              }
                            catch(...)
                              {
                                fcp->ExitCode=-1;
                                MessageBeep(0);
                              }
                          }
                        // Deinitialize Skype
                        pSkype = NULL;
                      }
                    catch(...)
                      {
                        //Error is processed here
                      }
  
                    // Set the event
                    SetEvent(hEvent);
                  }
              };
            // Deinitialize COM
            CoUninitialize();
            return 0;
          }
 
//DLL Initialization
//+------------------------------------------------------------------+
//| DLL entry                                                        |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,
                      LPVOID lpReserved)
  {
    if(ul_reason_for_call == DLL_PROCESS_ATTACH)
      {
        // Create a thread and attach the processor procedure address to it
        hUserThread = CreateThread(NULL, NULL, ThreadProc, NULL, 0, &ThreadId);
        if(!hUserThread)
          {
            // Error processing if the thread is not created
          };
      }
    else 
        if(ul_reason_for_call == DLL_PROCESS_DETACH)
          {
            // Delete the thread when exiting the library
            CloseHandle(hUserThread);
          }
    return(TRUE);
  }
 
MT4_EXPFUNC bool __stdcall SendSkypeSMS(int &ExCode,char* sUserNum,
                                        char* sMessage)
  {
    //Declare the structure of function parameters
    fcpSendSkypeSMS* fcp;
    //Declare an event
    HANDLE hEvent;
    //The result of function operation by default is false
    bool Result = false;
 
    // Allocate a password for the structure and initialize it
    fcp = new fcpSendSkypeSMS();
    memset(fcp, 0, sizeof(fcpSendSkypeSMS));
 
    // Fill out the structure
    //By default, the code of the function working end is an error.
    fcp->ExitCode = -1;
    fcp->UserNum = sUserNum;
    fcp->Message = sMessage;
 
    // Create an event
    hEvent = CreateEvent(NULL,FALSE,FALSE, NULL);
    // Call event WM_PROC_SENDSKYPESMS, pass  the data structure address 
    // to processing procedure 
    PostThreadMessage(ThreadId, WM_PROC_SENDSKYPESMS, (WPARAM)fcp,
                      (LPARAM)hEvent);
    if(WAIT_OBJECT_0 == WaitForSingleObject(hEvent,INFINITE))
      {
        
        Result = true;
      }
    else
      {
        // If there was an error at message processing, the function will 
        // return false
        return(Result);
      };
    // Assign the function processing code to the variable
    ExCode = fcp->ExitCode;
    if(ExCode == -1)
        Result = false;
    // Free memory and variables and exit
    delete fcp;
    CloseHandle(hEvent);
    return(Result);
  }
 
MT4_EXPFUNC bool __stdcall SendSkypeMessage(int &ExCode,char* sUserName,
                                            char* sMessage)
  {
    //Declare the structure of function parameters
 fcpSendSkypeMessage* fcp;
    //Declare an event
    HANDLE hEvent;
    //The result of function operation by default is false
    bool Result = false;
 
    // Allocate memory for the structure and initialize it
    fcp = new fcpSendSkypeMessage();
    memset(fcp, 0, sizeof(fcpSendSkypeMessage));
 
    // Fill out the structure
    //By default, the code of the function working end is an error.
    fcp->ExitCode = -1;
    fcp->UserName = sUserName;
    fcp->Message = sMessage;
 
    // Create an event
    hEvent = CreateEvent(NULL, FALSE,FALSE, NULL);
    // Call the event WM_PROC_SENDSKYPESMS, pass the data structure address 
    // to processing procedure
    PostThreadMessage(ThreadId, WM_PROC_SENDSKYPEMESSAGE, (WPARAM)fcp,
                      (LPARAM)hEvent);
    if(WAIT_OBJECT_0 == WaitForSingleObject(hEvent, INFINITE))
      {
        Result = true;
      }
    else
      {
        // If there was an error at message processing, the function will 
        // return false
        return(Result);
      };
    // Assign the function processing code to the variable
    ExCode = fcp->ExitCode;
    if(ExCode == -1)
        Result = false;
    // Free memory and variables and exit
    delete fcp;
    CloseHandle(hEvent);
    return(Result);
  }

File DEF

LIBRARY SkypeLib
 
EXPORTS SendSkypeSMS
        SendSkypeMessage

テストされる必要のあるエキスパートアドバイザー

//+------------------------------------------------------------------+
//|                                              SkypeTestExpert.mq4 |
//|                               Copyright © 2007, Alexey Koshevoy. |
//+------------------------------------------------------------------+
// Import functions
#import "SkypeLib.dll"
   bool SendSkypeSMS(int &ExCode[], string Num,string Message);
   bool SendSkypeMessage(int &ExCode[], string User, string Message);
#import
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   int ExCode[1];
   Alert("Send message...");
   Alert(SendSkypeMessage(ExCode, "skype.account.name", "Skype message test"));
   if(ExCode[0] == -1)
       Alert("Error sending the message");
   else 
       Alert("Message sent");
   Alert("Send SMS...");
   Alert(SendSkypeSMS(ExCode, "+1234567890", "Skype sms test"));
   if(ExCode[0] == -1)
       Alert("Error sending the SMS");
   else
       Alert("SMS sent");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   return(0);
  }
//+------------------------------------------------------------------+

そのEAはとてもシンプルで、主な目的は、SMSやメッセージをコーディングしたDLLで送信することです。初期化関数で動作し、週末にテストできます。

Skypeインストール

Skypeは、http://www.skype.com/でダウンロードできます。古いバージョンはCOMインターフェースをサポートせず、APIしか持たないので、最初バージョンをインストールすることを勧めます。しかし、APIはSMSの送信をサポートしていません。

Skypeはすでにインストールされています。それではCOMライブラリをダウンロードする必要があります。https://developer.skype.com/にてダウンロード可能です。SMS送信のために使用されるアカウントの量をチェックしてください。もし十分なお金がなければ、インターネットで追加できます。アカウントで課金なくSMSを送ることはできまsねんが、普通のメッセージは問題なく送ることができます。


Skype APIへのターミナルのアクセスのために登録されなければなりません。APIを扱うことができるか、メニュー「Tools->Options->Privacy->Manage other programs access to Skype」からチェックすることができます。おおよそこのような形になるはずです:




ターミナルは最初にライブラリを用いる際に登録されます。手動ではできません。そのため、ライブラリが最初にインストールされる際、SKype APIを用いる許可を確認するためにメッセージが送信されるのを待つ必要があります。Skypeは以下のダイアログボックスを表示させます:




確認の後、システムは自動モードにて作動し始めます。


SkypeLibのインストール

SkypeLib.dllというライブラリをインストールするために、ターミナルディレクトリのエキスパート/ライブラリフォルダにコピーする必要があります。Skype4COM.dllというライブラリもこのフォルダにコピーされなければなりません。DLLを扱うことができるようにターミナルをセットアップすます。以下のようにEAを貼り付ける際、"Safety"セクションの"Allow DLL imports"フィールドをチェックしてください。



やっとそのライブラリを用いることができます。

いくつかの重要な詳細

テストと実装の経験を得た後、私はなんらかの「微妙さ」にきづきました。例えば、もしアカウントに十分なお金があり、存在しない番号にSMSを送信し、エラーが報告されないばあお、その関数はうまく作動している一方、メッセージのステータスは「送信中...」になっているとします。このために、関数のインプットは明確にセットアップすることが重要です。また、Skypeバージョン3か0(最新版)を使用することもとても重要です。.

COMオブジェクトが初期化されず、メッセージが送信されないことはまれに発生します。これはSkypeの再インストールでのみ解決されます。外部インターフェースは比較的新しく、バグがあり、そのような面倒なことが起こります。知っている限り二回発生しました。最新バージョンはもうすこし安定していることを願いましょう。

いくつかの追加ライブラリはSkypeLib.dllの作動のために必要であることに注意してください。. 問題は、特にVisual Studio 2005の最初のサービスパックがリリースされた後に重大になりました。この問題を解決するベストな方法はセットアップファイルを作成することです。すべての必要なライブラリは自動的にそれに含まれます。File Skype4COM. dllもそこに含まれます。

記事に添付されているファイル

  • SkypeLib.dll - そのライブラリはVisual C++ 6.0でコンパイルされています。Skype4COM.dll以外の追加ファイルは必要としません。
  • SkypeLib.zip - そのライブラリのソースコード
  • SkypeExample.mq4 - テストされるライブラリのためのエキスパートアドバイザー

利点と欠点

以下の欠点がSkype SMSを使用した際に発見されます。

  • SMSはいくらかのお金がかかります。
  • 自分自身にメッセージを送信することはできず、メッセージを取得するために別のSkypeアカウントが必要です。
  • あなたの携帯がSkypeの携帯版をサポートしている必要があります。もしコンピューターがメッセージを取得するために使用されれば、この欠点は目立たなくなります。

この方法は以下のメリットがあります。

  • リアルタイムモードのシグナル
  • 現在何にも取り替えられない関数これは利点でもなんでもありません。ただの事実です。

まとめ

SMSや標準メッセージをSkypeを通して送信する方法を学びました。完全に便利ではありませんが、欠かすことのできないインタフェースを取得し、ターミナルの現在の状態を知ることができます。次はなんでしょうか?Skypeは送信も受信メッセージも受け付けているので...

MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/1454

添付されたファイル |
SkypeExample.mq4 (0.71 KB)
SkypeLib.dll (56 KB)
SkypeLib.zip (2.36 KB)
デイトレーディングの時間変換の原則 デイトレーディングの時間変換の原則
この記事は、価格フローを取得するためのオペレーション時間のコンセプトについて記載しています。この時間変換を考慮し、変更される移動平均のコードも含んでいます。
テスターでのブレークポイント:それは可能です! テスターでのブレークポイント:それは可能です!
この記事では、デバッグ情報が表示され、テスターで通過された際のブレークポイントエミュレーションを扱います。
ニューラルネットワークを利用した価格予測 ニューラルネットワークを利用した価格予測
数多くのトレーダーがニューラルネットワークを話題にしますが、それは何なのか、何ができるのか、を知る人はほとんどいません。本稿では、人工知能の世界に少し光を当てます。そしてネットワーク用のデータを正しく準備する方法を説明します。また、プログラム Matlab を用いて予測例を見ていきます。
RSS フィードによるトレードシグナルの送信 RSS フィードによるトレードシグナルの送信
みなさんのコミュニティのメンバーと今すぐコミュニケーションをする有名な方法である RSS FEEDS として、トレードシグナルを送信する方法は私のアイデアです。