ネットワーク関数


SocketCreate

指定されたフラグを使ってソケットを作成し、そのハンドルを返します。

int  SocketCreate(
  uint     flags         // フラグ
  );

パラメータ

フラグ

[in]  ソケットを扱うモードを定義するフラグの組み合わせです。現在サポートされているフラグは、「SOCKET_DEFAULT」1つだけです。

戻り値

ソケット作成が成功した場合はハンドル、それ以外の場合はINVALID_HANDLE

注意事項

未使用のソケットからコンピュータのメモリを解放するにはSocketCloseを呼び出します。

1つのMQL5プログラムから最大128個のソケットを作成できます。この上限が達すると、エラー5271 (ERR_NETSOCKET_TOO_MANY_OPENED)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

 

SocketClose

ソケットを閉じます。

bool  SocketClose(
  const int socket     // ソケットのハンドル
  );

パラメータ

socket

[in]  閉じられるソケットのハンドルです。ハンドルはSocketCreate関数で戻されます。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

戻り値

成功の場合はtrue、それ以外の場合はfalse

注意事項

ソケットに対してSocketConnectを介した接続が以前に作成されている場合は、停止されます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

 

SocketConnect

タイムアウト管理付きでサーバに接続します。

bool  SocketConnect(
  int           socket,             // ソケット
  const string server,               // 接続アドレス
  uint         port,                 // 接続ポート
  uint         timeout_receive_ms   // 接続タイムアウト
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

server

[in]  接続するサーバのドメイン名またはIPアドレス

port

[in]  接続ポート番号

timeout_receive_ms

[in]  ミリ秒単位の接続タイムアウトです。その時間内に接続が確立されないと、試行は中止されます。

戻り値

接続が成功の場合は true、それ以外の場合は false

注意事項

接続アドレスは、クライアント端末側(ツール、オプション、エキスパートアドバイザー)で許可されているアドレスのリストに追加する必要があります。

接続が失敗すると、5272 (ERR_NETSOCKET_CANNOT_CONNECT)が_LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

 

SocketIsConnected

ソケットが現在接続されているかどうかを確認します。

bool  SocketIsConnected(
  const int socket     // ソケットのハンドル
  );

パラメータ

socket

[in] SocketCreate()関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。

戻り値

ソケットが接続された場合は true、それ以外の場合は false

注意事項

SocketIsConnected()関数によって、現在のソケット接続状態を確認することができます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

参照

SocketConnect、SocketIsWritable、SocketCreate、 SocketClose

SocketIsReadable

ソケットから読み込めるバイト数を取得します。

uint  SocketIsReadable(
  const int socket     // ソケットのハンドル
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。

戻り値

計算できるバイト数(エラーの場合は0)

注意事項

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

SocketReadを呼び出す前に、ソケットが読み取り用のデータを備えているかどうかを確認してください。さもないと、 SocketRead 関数はデータがない場合にtimeout_ms間データを待つので、プログラムの実行が遅れます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                       &nbnbsp;          |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

 

SocketIsWritable

現在の時点でデータをソケットに書き込めるかどうかを確認します。

bool  SocketIsWritable(
  const int socket     // ソケットのハンドル
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

戻り値

書き込みが可能の場合はtrue、それ以外の場合はfalse

注意事項

この関数を使用すると、ソケットにデータを書き込めるかどうかを確認できます。

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

 

SocketTimeouts

ソケットシステムオブジェクトのデータを送受信するためのタイムアウトを設定します。

bool  SocketTimeouts(
  int           socket,             // ソケット
  uint         timeout_send_ms,     // データ送信のタイムアウト
  uint         timeout_receive_ms   // データ受信のタイムアウト
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

timeout_send_ms

[in] ミリ秒単位のデータ送信タイムアウト

timeout_receive_ms

[in] ミリ秒単位のデータ受信タイムアウト<.

戻り値

成功の場合はtrue、それ以外の場合はfalse

注意事項

システムオブジェクトのタイムアウトをSocketReadで設定されたデータ受信タイムアウトと混乱しないでください。SocketTimeoutはオペレーティングシステムのソケットオブジェクトに対して1回タイムアウトを設定します。これらのタイムアウトは、このソケットを介してデータを読み書きするためのすべての関数に適用されます。SocketReadでは、タイムアウトは特定のデータ読み取り操作に対して設定されます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

SocketRead

ソケットからデータを読みます。

int  SocketRead(
  int           socket,             // ソケット
  uchar&       buffer[],             // ソケットからデータを読むためのバッファ
  uint         buffer_maxlen,       // 読まれるバイト数
  uint         timeout_ms           // 読み込みのタイムアウト
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。

buffer

[out] データが読まれるuchar型配列への参照。動的配列サイズは、読み取られたバイト数だけ増えます。配列サイズはINT_MAX (2147483647)を超えることはできません。

buffer_maxlen

[in] buffer[]配列に読まれるバイト数。配列に収まらないデータはソケットに残り、次のSocketReadの呼び出しで受信できます。buffer_maxlenはINT_MAX (2147483647)を超えることはできません。

timeout_ms

[in] ミリ秒単位の読み込みタイムアウトです。この時間内にデータが取得されない場合、試行は中止され、関数は-1を返します。

戻り値

成功の場合、読まれたバイト数。エラーの場合は -1 。

注意事項

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

データ読み込みエラーの場合は、エラー5273 (ERR_NETSOCKET_IO_ERROR)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

参照

SocketTimeouts、MathSwap

SocketSend

ソケットにデータを書きます。

int  SocketSend(
  int           socket,             // ソケット
  const uchar& buffer[],             // データバッファ
  uint         buffer_len           // バッファサイズ
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

buffer

[in] データがソケットに送信されるuchar型配列への参照

buffer_len

[in] 「buffer」配列サイズ

戻り値

成功の場合、ソケットに書かれたバイト数。エラーの場合は -1 。

注意事項

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

データ書き込みエラーの場合は、エラー5273 (ERR_NETSOCKET_IO_ERROR)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

参照

SocketTimeouts、MathSwap、StringToCharArray

 

SocketTlsHandshake

TLS Handshakeプロトコルを介して指定されたホストへの安全なTLS(SSL)接続を開始します。ハンドシェイク中、クライアントとサーバは接続パラメータ、つまり適用されるプロトコルのバージョンとデータの暗号化方式について合意します。

bool  SocketTlsHandshake(
  int           socket,             // ソケット
  const string host                 // ホストアドレス
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

host

[in] 安全な接続が確立されているホストのアドレス

戻り値

成功の場合はtrue、それ以外の場合はfalse

注意事項

安全な接続の前に、プログラムはSocketConnectを使用してホストとの標準TCP接続を確立する必要があります。

安全な接続が失敗すると、エラー5274 (ERR_NETSOCKET_HANDSHAKE_FAILED)が _LastErrorに書かれます。

ポート443に接続する場合はこの関数を呼び出す必要はありません。これは、安全なTLS(SSL)接続に使用される標準のTCPポートです。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

 

SocketTlsCertificate

ネットワーク接続を保護するために使用される証明書に関するデータを取得します。

int  SocketTlsCertificate(
  int           socket,             // ソケット
  string&       subject,             // 証明書の所有者
  string&       issuer,               // 証明書の発行者
  string&       serial,             // 証明書のシリアル番号
  string&       thumbprint,           // 証明書プリント
  datetime&     expiration           // 証明書期限
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

subject

[in] 証明書所有者名。Subjectフィールドに対応します。

issuer

[in] 証明書所有者名。Issuerフィールドに対応します。

serial

[in] 証明書のシリアル番号。SerialNumberフィールドに対応します。

thumbprint

[in] 証明書プリント。証明書ファイル全体(発行者の署名を含むすべてのフィールド)のSHA-1ハッシュに対応します。

expiration

[in] datetime形式での証明書の有効期限。

戻り値

成功の場合はtrue、それ以外の場合はfalse

注意事項

証明書データはSocketTlsHandshakeを使用して安全な接続を確立した後にのみ要求できます。

証明書取得エラーの場合、エラー5275 (ERR_NETSOCKET_NO_CERTIFICATE)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

SocketTlsRead

安全なTLS接続からデータを読み込みます。

int  SocketTlsRead(
  int           socket,             // ソケット
  uchar&       buffer[],             // ソケットからデータを読むためのバッファ
  uint         buffer_maxlen         // 読まれるバイト数
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。

buffer

[out] データが読まれるuchar型配列への参照。動的配列サイズは、読み取られたバイト数だけ増えます。配列サイズはINT_MAX (2147483647)を超えることはできません。

buffer_maxlen

[in] buffer[]配列に読まれるバイト数。配列に収まらないデータはソケットに残り、次のSocketTLSReadの呼び出しで受信できます。buffer_maxlenはINT_MAX (2147483647)を超えることはできません。

戻り値

成功の場合、読まれたバイト数。エラーの場合は -1 。

注意事項

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

この関数は、指定された量のデータを受信するかタイムアウトに達するまで実行されます(SocketTimeouts)。

データ読み込みエラーの場合は、エラー5273 (ERR_NETSOCKET_IO_ERROR)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

例:

//+——————————————————————+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+——————————————————————+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+——————————————————————+
//| サーバにコマンドを送信                                                  |
//+——————————————————————+
bool HTTPSend(int socket,string request)
 {
  char req[];
  int  len=StringToCharArray(request,req)-1;
  if(len<0)
    return(false);
//— 安全なTLS接続がポート443を使用する場合
  if(ExtTLS)
    return(SocketTlsSend(socket,req,len)==len);
//— 標準TCP接続が使用されている場合
  return(SocketSend(socket,req,len)==len);
 }
//+——————————————————————+
//| サーバ返答を読む                                                     |
//+——————————————————————+
bool HTTPRecv(int socket,uint timeout)
 {
  char   rsp[];
  string result;
  uint   timeout_check=GetTickCount()+timeout;
//— ソケットからデータが存在する間タイムアウトまで読み取る
  do
    {
    uint len=SocketIsReadable(socket);
    if(len)
       {
        int rsp_len;
        //— 接続が安全かどうかに応じたさまざまな読み取りコマンド
        if(ExtTLS)
           rsp_len=SocketTlsRead(socket,rsp,len);
        else
           rsp_len=SocketRead(socket,rsp,len,timeout);
        //— 応答を分析する
        if(rsp_len>0)
          {
           result+=CharArrayToString(rsp,0,rsp_len);
          //— 応答ヘッダーのみを印刷する
          int header_end=StringFind(result,"\r\n\r\n");
          if(header_end>0)
             {
              Print("HTTP answer header received:");
              Print(StringSubstr(result,0,header_end));
              return(true);
             }
          }
       }
    }
  while(GetTickCount()<timeout_check && !IsStopped());
  return(false);
 }
//+——————————————————————+
//| スクリプトプログラム開始関数                                              |
//+——————————————————————+
void OnStart()
 {
  int socket=SocketCreate();
//— ハンドルを確認する
  if(socket!=INVALID_HANDLE)
    {
    //— すべて正常な場合は接続する
    if(SocketConnect(socket,Address,Port,1000))
       {
        Print("Established connection to ",Address,":",Port);
 
        string   subject,issuer,serial,thumbprint;
        datetime expiration;
        //— 接続が証明書によって保護されている場合は、そのデータを表示する
        if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
          {
          Print("TLS certificate:");
          Print("   Owner:  ",subject);
          Print("   Issuer:  ",issuer);
          Print("   Number:     ",serial);
          Print("   Print: ",thumbprint);
          Print("   Expiration: ",expiration);
           ExtTLS=true;
          }
        //— サーバにGET要求を送信する
        if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
          {
          Print("GET request sent");
          //— 応答を読む
          if(!HTTPRecv(socket,1000))
              Print("Failed to get a response, error ",GetLastError());
          }
        else
          Print("Failed to send GET request, error ",GetLastError());
       }
    else
       {
        Print("Connection to ",Address,":",Port," failed, error ",GetLastError());
       }
    //— 使用後にソケットを閉じる
    SocketClose(socket);
    }
  else
    Print("Failed to create a socket, error ",GetLastError());
 }
//+——————————————————————+

参照

SocketTimeouts、MathSwap

SocketTlsReadAvailable

安全なTLS接続からすべてのデータを読み込みます。

int  SocketTlsReadAvailable(
  int           socket,             // ソケット
  uchar&       buffer[],             // ソケットからデータを読むためのバッファ
  const uint   buffer_maxlen         // 読まれるバイト数
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。

buffer

[out] データが読まれるuchar型配列への参照。動的配列サイズは、読み取られたバイト数だけ増えます。配列サイズはINT_MAX (2147483647)を超えることはできません。

buffer_maxlen

[in] buffer[]配列に読まれるバイト数。配列に収まらないデータはソケットに残り、次のSocketTlsReadAvailableまたはSocketTlsReadの呼び出しで受信できます。buffer_maxlenはINT_MAX (2147483647)を超えることはできません。

戻り値

成功の場合、読まれたバイト数。エラーの場合は -1 。

注意事項

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

データ読み込みエラーの場合は、エラー5273 (ERR_NETSOCKET_IO_ERROR)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

参照

SocketTimeouts、MathSwap

SocketTlsSend

安全なTLS接続を介してデータを送信します。

int  SocketTlsSend(
  int           socket,             // ソケット
  const uchar& buffer[],             // データバッファ
  uint         buffer_len           // バッファサイズ
  );

パラメータ

socket

[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。

buffer

[in] データが送信されるuchar型配列への参照

buffer_len

[in] 「buffer」配列サイズ

戻り値

成功の場合、ソケットに書かれたバイト数。エラーの場合は -1 。

注意事項

関数の実行時にシステムソケットでエラーが発生した場合、SocketConnectによって確立された接続は中断されます。

データ書き込みエラーの場合は、エラー5273 (ERR_NETSOCKET_IO_ERROR)が _LastErrorに書かれます。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。指標から呼び出すと、GetLastError()はエラー4014「Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

参照

SocketTimeouts、MathSwap、StringToCharArray

 

WebRequest

この関数は指定されたサーバにHTTP要求を送信します。この関数には 2 つのバージョンがあります。

1ヘッダの Content-Type: application/x-www-form-urlencoded を使用して型「key=value」の単純なリクエストを送信します。

int  WebRequest(
  const string      method,           // HTTP メソッド
  const string     url,             // URL
  const string     cookie,           // クッキー
  const string     referer,         // リファラ
  int               timeout,         // 時間切れ
  const char       &data[],         // HTTPメッセージ本文の配列
  int               data_size,       // data[] 配列のバイトサイズ
  char             &result[],       // サーバ応答データを含む配列
  string           &result_headers   // サーバ応答ヘッダ
  );

2. 様々なWebサービスとのより柔軟な相互作用のためにカスタムヘッダセットを指定して任意の型のリクエストを送ります

int  WebRequest(
  const string      method,           // HTTP メソッド
  const string     url,             // URL
  const string     headers,         // ヘッダ
  int               timeout,         // 時間切れ
  const char       &data[],         // HTTPメッセージ本文の配列
  char             &result[],       // サーバ応答データを含む配列
  string           &result_headers   // サーバ応答ヘッダ
  );

パラメータ

method

[in]  HTTP メソッド

url

[in]  URL

headers

[in] 「 \r\n」 で改行された「key: value」型のリクエストヘッダ

cookie

[in]  クッキー値

referer

[in]  HTTPリクエストのRefererヘッダー値

timeout

[in]  ミリ秒単位のタイムアウト

data[]

[in]  HTTPメッセージ本文の配列

data_size

[in]  data[] 配列のサイズ

result[]

[out]  サーバ応答データを含む配列

result_headers

[out] サーバ応答ヘッダ

戻り値

エラーのHTTPサーバ応答コードまたは-1

注意事項

WebRequest() 関数を使用するには、「オプション」ウィンドウの「エキスパートアドバイザー(EA)」タブで許可されたURLのリストに必要なサーバのアドレスを追加します。サーバのポートは指定されたプロトコルに基づいて「http://」には 80、「https://」には 443 が自動的に選択されます。

WebRequest() 関数は同期的で、プログラムの実行を停止してリクエストされたサーバからの応答を待機します。指標は 1 つのシンボルのに使用される全ての指標やチャートによって共有される共通のスレッドで実行されるので、応答までに長時間を必要とする場合があるこの関数は、指標からの呼び出しには使用出来ません。シンボルのチャートの 1 つの指標パフォーマンス遅延が、同じシンボルの全てのグラフの更新を停止することになります。

この関数は独自のスレッド内で実行されるエキスパートアドバイザーやスクリプトのみから呼び出すことが出来ます。この関数が指標から呼ばれた場合、GetLastError() はエラー 4014「 Function is not allowed for call(関数呼び出しの許可がありません)」を返します。

WebRequest() はストラテジーテスター内では実行出来ません。

例:

void OnStart()
 {
  string cookie=NULL,headers;
  char   post[],result[];
  string url="https://finance.yahoo.com";
//— サーバへのアクセスを有効にするには、URL "https://finance.yahoo.com"を
//— メインメニュ->ツール->オプションの 「エキスパートアドバイザー(EA)」タブの許可されたURLのリストに追加する必要がある
//— 最後のエラーコードのリセット
  ResetLastError();
//— Yahoo!ファイナンスからhtmlページを読み込む
  int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
  if(res==-1)
    {
    Print("Error in WebRequest. Error code  =",GetLastError());
    //— おそらくURLがリストされていないので、アドレスを追加する必要についてのメッセージを表示する
    MessageBox("Add the address '"+url+"' to the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION);
    }
  else
    {
    if(res==200)
       {
        //— ダウンロード成功
        PrintFormat("The file has been successfully downloaded, File size %d byte.",ArraySize(result));
        //PrintFormat("Server headers: %s",headers);
        //— ファイルでのデータ保存
        int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
        if(filehandle!=INVALID_HANDLE)
          {
          //— result[] 配列の内容のファイルでの保存
          FileWriteArray(filehandle,result,0,ArraySize(result));
          //— ファイルを閉じる
          FileClose(filehandle);
          }
        else
          Print("Error in FileOpen. Error code =",GetLastError());
       }
    else
        PrintFormat("Downloading '%s' failed, error code %d",url,res);
    }
 }

 

SendFTP

「FTP」タブの設定ウィンドウで指定されたアドレスにファイルを送信します。

bool  SendFTP(
  string  filename,          // ftp で送信されるファイル
  string  ftp_path=NULL      // ftp カタログ
  );

パラメータ

filename

[in]  送られたファイルの名称

ftp_path=NULL

[in]  FTP カタログディレクトリが指定されていない場合は、設定に記載されたディレクトリが使用されます。

戻り値

失敗の場合 false

注意事項

送信されるファイルはterminal_directory\MQL5\files フォルダまたはそのサブディレクトリに位置しなければいけません。FTP アドレス及び/またはアクセスパスワードが設定で指定されていない場合は、送信が実行されません。

SendFTP() 関数はストラテジーテスター内では使用できません。

SendMail

「メール」タブの設定ウィンドウで指定されたアドレスに電子メールを送信します。

bool  SendMail(
  string  subject,      // ヘッダ
  string  some_text      // メール本文
  );

パラメータ

subject

[in]  メールヘッダ

some_text

[in]  メール本文

戻り値

電子メールが送信キューに入れられた場合は true、それ以外の場合は false

注意事項

送信は設定で禁止することができ、電子メールアドレスも同様に省略することが出来ます。エラー情報を取得するには、GetLastError() が呼ばれます。

SendMail() 関数はストラテジーテスター内では使用できません。

SendNotification

MetaQuotes ID が「通知」タブで指定されているモバイル端末にプッシュ通知を送信します。

bool  SendNotification(
  string  text          // 通知テキスト
  );

パラメータ

text

[in]  通知テキストメッセージの長さは 255 文字を超えることは出来ません。

戻り値

通知が正常に端末から送信された場合は true、失敗なら false。失敗したプッシュ後に通知をチェックした際、GetLastError () は次のいずれかのエラーを返します。

  • 4515 – ERR_NOTIFICATION_SEND_FAILED,
  • 4516 – ERR_NOTIFICATION_WRONG_PARAMETER,
  • 4517 – ERR_NOTIFICATION_WRONG_SETTINGS,
  • 4518 – ERR_NOTIFICATION_TOO_FREQUENT.

注意事項

SendNotification() 関数には厳格な使用制限が設定されており、呼び出しは毎秒 2 以下と毎分 10 以下に限られています。 使用頻度は動的に監視されます。制限違反の場合にはこの関数は無効にされることが出来ます。

SendNotification() 関数はストラテジーテスター内では使用できません。

Originally posted 2019-07-30 09:27:36.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">