English Русский 中文 Español Deutsch
preview
Connexus入門(第1回):WebRequest関数の使い方

Connexus入門(第1回):WebRequest関数の使い方

MetaTrader 5 | 13 11月 2024, 11:39
247 0
joaopedrodev
joaopedrodev

はじめに

金融プログラミングの分野、特にMetaTrader 5の環境において、HTTP経由でリモートサーバーと対話する機能は不可欠です。たとえば、リアルタイムの市場データを取得したり、APIを使って取引注文を送信したり、サードパーティのサービスにクエリを実行したりする際に、HTTPリクエストは重要な役割を果たします。MQL5では、WebRequest関数が提供されており、これを使って外部と通信をおこなうことができますが、その制限により、実際には多くのシナリオで実用的ではない場合があります。

HTTP (Hypertext Transfer Protocol)は、Web通信の基盤となるプロトコルです。その利用方法をマスターすることにより、開発者はMetaTrader 5と他のサービス間でリッチで動的な統合を実現できます。たとえば、エキスパートアドバイザー(EA)が、世界的な経済イベントに基づいて取引戦略を調整するためにニュースAPIにアクセスする場合があります。また、HTTP APIを提供している取引所で暗号通貨の価格を照会し、EAがこれらの市場と同期して取引できるようにすることも可能です。

HTTPリクエストが重要である一方、MQL5のWebRequest関数の実装は、現代的な柔軟なツールに期待されるものとはかなり異なります。これにより、開発者は制限に適応するか、回避策を探し続ける必要が生じることがあります。この連載の目的は、WebRequest関数の弱点を調査し、これらの制限を克服して MQL5開発者の作業を容易にするライブラリ「Connexus」を構築することです。

WebRequest関数を活用することで、外部サービスとの統合が広がります。自動取引の決定に必要な金融データを集めることからプロセスの完全な自動化まで、WebRequestによってEAはWebと直接対話できます。たとえば、取引ロボットは外部ソースから経済ニュースや他のプラットフォームの市場データなどをリアルタイムで取得し、取引戦略を自動的に調整するために利用することができます。これにより、操作の精度と効率が向上します。

ただし、これから示すように、WebRequest関数の使用は一筋縄ではいかないことがあります。HTTPリクエストの送信自体は単純に思えるかもしれませんが、正しいヘッダーの設定、JSONデータのフォーマット、サーバーの応答処理、さらには通信中に発生する可能性のあるエラーや例外への対処など、技術的な課題が多く存在します。これらの問題に直面するため、WebRequest関数は非常に強力ではありますが、プロトコルやシステム間の通信をしっかりと理解していなければなりません。この点が、新たに学び始めた開発者にとって障壁となる場合があります。

そのため、より使いやすく効率的なツールの必要性が高まります。この連載で今後開発・改善される「Connexus」ライブラリは、WebRequest関数の制限を克服し、統合プロセスをよりユーザーフレンドリーで直感的に行えるようにすることを目的としています。Connexusを使用することで、開発者はネットワークプログラミングの詳細に煩わされることなく、重要なアプリケーションとEAのロジックに集中できます。これにより、フォーマットエラーやヘッダーのデバッグに無駄な時間を費やすことなく、効率的にシステムを統合できます。

今後の記事では、WebRequest関数の弱点や制限、そしてそれらを克服するための堅牢なソリューションについて深掘りしていきます。HTTPプロトコルについて議論を続けることに加え、APIでの認証、大量データの処理、応答時間の最適化や複数の同時リクエストの管理といった高度な機能についても触れます。

そのため、MQL5開発スキルの向上、システム統合の学習、HTTP通信の最適化に関心がある方々は、今後の更新にぜひ注目してください。このプロジェクトは継続的に範囲を広げ、Connexusライブラリを開発し、開発に欠かせないツールに育てていきます。ここで得られた知識は、MetaTraderを使用する開発者だけでなく、アプリケーションにAPIやWebサービスを統合する必要があるすべての開発者にとって貴重なものとなるでしょう。


