Qual o motivo desse pedaço de código imprimir 3 vezes? Não chega a ser um problema, mas eu quero eliminar isso. Alguma sugestão? Obrigado

 
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   ulong ticket;
   string symbol;

   if(!PositionSelect(_Symbol))
    {
  HistorySelect(0,TimeCurrent());

   for(int i=HistoryDealsTotal()-1;i>=0; i--)
      {
         ticket=HistoryDealGetTicket(i);
         symbol=HistoryDealGetString(ticket,DEAL_SYMBOL);
         if( symbol==_Symbol)
            {
              if(HistoryDealGetInteger(ticket,DEAL_REASON)==DEAL_REASON_SL)
                {
               double priceStlTriggered=HistoryDealGetDouble(ticket,DEAL_PRICE);
               Print("priceStlTriggered = ",priceStlTriggered);
                }
            }
            break;
      }
    }
  }





2021.03.23 17:23:17.232 2016.06.03 16:08:40   stop loss triggered #2 buy 8 WIN$D 69910 sl: 69780 [#3 sell 8 WIN$D at 69780]
2021.03.23 17:23:17.232 2016.06.03 16:08:40   deal #3 sell 8 WIN$D at 69780 done (based on order #3)
2021.03.23 17:23:17.232 2016.06.03 16:08:40   deal performed [#3 sell 8 WIN$D at 69780]
2021.03.23 17:23:17.232 2016.06.03 16:08:40   order performed sell 8 at 69780 [#3 sell 8 WIN$D at 69780]
2021.03.23 17:23:17.232 2016.06.03 16:08:40   priceStlTriggered = 69780.0
2021.03.23 17:23:17.232 2016.06.03 16:08:40   priceStlTriggered = 69780.0
2021.03.23 17:23:17.232 2016.06.03 16:08:40   priceStlTriggered = 69780.0
 
Daniel D.:

Olá

você está processando os três eventos que são geradas na execução de um DEAL: TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_DELETE e TRADE_TRANSACTION_HISTORY_ADD.

A transação correta é  TRADE_TRANSACTION_DEAL_ADD.

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol)
     {
      if(HistoryDealSelect(trans.deal))
        {
         if(HistoryDealGetInteger(trans.deal, DEAL_ENTRY) == DEAL_ENTRY_OUT && HistoryDealGetInteger(trans.deal, DEAL_REASON) == DEAL_REASON_SL)
           {
            double priceStlTriggered = HistoryDealGetDouble(trans.deal, DEAL_PRICE);
            Print("\n",priceStlTriggered = ", priceStlTriggered, "\n");
           }
        }
     }
  }
 
Rogerio Giannetti Torres:

Olá

você está processando os três eventos que são geradas na execução de um DEAL: TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_DELETE e TRADE_TRANSACTION_HISTORY_ADD.

A transação correta é  TRADE_TRANSACTION_DEAL_ADD.

Grato, Rogério. Perfeitamente esclarecido!