1. WebRequest関数の概要と実務での活用法
MQL5のWebRequestは、MetaTrader 5(MT5)から外部のWebサーバーへHTTPリクエスト(GETやPOSTなど)を送信するための関数です。一言で言えば、「MT5をインターネット上のあらゆるサービスと繋ぐ架け橋」です。
実務開発における主な活用シーンは以下の通りです。
* 通知の自動化: 売買シグナルや約定結果をSlack、Discord、LINE、TelegramなどのSNSへリアルタイム通知する。
* 外部データの取得: MT5標準のデータにはない経済指標カレンダー、暗号資産の価格、ニュース情報をAPI経由で取得し、ロジックに組み込む。
* AI・外部分析との連携: 自作のPythonサーバーやOpenAIのAPIへデータを送り、高度な機械学習モデルによる予測結果を受け取る。
開発者がつまずきやすいポイント
もっとも多い失敗は、MT5の「オプション設定」で接続先URLを許可し忘れることです。また、WebRequestは「同期通信」であるため、レスポンスが返ってくるまでEAの処理が一時的に止まります。この特性を理解せずに重い処理をネットワーク越しに行うと、トレードの実行タイミングを逃すリスクがあるため注意が必要です。
2. 構文と戻り値
WebRequest関数には2つの形式がありますが、一般的に使われる多機能な形式の構文は以下の通りです。
int WebRequest(
const string method, // HTTPメソッド("GET" または "POST")
const string url, // 接続先URL
const string cookie, // クッキー情報(通常はNULL)
const string referer, // リファラ(通常はNULL)
int timeout, // タイムアウト時間(ミリ秒)
const uchar &data[], // 送信するデータ(POST時に使用)
int data_size, // 送信データのサイズ
uchar &result[], // サーバーからの応答を受け取る配列
string &result_headers // サーバーからの応答ヘッダー
);
戻り値
- 成功時: サーバーから返されたHTTPステータスコード(200、404、500など)を返します。
- 失敗時:
-1を返します。詳細なエラー内容はGetLastError()関数で確認できます。- エラーコード4060: URLが許可リストに登録されていない。
- エラーコード5203: HTTPリクエストの送信に失敗した。
3. 具体的な使い方・実践サンプルコード
以下は、EAが新規注文を出した際に、その内容をDiscordのWebhookを使用してチャットに通知する実用的なサンプルコードです。
// +------------------------------------------------------------------+
// | Discordにメッセージを送信する関数 |
// +------------------------------------------------------------------+
void SendDiscordNotification(string message) {
string url = "https://discord.com/api/webhooks/YOUR_WEBHOOK_URL_HERE";
string headers = "Content-Type: application/json\r\n";
char post_data[];
char result[];
string result_headers;
// JSON形式のデータを作成(簡易的な文字列結合)
string json_payload = "{\"content\": \"" + message + "\"}";
// 文字列をuchar配列に変換
StringToCharArray(json_payload, post_data, 0, WHOLE_ARRAY, CP_UTF8);
// WebRequestの実行
ResetLastError();
int res = WebRequest("POST", url, NULL, NULL, 5000, post_data, ArraySize(post_data), result, result_headers);
// 結果の判定
if (res == -1) {
int error_code = GetLastError();
if (error_code == 4060) {
Print("エラー:URLをMT5の許可リストに追加してください。");
} else {
PrintFormat("WebRequest失敗。エラーコード: %d", error_code);
}
} else {
if (res == 200 || res == 204) {
Print("Discord通知成功。");
} else {
PrintFormat("サーバーがエラーを返しました。コード: %d", res);
}
}
}
// EAの注文実行時などに呼び出す例
void OnTradeTransaction(const MqlTradeTransaction& trans,
const MqlTradeRequest& request,
const MqlTradeResult& result) {
if (trans.type == TRADE_TRANSACTION_DEAL_ADD) {
string msg = "【約定通知】新しい取引が発生しました。Ticket: " + IntegerToString(trans.deal);
SendDiscordNotification(msg);
}
}
4. 使用上の注意点とよくあるエラー
① 許可リストへの登録
WebRequestはセキュリティ上の理由から、デフォルトですべての通信が遮断されています。
[ツール] > [オプション] > [エキスパートアドバイザー] タブを開き、「WebRequestを許可するURL」にチェックを入れ、使用するドメイン(例: https://discord.com)を必ず追加してください。
② ストラテジーテスターでは動かない
WebRequestはバックテスト(ストラテジーテスター)中には動作しません。 テスト中にこの関数を呼び出すとエラーになります。バックテスト環境とリアル環境を切り分けるには MQLInfoInteger(MQL_TESTER) を使って条件分岐を行いましょう。
③ 文字コードの壁
MQL5の文字列は内部的にUnicodeですが、Web APIの多くは UTF-8 を要求します。送信前に必ず StringToCharArray で CP_UTF8 を指定して変換し、受信後は必要に応じて CharArrayToString で元に戻す処理が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
自動売買の世界において、プログラムのロジック以上に収益を左右するのが「ネットワーク遅延(レイテンシ)」です。自宅のPCや一般的なWi-Fi環境でEAを動かすことは、プロのレーサーが一般道をファミリーカーで走るようなものです。光回線であっても、物理的な距離による数ミリ秒から数十ミリ秒の遅延、そして不安定なパケットロスは避けられません。この僅かな遅れが、スリッページを引き起こし、本来利益が出るはずのトレードを損失へと変えてしまいます。
極限まで約定スピードを高め、エッジを維持するためには、証券会社のサーバーと同じデータセンター内、あるいは極めて近い場所に位置する「専用のVPS(仮想専用サーバー)」が不可欠です。24時間365日、安定した高速回線で稼働し続ける環境は、もはやオプションではなく、シストレエンジニアにとっての「必須装備」と言えます。自宅PCでの運用による機会損失を防ぐためにも、プロレベルの取引インフラを整えることを強く推奨します。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント