目次
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)は重要です。