MT5のWebRequest関数の使い方

MetaTrader 5(MT5)のWebRequest関数は、HTTPまたはHTTPSプロトコルを用いて外部サーバーと通信するための関数です。この関数は、特にAPIとのデータ交換や外部ウェブサービスとの連携に使用されます。

基本的なWebRequest関数の呼び出しは以下のような形式になります。

int WebRequest(
const string method, // HTTPメソッド ("GET" または "POST")
const string url, // URL
const string headers, // リクエストヘッダー
int timeout, // タイムアウト(ミリ秒)
const char &post[] , // POSTリクエスト用のデータ
char &result[], // サーバーからのレスポンスデータ
string &result_headers // サーバーからのレスポンスヘッダー
);

サンプルコード

以下は、WebRequest関数を使用してHTTP GETリクエストを行い、その結果を出力する簡単なMQL5コードの例です。

//+------------------------------------------------------------------+
//| WebRequest.mq5|
//| Copyright 2013, Company Name |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2013 MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
//--- to enable access to the server, you should add URL "http://www.mql5.com" in the list of allowed URLs

#include <stderror.mqh>
#include <stdlib.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
char post [];
char cookies=NULL, headers;
char res[];
string baseurl="http://www.mql5.com";
int res1 =WebRequest("GET", baseurl, cookies, headers, 5000, post, 0, res) ;
Print(CharArrayToString(res));
return(INIT_SUCCEEDED);
}

注記と注意点

1. **リクエストメソッド:** 通常は"GET"または"POST"です。他のHTTPメソッドもサポートされている場合がありますが、それはサーバーやAPIに依存します。

2. **URL:** 接続先のURLです。

3. **ヘッダー:** 通常はUser-AgentやContent-TypeなどのHTTPヘッダー情報を設定します。

4. **タイムアウト:** リクエストのタイムアウト時間をミリ秒で指定します。

5. **POSTデータ:** POSTリクエストの場合、このパラメータで送信するデータを設定します。

6. **レスポンス:** サーバーからのレスポンスデータがこのパラメータに保存されます。

7. **レスポンスヘッダー:** サーバーからのレスポンスヘッダーがこのパラメータに保存されます。

注意: WebRequest関数を使用する際には、セキュリティに注意を払う必要があります。信頼できるサーバーとのみ通信するようにし、必要な認証や暗号化手段を採用してください。また、MT5の設定で外部との通信が許可されていることを確認してください。

 

GETでサーバへデータを送信している?

HTTP GETリクエストでは、通常、データはURLの一部としてサーバーに送信されます。このデータはクエリパラメータとしてURLに追加され、それによってサーバー側で特定の操作やデータの取得が行われます。

例えば、http://example.com/api/v1/items?id=123というURLがあった場合、id=123という部分がクエリパラメータです。この情報はサーバーにGETリクエストとして送信され、サーバーはこのid値に基づいて特定の「アイテム」のデータを返します。

GETリクエストは、主に以下のような用途で使用されます:

1. リソースの取得: 特定の情報やデータをサーバーから取得する場合に使用します。
2. 状態の確認: サーバーの特定の状態や設定を確認する場合に使用されます。
3. 検索クエリ: 検索条件をクエリパラメータとして送信し、その結果を取得する場合に使用されます。

GETリクエストは副作用がない(サーバーの状態を変更しない)ように設計されるべきです。これはHTTP/1.1の仕様で推奨されるRESTfulなAPI設計の一部です。

なお、セキュリティ上の観点からは、GETリクエストで機密情報を送信することは推奨されません。GETリクエストのURLはブラウザの履歴やサーバーのログ、さらにはキャッシュに保存される可能性があり、機密情報が漏洩するリスクがあります。セキュリティが重要な場合は、POSTリクエストや他の方法を用いてデータを送信することが一般的です。

 

POSTを用いて取引データをサーバへ送信するには?

以下は、MetaTrader 5(MT5)でHTTP POSTリクエストを用いて取引データをサーバーに送信するための簡単なMQL5コードの例です。この例では、仮想の取引データ(例:注文ID、シンボル、取引量)をJSON形式でサーバーに送信します。

