我在我的 MetaTrader4 平台上有一个 EA,它旨在在SendMail
交易执行时通过该功能发送一封电子邮件,并在交易平仓时发送一封电子邮件。
这一切都顺利进行,但是,每当交易头寸关闭时,它都会发送多封重复的电子邮件。它显然只需要发送一封电子邮件。
SendNotification
函数也是如此
我的设置如下:
- Windows 2012 R2 VPS 服务器
- 元报价 MT4
其他有用信息
我确实在我的电子邮件客户端上设置了自动转发,以将所有交易通知发送到另一个地址。因此,这些电子邮件位于两个单独的收件箱中。
我只有一个 MT4 终端。
每个品种我有一个 EA
我的问题是,有没有其他人遇到过这个问题和/或有人知道这个问题的原因以及我将如何解决这个问题?
谢谢
//+------------------------------------------------------------------+
//| forexmts, forexmts@mail.ru, v4.0vs- |
//| Events function, |
//| detects changes in orders list |
//+------------------------------------------------------------------+
void fEvents(ENUM_FUNCTION_MODE enMode)
{
if (enMode == MODE_INIT) { fOrders(); return; }
if (enMode == MODE_WORK)
{
bool bFoundFlag;
fOrders();
//existing orders check
for(int i = 0; i < ArraySize(stcOrdOldArr); i++) //search all orders from the old array
{
bFoundFlag = false;
for(int j = 0; j < ArraySize(stcOrdNewArr); j++) //.. in the new array
{
if (stcOrdOldArr[i].ticket == stcOrdNewArr[j].ticket) //found by ticket
{
if (stcOrdOldArr[i].type != stcOrdNewArr[j].type) { }//but the type has changed
if (stcOrdOldArr[i].sl != stcOrdNewArr[j].sl) { } //SL was changed
if (stcOrdOldArr[i].tp != stcOrdNewArr[j].tp) { } //TP was changed
bFoundFlag = true;
break; //stop searching in the new array
}
}
if (bFoundFlag == false) //order wasn't found
{
if (stcOrdOldArr[i].type <= 1)
//we can't use profit and close price, lots and commentary (for partial close) from the dOrdOldArr, because we need their after close values
if (OrderSelect(stcOrdOldArr[i].ticket, SELECT_BY_TICKET))
{
string sKindOfExit = "";
if ((OrderType() == OP_BUY && OrderClosePrice() <= stcOrdOldArr[i].sl) || (OrderType() == OP_SELL && OrderClosePrice() >= stcOrdOldArr[i].sl && stcOrdOldArr[i].sl > 0) || StringFind(OrderComment(), "[sl]") >= 0)
sKindOfExit = " at StopLoss"; //close by sl
else
if ((OrderType() == OP_BUY && OrderClosePrice() >= stcOrdOldArr[i].tp && stcOrdOldArr[i].tp > 0) || (OrderType() == OP_SELL && OrderClosePrice() <= stcOrdOldArr[i].tp) || StringFind(OrderComment(), "[tp]") >= 0)
sKindOfExit = " at TakeProfit"; //close be tp
else
{ } //ordinary close
SendMail("(TNEPC)Trade Notification Email of Position Closure","Order #"+IntegerToString(OrderTicket())+" has been closed "+sKindOfExit+" on the account "+AccountName()+" "+AccountServer()+
"\n"+
"\nThe order exit price for this trade is "+DoubleToStr(OrderClosePrice(),_Digits)+" with a "+(OrderProfit()>=0?"profit":"loss")+" of £"+DoubleToStr(OrderProfit(),2)+
"\n"+
"\nThis is an Automated Message from xxxxxx"+
"\n-----------------------------------------------------------------------"+
"\n"+
"\nPRIVACY NOTICE"+
"\nThis email is intended for the recipient stated at the address at the top of this email. If you have received this in error, please delete this email immediately and contact us at xxxxxxx"+
"\n"+
"\n"+
"\nH"+
"\n"+
"\n"+
"\n");
SendNotification("Ticket #"+IntegerToString(OrderTicket())+" has closed with a "+(OrderProfit()>=0?"profit":"loss")+" of "+DoubleToStr(OrderProfit(),2));
}
else
{ } //order not found
if (stcOrdOldArr[i].type > 1) { } //pending order is deleted
}
}
}
}