Como calcular o valor de ordens fechadas com PositionClose ?

 

Estou tentando calcular o valor das ordens finalizadas com PositionClose, seja com lucro ou prejuizo, mas não estou conseguindo. 

Como fazer isso ?


//retorna valor total lucro de ordens fechadas com PositionClose no historico do dia
double GetTotalLucroOrdensPositionClose(ulong mn){
   
   double _profit = 0;
   
   MqlDateTime today;
   
   TimeCurrent(today);   
   string _todayIs = string(today.year) + "." + string(today.mon) + "." + string(today.day);
   
   if(HistorySelect(getToday(), TimeCurrent())){
   
        for (int i = HistoryDealsTotal() - 1; i >= 0; i--){
           ulong ticket=HistoryDealGetTicket(i);
           long entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
           string _symbol = HistoryDealGetString(ticket, DEAL_SYMBOL);
           ulong _magicNumber = HistoryDealGetInteger(ticket, DEAL_MAGIC);
           string _comment = HistoryDealGetString(ticket,DEAL_COMMENT);
           
           if(_magicNumber == mn && _symbol == _Symbol){
               if(entry == DEAL_ENTRY_OUT){
                  datetime oct=(datetime)HistoryDealGetInteger(ticket,DEAL_TIME);               
                  if(TimeCurrent() >= oct){
                     if(HistoryDealGetDouble(ticket, DEAL_PROFIT) > 0){
                        _profit += HistoryDealGetDouble(ticket, DEAL_PROFIT);
                     }                                   
                  }
               }
           }            
        }//for        
   }//historyselect
     
   return _profit;

}
 
Fernando Paiva:

Estou tentando calcular o valor das ordens finalizadas com PositionClose, seja com lucro ou prejuizo, mas não estou conseguindo. 

Como fazer isso ?


Utilize a função OnTradeTransaction junto a biblioteca DealInfo, a função será chamada cada vez que ocorrer o evento de transação e com a biblioteca você conseguirá ver o resultado da sua operação.


#include    <Trade\DealInfo.mqh> //Biblioteca para o uso do OnTradeTransaction
CDealInfo   m_deal; 

void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)
  {
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type; //get transaction type as enumeration value
   
    //--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal))
         m_deal.Ticket(trans.deal);
      else
         return;
      
      if(m_deal.Magic()==EXPERT_MAGIC && m_deal.Symbol()==_Symbol)
        {
         if(m_deal.DealType() == DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
           {
            if(m_deal.Entry() == DEAL_ENTRY_IN)
              {
               Print("Este bloco será chamado ao abrir uma nova posição");
              }
              
            else if(m_deal.Entry() == DEAL_ENTRY_OUT)
              {
               if(m_deal.DealType()==DEAL_TYPE_BUY)
                 {
                     Print("Este bloco será chamado ao fechar uma posição de compra");
                     double lucroUltimaOperacao = m_deal.Profit();
                     Print("Lucro da última operação = ", lucroUltimaOperacao);
                 }
               else if(m_deal.DealType()==DEAL_TYPE_SELL)
                 {
                     Print("Este bloco será chamado ao fechar uma posição de venda");
                     double lucroUltimaOperacao = m_deal.Profit();
                     Print("Lucro da última operação = ", lucroUltimaOperacao);

                 }  
              }
           }
        }
     }
  } 
 
vih6460 #:

Utilize a função OnTradeTransaction junto a biblioteca DealInfo, a função será chamada cada vez que ocorrer o evento de transação e com a biblioteca você conseguirá ver o resultado da sua operação.


Obrigado. Funciona blzinha !

Razão: