EAの取引履歴をメール送信する方法(サンプルソース)

記事内に商品プロモーションを含む場合があります
スポンサーリンク

MT4のEAサンプルソース(FX用)を公開します。

今回は、トレードするEAではなくEAが取引した取引履歴をメール送信する感じです。

はじめに

MT4ではメール送信機能があり、所定のアドレスにメールを送信してくれます。何のメッセージでもメールで送っていいのですが、せっかくなので意味のある情報(前日取引した履歴)を自分がよく確認するメールアドレス宛に送りたいと思います。

EAとして作っていますが、関数をそのままコピペすることで自分が使っているEAに組み込む事も可能ですので是非使ってみて下さい。

EAの仕様

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

パラメータ設定

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

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

メール送信する時間

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

取引履歴の日付

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

メール内容

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

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

ソースコード

ソースコード全体

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

//+------------------------------------------------------------------+
//|                                                     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); // 昨日の開始時刻(0:00)
   datetime yesterday_end = iTime(Symbol(), PERIOD_D1, 0) - 1; // 昨日の終了時刻(23:59:59)
   
   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); // 昨日の開始時刻(0:00)
   datetime yesterday_end = iTime(Symbol(), PERIOD_D1, 0) - 1; // 昨日の終了時刻(23:59:59)
   
   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” をダウンロード sendMail.ex4 – 17 回のダウンロード – 9.23 KB

MT4側メール設定について

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

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

オプションの『E-メール』タブから設定可能です。設定方法について詳しく記載しませんがG-mail経由が簡単だと思います。「MT4 Gmail設定」等でネット検索すると出てきます。

さいごに

以上、『EAの取引履歴をメール送信する方法』でした。

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

※ EAのサンプルソースを一覧表にまとめました


※EA作成依頼はこちら


※オンラインレッスンやってます

コメント