🧭 はじめに|EAの取引履歴を「自動でメール通知」するという発想
EAを運用していると、
「昨日の取引結果を毎回MT4で確認するのが面倒」
「外出先でも取引履歴を把握したい」
と感じたことはありませんか?
この記事では、MT4でEAの取引履歴を自動でメール送信する方法を解説します。
MT4には標準でメール送信機能があり、これをEAから利用することで
前日の取引履歴を自動でメール送信する仕組みを作ることができます。
本記事では、
✅ EAの取引履歴を抽出
✅ マジックナンバー別に集計
✅ 日次レポートとしてメール送信
する MT4用サンプルEA(MQL4) を、初心者の方にも分かるように解説します。
※売買を行うEAではなく、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); // 昨日の開始時刻
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の評価・レビューをチェック!
MT4側メール設定について
メール送信機能を使うには、MT4側で設定が必要です。

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

オプションの「E-メール」タブからメール送信設定が可能です。
本記事ではEAロジック解説に集中するため、MT4側のメール設定手順は割愛しますが、
Gmailを使った設定が比較的簡単で、
「MT4 Gmail 設定」などで検索すると詳しい解説記事が見つかります。
さいごに
以上、『EAの取引履歴をメールで自動通知する方法』でした。
メール送信自体は簡単なので、取引履歴以外にも色々送ってみてください。
✅ 今回のロジックをベースにしたEAサンプルも多数公開中
今回紹介したようなEAの売買ロジック・考え方をベースに、
当サイトではさまざまなFX自動売買EAのサンプルコードを公開しています。
ロジックの違いや設計の考え方を比較しながら、
自分に合ったEA構成を探したい方はぜひチェックしてみてください。
📊 EA運用・検証フェーズに進みたい方へ
今回のような仕組みを理解したうえで、
「実際にどのEAが安定しているのか」、「検証データではどんな差が出ているのか」
を確認したい方は、以下の記事も参考になります。
EA開発初心者向けに、今後も実践的に使えるMQL4関数や実装例を紹介していきます。
気になる機能やロジックがあれば、用途別に整理した関連記事もぜひあわせてご覧ください。









コメント