WebRequestについて

WebRequest関数は、HTTPリクエストをおこなうためにMQL5が提供する主要なツールです。簡単に言うと、MQL5プログラムがサーバーにリクエストを送信し、その応答を受け取ることを可能にします。一見すると単純に思えるかもしれませんが、実際にWebRequestを使用する際には、開発を複雑にする落とし穴や難しさがいくつもあります。

この関数の基本構文には2つのバージョンがあります。

int  WebRequest(
   const string      method,           // HTTP method 
   const string      url,              // URL
   const string      cookie,           // cookie
   const string      referer,          // referer
   int               timeout,          // timeout
   const char        &data[],          // the array of the HTTP message body
   int               data_size,        // data[] array size in bytes
   char              &result[],        // an array containing server response data
   string            &result_headers   // headers of server response
   );

int  WebRequest(
   const string      method,           // HTTP method
   const string      url,              // URL
   const string      headers,          // headers 
   int               timeout,          // timeout
   const char        &data[],          // the array of the HTTP message body
   char              &result[],        // an array containing server response data
   string            &result_headers   // headers of server response
   );

WebRequest関数のパラメータは、関数が正しく機能するために不可欠であり、関数を効果的に使用したい開発者にとっては、パラメータの詳細な理解が不可欠です。それぞれのパラメーターを調べてみましょう。

パラメータ名

In/Out
詳細
method
string
In
HTTPリクエストのタイプを定義します。最も一般的なタイプはGETとPOSTです。GETはサーバーにデータを要求するのに使われ、POSTはサーバーにデータを送信するのに使われます。
url
string
In
リクエストの送信先サーバーのアドレスです。プロトコル(httpまたはhttps)を含めた完全なURLが必要です。
headers
string
In
追加のHTTPヘッダーを、文字列の配列として渡すことができます。各文字列の形式は「Key:Value」です。これらのヘッダーは、認証トークンやコンテントタイプなどの追加情報を、改行「\r\n」で区切って渡すために使用されます。
cookie
string
In
クッキーの値です。
referer
string
In
HTTPリクエストのRefererヘッダーの値です。
timeout
int In
サーバーからの応答を待つ最大時間をミリ秒単位で設定します。適切なタイムアウトは、EAが決して到着しないかもしれない応答を待って立ち往生しないようにするために重要です。
data
char[] In
POSTリクエストの場合、データをサーバーに送信するために使用されます。このデータはバイト配列の形式である必要があり、バイナリーデータの扱いに慣れていない開発者にとっては難しいかもしれません。
data_size
int In 送信するデータのサイズです。リクエストが正しく動作するためには、データ配列のサイズと一致している必要があります。
result
char[] Out サーバーからの応答をバイト配列で受け取ります。関数が呼ばれた後、有用な情報を取り出すために配列をデコードする必要があります。
  result_headers   string Out この文字列の配列は、サーバーからの応答ヘッダーを受け取ります。 応答ヘッダーには、コンテントタイプや認証ステータスなどの 重要な情報が含まれている可能性があります。 

リクエストが正しく行われるようにするためには、これらの各設定を慎重に構成する必要があります。これらのパラメータのいずれかに誤りがあると、リクエストが不正な形式になったり、サーバーとの通信が完全に失敗する可能性があります。

この関数は、操作の成功または失敗を示すHTTPステータスコードを返します。WebRequestは基本的な概念をカバーしていますが、その実装には多くの改善の余地があります。開発者は、ヘッダーの作成やさまざまなデータ型の処理、エラーチェックを手動で管理する必要があり、プロセスが面倒でエラーが発生しやすくなります。WebRequestの優れた点の一つは、GETリクエストとPOSTリクエストの両方をサポートしているため、幅広いAPIとのやり取りが可能であることです。



WebRequest関数の使用例

WebRequest関数の使い方を説明するために、簡単な例を作成しましょう。この例では、HTTPリクエストの作成とテストを可能にする無料のオンラインサービスであるhttpbin.orgを使用します。このサービスは、kennethreitzによって作成されたオープンソースプロジェクトです(リンク)。httpbin.orgは非常にシンプルでわかりやすく動作します。基本的には「鏡」のようなもので、鏡の前に立ってポーズをとったり、質問をしたりするような感覚です。HTTPBinにリクエストを送信することで、鏡のように、送信した内容を正確に反映します。これにより、HTTPリクエストで送信されている内容を正確に確認したい開発者や、さまざまな種類のリクエストと応答をシミュレートする必要がある開発者にとって便利なツールとなります。httpbinの一般的な機能には、次のものがあります。

  1. リクエストの送信:GET、POST、PUT、DELETEなど、さまざまなタイプのHTTPリクエストを送信して、サーバーの応答を確認できます。
  2. HTTPヘッダーのテスト: カスタムヘッダーを送信し、サーバーの応答を表示できます。これは、ヘッダー関連の問題のデバッグに役立ちます。
  3. リクエスト本文でのデータ送信: リクエスト本文でデータを送信して、サーバーがそれをどのように処理するかを確認できます。
  4. HTTPステータスシミュレーション: 200、404、500などの特定のステータスコードを返すようにサーバーに要求し、アプリケーションがさまざまなステータス応答をどのように処理するかをテストできます。
  5. 遅延とリダイレクトのシミュレーション:httpbin.orgでは、応答の遅延やリダイレクトをシミュレートできるため、より複雑なシナリオでシステムの動作をテストできます。
  6. Cookieテスト: サーバーがCookieをどのように設定し、返すかを確認しながら、Cookieを操作できます。

これは、HTTPプロトコルを使用するシステムを統合するための実用的なツールです。WebRequestを使用して、可能な限り単純なGETリクエストを作成しましょう。

ステップ1:端末にURLを追加する

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







ステップ2:ハンズオンコード

<data_folder>/MQL5/Expertsディレクトリに、Connexusというフォルダを作成します。このフォルダにテスト用のファイルを配置します。データフォルダを見つけるには、MetaTraderまたはMetaEditorのメインメニューで、[ファイル]>[データフォルダを開く]を選択します。そのフォルダの中に、WebRequest.mq5という名前のファイルを作成すると、次のようになります。

//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

今のところ、OnInit()イベントだけをテストに使います。リクエストを実行するための変数を定義し、WebRequest関数に渡してみましょう。

int OnInit()
  {
//--- Defining variables
   string method = "GET";                    // HTTP verb in string (GET, POST, etc...)
   string url = "https://httpbin.org/get";   // Destination URL
   string headers = "";                      // Request header
   int timeout = 5000;                       // Maximum waiting time 5 seconds
   char data[];                              // Data we will send (body) array of type char
   char result[];                            // Data received as an array of type char
   string result_headers;                    // String with response headers
   
//--- Calling the function and getting the status_code
   int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers);
   
//--- Print the data
   Print("Status code: ",status_code);
   Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form.

//---
   return(INIT_SUCCEEDED);
  }

ロボットをチャートに挿入すると、端末には次のような応答が表示されます。

WebRequest (WINV24,M1)  Status code: 200
WebRequest (WINV24,M1)  Resposta: {
WebRequest (WINV24,M1)    "args": {}, 
WebRequest (WINV24,M1)    "headers": {
WebRequest (WINV24,M1)      "Accept": "*/*", 
WebRequest (WINV24,M1)      "Accept-Encoding": "gzip, deflate", 
WebRequest (WINV24,M1)      "Accept-Language": "pt,en;q=0.5", 
WebRequest (WINV24,M1)      "Host": "httpbin.org", 
WebRequest (WINV24,M1)      "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", 
WebRequest (WINV24,M1)      "X-Amzn-Trace-Id": "Root=1-66d8cd53-0d6cd16368aa22e455db461c"
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "origin": "XXX.XXX.XX.XXX", 
WebRequest (WINV24,M1)    "url": "https://httpbin.org/get"
WebRequest (WINV24,M1)  }
WebRequest (WINV24,M1)  

受信したステータスコードは200であり、リクエストが成功したことを意味します。応答ではデータを含むJSONを受信したことに注意してください。次の記事では、HTTPプロトコルを介した通信の仕組みを詳しく見ていきます。ここでHTTP動詞をPOSTに変更し、リクエストのボディにデータを送信します。

int OnInit()
  {
//--- Defining variables
   string method = "POST";                    // HTTP verb in string (GET, POST, etc...)
   string url = "https://httpbin.org/post";   // Destination URL
   string headers = "";                       // Request header
   int timeout = 5000;                        // Maximum waiting time 5 seconds
   char data[];                               // Data we will send (body) array of type char
   char result[];                             // Data received as an array of type char
   string result_headers;                     // String with response headers

//--- Treating body
   string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
   StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8); // Converts a string to a byte array

//--- Calling the function and getting the status_code
   int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers);
   
//--- Print the data
   Print("Status code: ",status_code);
   Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form.
   
//---
   return(INIT_SUCCEEDED);
  }

さて、これですべてが機能するようになりました。httpbinは送信したすべてのものを返すので、送信した本文を返すはずです。POSTコードを実行すると、次の結果が返されます。

WebRequest (WINV24,M1)  Status code: 200
WebRequest (WINV24,M1)  Resposta: {
WebRequest (WINV24,M1)    "args": {}, 
WebRequest (WINV24,M1)    "data": "", 
WebRequest (WINV24,M1)    "files": {}, 
WebRequest (WINV24,M1)    "form": {
WebRequest (WINV24,M1)      "{\"key1\":\"value1\",\"key2\":\"value2\"}\u0000": ""
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "headers": {
WebRequest (WINV24,M1)      "Accept": "*/*", 
WebRequest (WINV24,M1)      "Accept-Encoding": "gzip, deflate", 
WebRequest (WINV24,M1)      "Accept-Language": "pt,en;q=0.5", 
WebRequest (WINV24,M1)      "Content-Length": "34", 
WebRequest (WINV24,M1)      "Content-Type": "application/x-www-form-urlencoded", 
WebRequest (WINV24,M1)      "Host": "httpbin.org", 
WebRequest (WINV24,M1)      "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", 
WebRequest (WINV24,M1)      "X-Amzn-Trace-Id": "Root=1-66d9bc77-314c004a607c383b3197c15a"
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "json": null, 
WebRequest (WINV24,M1)    "origin": "200.103.20.126", 
WebRequest (WINV24,M1)    "url": "https://httpbin.org/post"
WebRequest (WINV24,M1)  }
WebRequest (WINV24,M1)  

jsonやdataといった追加フィールドがあることに注意してください。それぞれを理解しましょう。dataフィールドには文字列形式で送信した本文が表示され、jsonフィールドにはjson形式で送信した本文が表示されます。しかし、リクエストでボディを送ったのに、なぜ両方とも空なのでしょうか。これは、コンテンツタイプがjsonであることをサーバーに通知しなければならないからです。そのために、リクエストヘッダを次のように設定します。

int OnInit()
  {
//--- Defining variables
   string method = "POST";                    // HTTP verb in string (GET, POST, etc...)
   string url = "https://httpbin.org/post";   // Destination URL
   string headers = "Content-Type: application/json";// Request header
   int timeout = 5000;                        // Maximum waiting time 5 seconds
   char data[];                               // Data we will send (body) array of type char
   char result[];                             // Data received as an array of type char
   string result_headers;                     // String with response headers

//--- Treating body
   string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
   StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8);

//--- Calling the function and getting the status_code
   int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers);
   
//--- Print the data
   Print("Status code: ",status_code);
   Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form.
   
//---
   return(INIT_SUCCEEDED);
  }
WebRequest (WINV24,M1)  Status code: 200
WebRequest (WINV24,M1)  Resposta: {
WebRequest (WINV24,M1)    "args": {}, 
WebRequest (WINV24,M1)    "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}\u0000", 
WebRequest (WINV24,M1)    "files": {}, 
WebRequest (WINV24,M1)    "form": {}, 
WebRequest (WINV24,M1)    "headers": {
WebRequest (WINV24,M1)      "Accept": "*/*", 
WebRequest (WINV24,M1)      "Accept-Encoding": "gzip, deflate", 
WebRequest (WINV24,M1)      "Accept-Language": "pt,en;q=0.5", 
WebRequest (WINV24,M1)      "Content-Length": "34", 
WebRequest (WINV24,M1)      "Content-Type": "application/json", 
WebRequest (WINV24,M1)      "Host": "httpbin.org", 
WebRequest (WINV24,M1)      "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", 
WebRequest (WINV24,M1)      "X-Amzn-Trace-Id": "Root=1-66d9be03-59060f042f7090092787855e"
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "json": null, 
WebRequest (WINV24,M1)    "origin": "200.103.20.126", 
WebRequest (WINV24,M1)    "url": "https://httpbin.org/post"
WebRequest (WINV24,M1)  }
WebRequest (WINV24,M1)  

送信したデータがdataフィールドにあることに注目してください。これは正しい方向に進んでいることを示していますが、StringToCharArrayメソッドが文字列をバイト配列に変換する際、null終端文字が含まれるため、「\u0000」文字が表示されることに注意してください。これを回避するには、配列のサイズを調整する必要があります。送信する本文を出力し、この「\u0000」文字がどこから来ているかを確認しましょう。

int OnInit()
  {
//--- Defining variables
   string method = "POST";                    // HTTP verb in string (GET, POST, etc...)
   string url = "https://httpbin.org/post";   // Destination URL
   string headers = "Content-Type: application/json";// Request header
   int timeout = 5000;                        // Maximum waiting time 5 seconds
   char data[];                               // Data we will send (body) array of type char
   char result[];                             // Data received as an array of type char
   string result_headers;                     // String with response headers

//--- Tratando body
   string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
   StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8);
   Print("Body: ",body);
   Print("Body Size: ",StringLen(body));
   ArrayPrint(data);
   Print("Array Size: ",ArraySize(data));

//--- Calling the function and getting the status_code
   int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers);
   
//--- Print the data
   Print("Status code: ",status_code);
   Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form.
   
//---
   return(INIT_SUCCEEDED);
  }
