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

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

SendMail関数は、MQL5プログラムから指定したメールアドレスへ電子メールを送信するための関数です。MT5(MetaTrader 5)の「ツール」→「オプション」→「E-メール」タブで設定されたSMTPサーバーを経由して、リアルタイムの通知を外部へ飛ばすことができます。

実務においては、主に以下のようなシーンで活用されます。
約定通知: 外出中にEAがどのようなポジションを持ったか、または決済したかを把握する。
異常検知: 証拠金維持率の低下や、予期せぬエラー(注文拒否など)が発生した際の緊急アラート。
日次レポート: その日の収益やドローダウンをまとめて送信する。

初心者・中級者がつまずきやすいポイントは、「関数を書いただけではメールは飛ばない」という点です。MT5側のSMTP設定(送信元サーバー、ポート、パスワード等)が正しく完了していないと、コードが正常でもメールは届きません。また、最近のGmailなどのプロバイダはセキュリティが厳しく、「アプリパスワード」の発行が必要になるなど、インフラ側の準備で苦戦するケースが多く見られます。

2. 構文と戻り値

SendMail関数の構文は非常にシンプルです。

bool  SendMail(
   string  subject,       // メールの件名
   string  text           // メールの本文
   );

パラメーター

  • subject: メールのタイトル(件名)を指定します。
  • text: メールの本文を指定します。

戻り値

  • 成功時: true を返します。
  • 失敗時: false を返します。

※注意:trueが返ってきたからといって「相手の受信トレイに届いた」ことを保証するわけではありません。あくまで「MT5が送信待ち行列(スプール)に正常にジョブを追加した」ことを意味します。詳細なエラー内容は GetLastError() 関数で確認できます。

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

以下は、EAが新規注文を出した際に、その詳細をメールで送信する実用的なコード例です。

//+------------------------------------------------------------------+
//| 注文約定時にメールを送信するサンプル                                     |
//+------------------------------------------------------------------+
void SendTradeNotification(string type, double price, double lot, string symbol)
{
   // メールの件名を作成
   string subject = "[EA通知] 新規注文実行 - " + symbol;

   // メールの本文を作成(時刻や価格を分かりやすく記載)
   string body = "以下の内容で注文が執行されました。\n\n" +
                 "通貨ペア: " + symbol + "\n" +
                 "売買種別: " + type + "\n" +
                 "約定価格: " + DoubleToString(price, _Digits) + "\n" +
                 "ロット数: " + DoubleToString(lot, 2) + "\n" +
                 "発生時刻: " + TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS);

   // SendMailを実行
   if(SendMail(subject, body))
   {
      Print("メール送信成功: ", subject);
   }
   else
   {
      Print("メール送信失敗。エラーコード: ", GetLastError());
   }
}

// EAの注文処理後に以下のように呼び出します
// SendTradeNotification("BUY", 145.50, 0.1, _Symbol);

このサンプルでは、関数の引数に変数を渡すことで、動的にメール内容を変更しています。DoubleToStringを使用して価格の桁数を調整するなど、受信時の読みやすさを考慮するのが実務のコツです。

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

SendMailを運用に組み込む際は、以下のポイントに注意してください。

  1. 送信頻度の制限:
    OnTick関数内で条件判定なしにSendMailを記述すると、ティックが動くたびにメールが送信され、メールサーバーからスパム判定を受けてアカウントが凍結される恐れがあります。必ず「フラグ変数」などを用いて、1つのイベントに対して1回だけ送信するように制御してください。
  2. 実行環境の依存:
    SendMailはストラテジーテスター(バックテスト)中には動作しません。動作確認は必ずデモ口座などのリアルタイム環境で行う必要があります。
  3. セキュリティ設定:
    多くのメールプロバイダ(Gmail, Yahoo!, Outlook等)では、通常のログインパスワードではなく「MQL5専用のアプリパスワード」を生成してMT5に設定する必要があります。
  4. ネットワーク遅延:
    メール送信処理は非同期で行われますが、MT5側の設定が間違っているとログにエラーが溜まり、ターミナル全体のパフォーマンスに悪影響を及ぼすことがあります。

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

シストレ開発において、SendMailで通知を受け取る体制を整えることは重要ですが、それ以上に重要なのが「EAが動作するインフラ環境」です。多くの初心者は自宅のPCでEAを稼働させがちですが、これには致命的なリスクが潜んでいます。家庭用インターネット回線はプロバイダー経由の複雑なルートを通るため、証券会社のサーバーに注文が届くまでに数十〜数百ミリ秒の「レイテンシ(遅延)」が発生します。

このわずかな遅延が、相場急変時にはスリッページを増大させ、期待した利益を削り取るだけでなく、本来なら回避できたはずの損失を招きます。プロのクオンツエンジニアが自宅PCをトレードサーバーに使うことはまずありません。約定スピードを極限まで高め、物理的なネットワーク距離を最短にするには、証券会社のデータセンターに近い場所に設置された「トレード専用のVPS(仮想専用サーバー)」の利用が不可欠です。安定した電源、24時間の稼働保証、そして超低遅延な環境を手に入れることは、シストレで勝ち残るための「最低限のインフラ投資」と言えるでしょう。

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

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

コメント

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