Мой советник отправляет несколько повторных писем

У меня есть советник на моей платформе 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
         
         }
      }
   
  
      
   }
   
  }

0 ответов

Другие вопросы по тегам