WebRequest (WINV24,M1)  Body: {"key1":"value1","key2":"value2"}
WebRequest (WINV24,M1)  Body Size: 33
WebRequest (WINV24,M1)  123  34 107 101 121  49  34  58  34 118  97 108 117 101  49  34  44  34 107 101 121  50  34  58  34 118  97 108 117 101  50  34 125   0
WebRequest (WINV24,M1)  Array Size: 34
WebRequest (WINV24,M1)  Status code: 200
WebRequest (WINV24,M1)  Resposta: {
WebRequest (WINV24,M1)    "args": {}, 
WebRequest (WINV24,M1)    "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}\u0000", 
WebRequest (WINV24,M1)    "files": {}, 
WebRequest (WINV24,M1)    "form": {}, 
WebRequest (WINV24,M1)    "headers": {
WebRequest (WINV24,M1)      "Accept": "*/*", 
WebRequest (WINV24,M1)      "Accept-Encoding": "gzip, deflate", 
WebRequest (WINV24,M1)      "Accept-Language": "pt,en;q=0.5", 
WebRequest (WINV24,M1)      "Content-Length": "34", 
WebRequest (WINV24,M1)      "Content-Type": "application/json", 
WebRequest (WINV24,M1)      "Host": "httpbin.org", 
WebRequest (WINV24,M1)      "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", 
WebRequest (WINV24,M1)      "X-Amzn-Trace-Id": "Root=1-66d9bed3-2ebfcda024f637f436fc1d82"
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "json": null, 
WebRequest (WINV24,M1)    "origin": "200.103.20.126", 
WebRequest (WINV24,M1)    "url": "https://httpbin.org/post"
WebRequest (WINV24,M1)  }
WebRequest (WINV24,M1)  

本文の文字列は有効なJSONであること、つまり、角括弧の開閉、カンマ区切り、キーと値のルールが順守されていることに注意してください。StringToCharArray関数によって生成されたバイト配列を見てみましょう。文字列と配列のサイズが出力されますが、それらは異なることに注意してください。バイト配列は文字列よりも1つ大きい位置です。また、値のリストでは、最後の値が125であるべきところが「0」になっていることに注意してください。これは文字「}」です。この問題を解決するには、ArrayRemove()を使用して配列の最後の位置を削除します。

int OnInit()
  {
//--- Defining variables
   string method = "POST";                    // HTTP verb in string (GET, POST, etc...)
   string url = "https://httpbin.org/post";   // Destination URL
   string headers = "Content-Type: application/json";// Request header
   int timeout = 5000;                        // Maximum waiting time 5 seconds
   char data[];                               // Data we will send (body) array of type char
   char result[];                             // Data received as an array of type char
   string result_headers;                     // String with response headers

//--- Tratando body
   string body = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
   StringToCharArray(body,data,0,WHOLE_ARRAY,CP_UTF8);
   ArrayRemove(data,ArraySize(data)-1);
   Print("Body: ",body);
   Print("Body Size: ",StringLen(body));
   ArrayPrint(data);
   Print("Array Size: ",ArraySize(data));

//--- Calling the function and getting the status_code
   int status_code = WebRequest(method,url,headers,timeout,data,result,result_headers);
   
//--- Print the data
   Print("Status code: ",status_code);
   Print("Response: ",CharArrayToString(result)); // We use CharArrayToString to display the response in string form.
   
//---
   return(INIT_SUCCEEDED);
  }
