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

1. SendNotification関数の概要と実務での活用法

SendNotificationは、MetaTrader 5(MT5)から、スマートフォン版のMT5アプリ(iOS/Android)に対してプッシュ通知を送信するための組み込み関数です。

実務開発において、この関数は「EA(自動売買システム)の目」としての役割を果たします。24時間稼働し続けるEAが、いつ、どのような条件で取引を行ったのか、あるいは予期せぬエラーが発生していないかを、外出先でも即座に把握するために不可欠です。

実務での主な活用シーン:
* 約定通知: 新規注文や決済が行われた瞬間に、価格とロット数を通知する。
* 異常事態の検知: 証拠金維持率の低下や、サーバー接続断、注文拒否(リクオート)などのエラー発生を知らせる。
* シグナル配信: 裁量トレードの補助として、テクニカル指標が特定の条件を満たした際にアラートを飛ばす。

初心者トレーダーがつまずきやすいポイントとして、「MetaQuotes ID」の設定忘れがあります。コードを正しく書いても、MT5デスクトップ版の設定画面でスマホアプリ側のIDを登録していないと通知は届きません。また、バックテスト中はこの関数が動作しない仕様であることにも注意が必要です。


2. 構文と戻り値

SendNotification関数の構造は非常にシンプルです。

構文

bool  SendNotification(
   string  text      // 通知するテキストメッセージ
   );

パラメーター

  • text: 送信する文字列です。最大255文字まで送信可能ですが、スマートフォンの画面で見やすいよう、100文字程度に要約するのが実務上のコツです。

戻り値

  • true: 送信キューへの登録に成功した場合。
  • false: 送信に失敗した場合。失敗の理由は GetLastError() 関数で確認できます。

3. 具体的な使い方・実践サンプルコード

以下は、EAが新規注文を出した際に、その詳細をスマホへ通知する実践的なコード例です。通知の送りすぎ(スパム化)を防ぐための簡易的なフラグ管理も盛り込んでいます。

//+------------------------------------------------------------------+
//|                                              NotifyExample.mq5   |
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

// 通知頻度を制御するための変数
datetime lastNotifyTime = 0;
const int NOTIFY_INTERVAL = 10; // 次の通知まで最低10秒空ける

//+------------------------------------------------------------------+
//| 新規注文成行時に通知を送る関数                                     |
//+------------------------------------------------------------------+
void SendTradeNotification(string symbol, string type, double price, double volume)
{
    // 短時間に連続して通知を送らないよう制御(サーバー負荷軽減とエラー回避)
    if(TimeCurrent() - lastNotifyTime < NOTIFY_INTERVAL) return;

    // メッセージの作成
    string message = StringFormat("【EA約定通知】\n通貨ペア:%s\n種別:%s\n価格:%G\n数量:%G", 
                                  symbol, type, price, volume);

    // 通知送信
    if(SendNotification(message))
    {
        Print("プッシュ通知を送信しました。");
        lastNotifyTime = TimeCurrent();
    }
    else
    {
        int errorCode = GetLastError();
        PrintFormat("通知送信に失敗しました。エラーコード: %d", errorCode);
    }
}

//+------------------------------------------------------------------+
//| EAの取引イベントを検知する関数(例)                               |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
    // 取引が完了(TRADE_TRANSACTION_DEAL_ADD)したタイミングで通知
    if(trans.type == TRADE_TRANSACTION_DEAL_ADD)
    {
        SendTradeNotification(trans.symbol, "新規/決済", trans.price, trans.volume);
    }
}

4. 使用上の注意点とよくあるエラー

SendNotificationを使用する際には、以下の技術的な制限と注意点を必ず理解しておいてください。

  1. 送信回数の制限(スロットリング):
    MetaQuotes社のサーバー側で制限が設けられています。通常、1秒間に1回以上、または短時間に大量の通知を送ろうとすると、送信が拒絶されます。OnTick内で条件判定なしに呼び出すと、すぐに制限に抵触し、MT5のログに「Notifications: frequency limit exceeded」と表示されます。
  2. バックテストでは動作しない:
    ストラテジーテスターでの実行中、この関数は常に false を返し、実際の通知は行われません。動作確認は必ずデモ口座などのライブ環境で行う必要があります。
  3. 文字列の長さ制限:
    255文字を超えた部分は切り捨てられます。日本語(マルチバイト文字)を使用する場合、文字数計算に注意してください。
  4. 設定の有効化:
    ツール > オプション > 通知 タブで、「プッシュ通知機能を有効にする」にチェックを入れ、MetaQuotes IDを正しく入力してください。「テスト」ボタンを押してスマホに通知が届くことを確認するのが開発の第一歩です。

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

シストレ開発者がSendNotificationで約定を知る際、その「通知の速さ」以上に重要なのが「注文そのものの速さ」です。多くの初級者は自宅のPCや一般的なノートPCでEAを稼働させがちですが、これはプロの視点から見ると極めてリスクの高い行為です。家庭用インターネット回線は数多くのノードを経由するため、証券会社サーバーとの物理的距離による「ネットワーク遅延(レイテンシ)」が避けられません。この数ミリ秒の遅れが、相場急変時にはスリッページを引き起こし、バックテスト通りの利益を削り取る致命的な要因となります。

さらに、自宅PCはOSのアップデートによる予期せぬ再起動や停電、回線断のリスクを常に抱えています。通知機能で異常を知ったときには既に手遅れ、というケースも少なくありません。約定スピードを極限まで高め、かつ安定した24時間稼働を実現するには、証券会社のデータセンターに近い場所に設置された専用のVPS(仮想専用サーバー)の利用が必須です。インフラを最適化することは、優れたロジックを組むことと同等、あるいはそれ以上に収益曲線へ直結する重要な戦略であることを忘れないでください。

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

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

コメント

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