Мой советник отправляет несколько повторных писем
У меня есть советник на моей платформе MetaTrader4, который предназначен для отправки электронного письма через SendMail
функция всякий раз, когда сделка выполняется, и другая, когда эта сделка закрыта.
Все это работает без проблем, однако, он отправляет несколько дубликатов электронных писем всякий раз, когда торговая позиция закрыта. Очевидно, что нужно отправить только одно письмо.
Это также относится и к SendNotification
функционировать также
Моя установка выглядит следующим образом:
- Windows 2012 R2 VPS Server
- MetaQuotes MT4
Другая полезная информация
Я настроил автоматическую переадресацию на своем почтовом клиенте для отправки всех торговых уведомлений на другой адрес. Таким образом, эти электронные письма находятся в двух отдельных почтовых ящиках.
У меня только один терминал МТ4.
У меня есть один советник на символ
У меня вопрос, есть ли у кого-то еще эта проблема и / или кто-нибудь знает причину этого и как бы я исправить эту проблему?
Спасибо
//+------------------------------------------------------------------+
//| 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
}
}
}
}