WebRequest (WINV24,M1)  Body: {"key1":"value1","key2":"value2"}
WebRequest (WINV24,M1)  Body Size: 33
WebRequest (WINV24,M1)  123  34 107 101 121  49  34  58  34 118  97 108 117 101  49  34  44  34 107 101 121  50  34  58  34 118  97 108 117 101  50  34 125
WebRequest (WINV24,M1)  Array Size: 33
WebRequest (WINV24,M1)  Status code: 200
WebRequest (WINV24,M1)  Resposta: {
WebRequest (WINV24,M1)    "args": {}, 
WebRequest (WINV24,M1)    "data": "{\"key1\":\"value1\",\"key2\":\"value2\"}", 
WebRequest (WINV24,M1)    "files": {}, 
WebRequest (WINV24,M1)    "form": {}, 
WebRequest (WINV24,M1)    "headers": {
WebRequest (WINV24,M1)      "Accept": "*/*", 
WebRequest (WINV24,M1)      "Accept-Encoding": "gzip, deflate", 
WebRequest (WINV24,M1)      "Accept-Language": "pt,en;q=0.5", 
WebRequest (WINV24,M1)      "Content-Length": "33", 
WebRequest (WINV24,M1)      "Content-Type": "application/json", 
WebRequest (WINV24,M1)      "Host": "httpbin.org", 
WebRequest (WINV24,M1)      "User-Agent": "MetaTrader 5 Terminal/5.4476 (Windows NT 11.0.22631; x64)", 
WebRequest (WINV24,M1)      "X-Amzn-Trace-Id": "Root=1-66d9c017-5985f48331dba63439d8192d"
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "json": {
WebRequest (WINV24,M1)      "key1": "value1", 
WebRequest (WINV24,M1)      "key2": "value2"
WebRequest (WINV24,M1)    }, 
WebRequest (WINV24,M1)    "origin": "200.103.20.126", 
WebRequest (WINV24,M1)    "url": "https://httpbin.org/post"
WebRequest (WINV24,M1)  }
WebRequest (WINV24,M1)  

これで、文字列と配列のサイズが揃い、サーバーはコンテンツを有効なJSONとして正しく検出しました。これは応答の戻り値で提供でき、サーバーはjsonフィールドとdataフィールドで送信されたJSONを返します。いくつかの構成をおこなった後、単純なHTTP POST要求を実行してデータを正しく送信できました。ただし、WebRequest 関数の使用は簡単ではありません。プロトコルの動作と操作する構造をよく理解する必要があります。有効な応答を取得するためにコードを調整したときに見たように、小さな欠点でも複雑になることがよくあります。Connexusライブラリの目標は、まさにこのプロセスを簡素化し、エンドユーザーがこれらのより低い抽象的なプログラミングレイヤーに対処する必要がないようにして、現在直面しているような複雑な問題を回避し、WebRequestをよりアクセスしやすく効率的に使用できるようにすることです。


結論

この記事では、外部サーバーやAPIと通信してEAの機能を拡張したい開発者にとって不可欠なツールであるMetaTrader 5のWebRequest関数の使用について詳しく説明しました。httpbin.orgサービスを実際の例として使用し、GETおよびPOSTリクエストを実行し、JSON形式でデータを送受信し、サーバーの応答を理解しました。この紹介は、HTTP経由のシステム統合の旅の始まりに過ぎず、将来のより複雑なプロジェクトの基礎を提供します。

旅はまだ始まったばかりです。一緒に、WebRequest関数を簡素化し、強力でアクセスしやすいツールに変換し、EAの開発を簡素化し、MetaTrader 5での自動化と統合の新たな可能性への扉を開きましょう。

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

添付されたファイル |
WebRequest.mq5 (5.14 KB)
MQL5で取引管理者パネルを作成する(第2回):応答性と迅速なメッセージングの強化 MQL5で取引管理者パネルを作成する(第2回):応答性と迅速なメッセージングの強化
この記事では、以前作成した管理パネルの応答性を強化します。さらに、取引シグナルの文脈におけるクイックメッセージングの重要性についても検討します。
MQL5とPythonで自己最適化エキスパートアドバイザーを構築する(第3回):Boom 1000アルゴリズムの解読 MQL5とPythonで自己最適化エキスパートアドバイザーを構築する(第3回):Boom 1000アルゴリズムの解読
本連載では、動的な市場状況に自律的に適応できるエキスパートアドバイザー(EA)を構築する方法について説明します。本日の記事では、Derivの合成市場に合わせてディープニューラルネットワークを調整してみます。
知っておくべきMQL5ウィザードのテクニック(第38回):ボリンジャーバンド 知っておくべきMQL5ウィザードのテクニック(第38回):ボリンジャーバンド
ボリンジャーバンドは、多くのトレーダーが手動で取引を発注し、決済するために使用する、非常に一般的なエンベロープ指標です。この指標が生成する可能性のあるシグナルをできるだけ多く検討し、ウィザードで組み立てたエキスパートアドバイザー(EA)でどのように使用できるかを見ていきます。
MQL5で古典的な戦略を再構築する(後編):FTSE100と英国債 MQL5で古典的な戦略を再構築する(後編):FTSE100と英国債
この連載では、人気のある取引戦略を探り、AIを使ってその改善を試みます。今日の記事では、株式市場と債券市場の関係に基づく古典的な取引戦略を再考します。