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 KBMT4側メール設定について
メール送信機能を使うには、MT4側で設定が必要です。

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

オプションの『E-メール』タブから設定可能です。設定方法について詳しく記載しませんがG-mail経由が簡単だと思います。「MT4 Gmail設定」等でネット検索すると出てきます。
さいごに
以上、『EAの取引履歴をメール送信する方法』でした。
メール送信自体は簡単なので、取引履歴以外にも色々送ってみてください。
※ EAのサンプルソースを一覧表にまとめました
※EA作成依頼はこちら
※オンラインレッスンやってます
コメント