まず、許可されたURLにサーバーのURLを追加してください。これはMT5プラットフォームの設定で行います。

次に、以下のようなMQL5コードを書くことができます。

//+------------------------------------------------------------------+
//| TradePost.mq5 |
//| Copyright 2021, Example Corp. |
//+------------------------------------------------------------------+
#property copyright "2021 Example Corp."
#property link "http://www.example.com"
#property version "1.00"

#include <stderror.mqh>
#include <stdlib.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
string url = "http://www.example.com/api/trade"; // サーバーのAPIエンドポイント
string headers = "Content-Type: application/json"; // ヘッダー設定(JSON形式でデータを送信)
char post_data[];
string data_str = "{\"order_id\":\"123\", \"symbol\":\"EURUSD\", \"volume\":1.0}"; // 送信する取引データ(JSON形式)

StringToCharArray(data_str, post_data); // stringをchar配列に変換

int timeout = 5000; // タイムアウト設定(ミリ秒)
char result[];
string resultHeaders;

// WebRequest関数でHTTP POSTリクエストを送信
int res = WebRequest("POST", url, headers, timeout, post_data, result, resultHeaders);

// レスポンスを確認
if(res == -1)
{
int error_code= GetLastError();
Print("Error in WebRequest. Error code: ", error_code);
if(error_code ==4060)
{
Print("Add the addres https://www.mql5.com in the list of allowed URLs on tab 'ExperdAdvisors'");
}
else
{
Print("Acces to the server is not possible.\ncode: ",error_code,"\ndescription: ",ErrorDescription(error_code));
}
}
else
{
// レスポンスデータを表示(デバッグ用)
Print("Received data: ", CharArrayToString(result));
}

return(INIT_SUCCEEDED);
}

この例では以下を行っています:

1. POSTリクエストに使用するURLとヘッダーを設定しています。
2. StringToCharArray関数で、送信するJSON形式のデータ(data_str)をchar配列(post_data)に変換しています。
3. WebRequest関数を用いて、指定したURLに対してPOSTリクエストを送信しています。

注意:このコードは例示用であり、エラーハンドリングや例外処理が最小限になっています。また、実際の運用で使用する前には十分なテストが必要です。特にセキュリティに関する考慮(例:SSLの使用、認証等)が必要です。

 

サーバ側で受け取るには?(Python)

PythonのWebフレームワークであるFlaskを使用して、MT5から送信されたHTTP POSTリクエストのデータを受け取るサーバー側のコード例を以下に示します。

この例では、JSON形式の取引データ(注文ID、シンボル、取引量)を受け取り、処理する簡単なコードです。

from flask import Flask, request, jsonify

app = Flask(__name__)

# /api/tradeエンドポイントを設定し、POSTリクエストを受け付ける
@app.route('/api/trade', methods=['POST'])
def trade():
try:
# JSONデータを取得
data = request.json

# データが空かどうかを確認
if not data:
return jsonify({"message": "No data provided"}), 400

# 取引データを変数に格納(この部分はエラーハンドリングを追加するべきです)
order_id = data.get("order_id")
symbol = data.get("symbol")
volume = data.get("volume")

# データの処理(データベース保存、計算等)をここで行う
# ...

# 成功レスポンスを返す
return jsonify({"message": "Data received successfully"}), 200

except Exception as e:
# エラーレスポンスを返す
return jsonify({"message": str(e)}), 500

if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)

このコードをapp.pyというファイルに保存し、Flaskをインストールした後(pip install Flaskでインストールできます)、ターミナルからpython app.pyで実行すると、0.0.0.0:5000でサーバーが起動します。

このサーバーは、http://0.0.0.0:5000/api/tradeにPOSTリクエストを送ると、JSON形式のデータを受け取り、"Data received successfully"というJSONレスポンスを返します。

注意:このコードは基本的な例であり、実際の運用環境で使用するにはセキュリティ強化やエラーハンドリングの強化が必要です。特に認証と暗号化(例:HTTPS)は重要です。

記事タイトル検索