【MQL5】WebRequest関数の使い方と自動売買実装コード

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 を要求します。送信前に必ず StringToCharArrayCP_UTF8 を指定して変換し、受信後は必要に応じて CharArrayToString で元に戻す処理が必要です。


5. 【重要】自動売買における約定スピードと環境の罠

自動売買の世界において、プログラムのロジック以上に収益を左右するのが「ネットワーク遅延(レイテンシ)」です。自宅のPCや一般的なWi-Fi環境でEAを動かすことは、プロのレーサーが一般道をファミリーカーで走るようなものです。光回線であっても、物理的な距離による数ミリ秒から数十ミリ秒の遅延、そして不安定なパケットロスは避けられません。この僅かな遅れが、スリッページを引き起こし、本来利益が出るはずのトレードを損失へと変えてしまいます。

極限まで約定スピードを高め、エッジを維持するためには、証券会社のサーバーと同じデータセンター内、あるいは極めて近い場所に位置する「専用のVPS(仮想専用サーバー)」が不可欠です。24時間365日、安定した高速回線で稼働し続ける環境は、もはやオプションではなく、シストレエンジニアにとっての「必須装備」と言えます。自宅PCでの運用による機会損失を防ぐためにも、プロレベルの取引インフラを整えることを強く推奨します。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました