【MT4】EAの取引履歴をメールで自動通知する方法|サンプルEAあり

スーツ姿のデグーマウスがMT4 EAのコードを指しながら解説しているイラスト。ぷろぐらむFXのデフォルトアイキャッチ。
EAサンプル・ノウハウ
記事内に商品プロモーションを含む場合があります
スポンサーリンク

🧭 はじめに|EAの取引履歴を「自動でメール通知」するという発想

EAを運用していると、
「昨日の取引結果を毎回MT4で確認するのが面倒」
「外出先でも取引履歴を把握したい」
と感じたことはありませんか?

この記事では、MT4でEAの取引履歴を自動でメール送信する方法を解説します。

MT4には標準でメール送信機能があり、これをEAから利用することで
前日の取引履歴を自動でメール送信する仕組みを作ることができます。

本記事では、
✅ EAの取引履歴を抽出
✅ マジックナンバー別に集計
✅ 日次レポートとしてメール送信

する MT4用サンプルEA(MQL4) を、初心者の方にも分かるように解説します。

※売買を行うEAではなく、EA運用を補助する「管理・通知用EA」 です。

EAの仕様(取引履歴メール送信の仕組み)

上記でも説明しましたが、もう少し細かい部分についてです。

パラメータ設定

パラメータ設定は「MagicNo」のみです。

特定のマジックナンバーの取引履歴を送信したい場合はマジックナンバーを指定してください。全取引という場合は、マジックナンバーは「-1」としてください。
※裁量トレードの取引履歴を送信したい場合は「0」としてください

メール送信する時間

メール送信する時間は、新たに日足が生成された日本時間(冬時間朝7時、夏時間朝6時)に送信されます。

取引履歴の日付

取引履歴のOrderCloseTime()「決済日」がメール送信タイミングから見て前日のデータを取得しています。

メール内容

サンプルソースからメール送信を行うと内容はこんな感じです。

【MT4】EAの取引履歴をメールで自動通知する方法|サンプルEAあり

レイアウトも比較的簡単に変更可能です。

ソースコード

ソースコード全体

まずはソースコード全体です。

//+------------------------------------------------------------------+
//|                                                     sendMail.mq4 |
//|                                    Copyright © 2020-2025 ぷろぐらむFX |
//|                        https://www.gogojungle.co.jp/users/196655 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2020-2025 ぷろぐらむFX"
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict


input int MagicNo =-1;
datetime prevday;;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
          
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

   if(prevday != Day() ){
      prevday = Day();
   }else{
      return;
   }

   SendTradeHistory();

}
         
void SendTradeHistory()
{

   // 昨日の日付を計算
   datetime yesterday_start = iTime(Symbol(), PERIOD_D1, 1); // 昨日の開始時刻
   datetime yesterday_end = TimeCurrent(); // 送信時の時刻
   
   string mail_subject = TimeToString(yesterday_start, TIME_DATE) + " 取引履歴レポート";
   string mail_body = "日時, シンボル, 種別, ロット, 価格, 損益\n";
   int tradeCnt =0,WinCnt =0;
   double TotalSyushi=0;
   bool MagicChk =false; 
   
    // 履歴をループ処理
    for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
            datetime close_time = OrderCloseTime();

            
            if(MagicNo == -1){
               MagicChk =true;
            }else{
               if(OrderMagicNumber()==MagicNo){
                  MagicChk =true;
               }else{
                  MagicChk =false;
               }
            }
            
            // 昨日の日付の取引のみ対象
            if (close_time >= yesterday_start && close_time <= yesterday_end && MagicChk ==true)
            {        
               // 取引情報を取得
               string time = TimeToString(OrderCloseTime(), TIME_SECONDS);
               string symbol = OrderSymbol();
               string type = OrderType() == OP_BUY ? "Buy" : "Sell";
               double lots = OrderLots();
               double price = OrderClosePrice();
               double profit = OrderProfit();
   
               // メール本文に追加
               mail_body += time + ", " + symbol + ", " + type + ", " + DoubleToString(lots, 2) + ", " + DoubleToString(price, 5) + ", " + DoubleToString(profit, 2) + "\n";
               tradeCnt = tradeCnt+1;
               TotalSyushi = TotalSyushi + OrderProfit();
               if(OrderProfit() > 0){
                  WinCnt = WinCnt +1;
               }
               
            }
        }
    }

   if(tradeCnt == 0){
      mail_body += "昨日の取引はありませんでした";
   }else{
      string M_message = "";
      
      // 勝率の計算
      double win_rate = (tradeCnt > 0) ? (double(WinCnt) / tradeCnt) * 100 : 0;
      double Syouritu = NormalizeDouble(WinCnt/tradeCnt * 100,2);
  
      if(MagicNo == -1){
         M_message ="";
      }else{
         M_message ="【マジックナンバー:" + IntegerToString(MagicNo) + "】\n";


      }
  
      M_message = M_message + "取引回数:" + IntegerToString(tradeCnt) + "回  勝率:" + DoubleToString(win_rate, 2) + "% (" + IntegerToString(WinCnt) + "勝 " + IntegerToString(tradeCnt-WinCnt) + "負)\n";
      M_message = M_message + "合計損益:" + DoubleToString(TotalSyushi, 0) + "円\n";
      mail_body = M_message + "\n" + mail_body;   
   }
   
   // メール送信
   if (SendMail(mail_subject, mail_body)){
      Print("取引履歴メール送信成功");
   }else{
      Print("取引履歴メール送信失敗");
   }

}
スポンサーリンク

呼び出しの所を解説

まず、呼び出しの所です。今回はOnTick()に追加していますが、日付が変わったタイミング「prevday != Day()」の時だけ、SendTradeHistory()関数を呼び出すようにしています。

void OnTick()
{

   if(prevday != Day() ){
      prevday = Day();
   }else{
      return;
   }

   SendTradeHistory();

}

SendTradeHistory()関数

この関数は自作関数です。引数も戻り値もありませんのでご自身のEAにも組み込みやすいかなと思います。

機能としては、MT4から取引履歴を抽出しメール送信のみ行ってくれる関数という感じです。

void SendTradeHistory()
{

   // 昨日の日付を計算
   datetime yesterday_start = iTime(Symbol(), PERIOD_D1, 1); // 昨日の開始時刻
   datetime yesterday_end = TimeCurrent(); // 送信時の時刻
   
   string mail_subject = TimeToString(yesterday_start, TIME_DATE) + " 取引履歴レポート";
   string mail_body = "日時, シンボル, 種別, ロット, 価格, 損益\n";
   int tradeCnt =0,WinCnt =0;
   double TotalSyushi=0;
   bool MagicChk =false; 
   
    // 履歴をループ処理
    for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    {
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
            datetime close_time = OrderCloseTime();

            
            if(MagicNo == -1){
               MagicChk =true;
            }else{
               if(OrderMagicNumber()==MagicNo){
                  MagicChk =true;
               }else{
                  MagicChk =false;
               }
            }
            
            // 昨日の日付の取引のみ対象
            if (close_time >= yesterday_start && close_time <= yesterday_end && MagicChk ==true)
            {        
               // 取引情報を取得
               string time = TimeToString(OrderCloseTime(), TIME_SECONDS);
               string symbol = OrderSymbol();
               string type = OrderType() == OP_BUY ? "Buy" : "Sell";
               double lots = OrderLots();
               double price = OrderClosePrice();
               double profit = OrderProfit();
   
               // メール本文に追加
               mail_body += time + ", " + symbol + ", " + type + ", " + DoubleToString(lots, 2) + ", " + DoubleToString(price, 5) + ", " + DoubleToString(profit, 2) + "\n";
               tradeCnt = tradeCnt+1;
               TotalSyushi = TotalSyushi + OrderProfit();
               if(OrderProfit() > 0){
                  WinCnt = WinCnt +1;
               }
               
            }
        }
    }

   if(tradeCnt == 0){
      mail_body += "昨日の取引はありませんでした";
   }else{
      string M_message = "";
      
      // 勝率の計算
      double win_rate = (tradeCnt > 0) ? (double(WinCnt) / tradeCnt) * 100 : 0;
      double Syouritu = NormalizeDouble(WinCnt/tradeCnt * 100,2);
  
      if(MagicNo == -1){
         M_message ="";
      }else{
         M_message ="【マジックナンバー:" + IntegerToString(MagicNo) + "】\n";


      }
  
      M_message = M_message + "取引回数:" + IntegerToString(tradeCnt) + "回  勝率:" + DoubleToString(win_rate, 2) + "% (" + IntegerToString(WinCnt) + "勝 " + IntegerToString(tradeCnt-WinCnt) + "負)\n";
      M_message = M_message + "合計損益:" + DoubleToString(TotalSyushi, 0) + "円\n";
      mail_body = M_message + "\n" + mail_body;   
   }
   
   // メール送信
   if (SendMail(mail_subject, mail_body)){
      Print("取引履歴メール送信成功");
   }else{
      Print("取引履歴メール送信失敗");
   }

}

実際にメールを送信している箇所は78行目の「SendMail()関数」のみです。それまでのソースコードは、メールに送信するメッセージを組み立てています。もしメール内容を変えたい場合はメッセージ組み立て部分を変更してください。

あと、前日の取引縛り(5~6行目で計算)を行っているのと、パラメータ設定でマジックナンバー単位での履歴抽出も可能(22~34行目で確認)となっています。

ダウンロード

EAファイルのダウンロードはこちら👇

📥 取引履歴メール送信EA をダウンロード

\ 国内最大級のEAプラットフォーム /
GogoJungle(ゴゴジャン)でEAの評価・レビューをチェック!

▶ GogoJungleでEAを探す 【MT4】EAの取引履歴をメールで自動通知する方法|サンプルEAあり

MT4側メール設定について

メール送信機能を使うには、MT4側で設定が必要です。

【MT4】EAの取引履歴をメールで自動通知する方法|サンプルEAあり

MT4の『ツール』→『オプション』をクリックしてください。

【MT4】EAの取引履歴をメールで自動通知する方法|サンプルEAあり

オプションの「E-メール」タブからメール送信設定が可能です。
本記事ではEAロジック解説に集中するため、MT4側のメール設定手順は割愛しますが、
Gmailを使った設定が比較的簡単で、
「MT4 Gmail 設定」などで検索すると詳しい解説記事が見つかります。

さいごに

以上、『EAの取引履歴をメールで自動通知する方法』でした。

メール送信自体は簡単なので、取引履歴以外にも色々送ってみてください。


✅ 今回のロジックをベースにしたEAサンプルも多数公開中

今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。

ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。


📊 EA運用・検証フェーズに進みたい方へ

今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。


EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。

コメント

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