Retornar dados de Ordem fechada Manualmente

 

Pessoal, já tenho o codigo que retorna o valor total que um EA executou no dia.

Porem quando fecho a ordem de forma manual, o magic number fica com valor 0 e a função não conta o valor.

Teria algum exemplo de como consigo capturar os dados de ordens fechadas manualmente que iniciaram a partir de um EA pelo magic number?


double retornaValoreDiaFechado()
{

   double Total_Fechadas=0;
   
   datetime time_start;
   
   time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400));
   
   
   if(HistorySelect(time_start,TimeCurrent()))
         for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
           {
            const ulong Ticket = HistoryDealGetTicket(i);
   
            //if(HistoryDealGetInteger(Ticket, DEAL_MAGIC) == in_magic && HistoryDealGetString(Ticket, DEAL_SYMBOL) == _Symbol)
            if(HistoryDealGetInteger(Ticket, DEAL_MAGIC) == in_magic)
               Total_Fechadas += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
           }
   
   return Total_Fechadas;

}
 
Adan Fabbri:

Pessoal, já tenho o codigo que retorna o valor total que um EA executou no dia.

Porem quando fecho a ordem de forma manual, o magic number fica com valor 0 e a função não conta o valor.

Teria algum exemplo de como consigo capturar os dados de ordens fechadas manualmente que iniciaram a partir de um EA pelo magic number?


Olá

Adan, basta testar também se o DEAL_MAGIC == 0;

 
Rogerio Giannetti Torres #:

Olá

Adan, basta testar também se o DEAL_MAGIC == 0;

O Problema neste caso é saber qual robo originou a ordem.

Preciso, saber o valor gerado por cada entrada feita pelo EA mesmo se foi finalizada manualmente.


obs: tenho mais de 1 EA com magic numbers diferentes rodando com este cenario.

 
Adan Fabbri #:


Bom, você comentou o teste correto e inclui um teste incompleto.

Comente o teste incompleto,  retire o comentário do teste correto e faça o teste do magic: (DEAL_MAGIC == magic OR DEAL_MAGIC == 0).

Mas, se vc tem mais de um robô rodando sobre mesmo ATIVO, aí lascou não tem jeito.

 

Resolvido


double retornaValoreDiaFechado()
{

   double Total_Fechadas=0;
   
   datetime time_start;
   
   time_start = (datetime) (86400*(((ulong)TimeCurrent())/86400));
   double position_id;
   
   if(HistorySelect(time_start,TimeCurrent()))
   {
      
      int hst = HistoryDealsTotal();
   
      for(int i = hst - 1; i >= 0; i--)
      {
         const ulong Ticket = HistoryDealGetTicket(i);
            
         if(HistoryDealGetInteger(Ticket, DEAL_MAGIC) == in_magic)
            Total_Fechadas += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
         else if(HistoryDealGetInteger(Ticket, DEAL_MAGIC) == 0)
         {
            position_id = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
                        
            for(int ii = hst - 1; ii >= 0; ii--)
            {
               ulong Ticket2 = HistoryDealGetTicket(ii);
               if(HistoryDealGetInteger(Ticket2, DEAL_MAGIC) == in_magic && HistoryDealGetInteger(Ticket2, DEAL_POSITION_ID) == position_id)
                  Total_Fechadas += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
            } 
         }
              
      }
           
   }
   
   return Total_Fechadas;

}
 
Adan Fabbri #:

Resolvido


Pode ser a solução testar o DEAL_POSITION_ID ?!.     Vc. tem certeza que o código está correto?

 

Olha, acredito que você terá um melhor resultado se observar o trade como um conjunto, pela ordem. Assim você engloba todos os deals, inclusive os fechados manualmente.


   HistorySelect(datainicial,TimeCurrent());
   for(int i=0; i<HistoryOrdersTotal(); i++)
     {
      long ticket = HistoryOrderGetTicket(i);
       if(HistoryOrderGetInteger(ticket,ORDER_MAGIC)==Magic)
        {
      
         for(int x=0; x<HistoryDealsTotal(); x++)
           {
            long dealticket = HistoryDealGetTicket(x);
            if(ticket == HistoryDealGetInteger(dealticket,DEAL_POSITION_ID))
              {
                resultado+=HistoryDealGetDouble(dealticket,DEAL_PROFIT)+HistoryDealGetDouble(dealticket,DEAL_SWAP)+HistoryDealGetDouble(dealticket,DEAL_COMMISSION);
 
Rogerio Giannetti Torres #:

Pode ser a solução testar o DEAL_POSITION_ID ?!.     Vc. tem certeza que o código está correto?

Testado hoje em ambiente real, resultado positivo, saí de 4 robos no min indice manualmente e retornou cada resultado separado por magic number

O DEAL_POSITION_ID se mantem na entrada e na saida, mesmo saindo de forma manual!

 
Adan Fabbri #:

Testado hoje em ambiente real, resultado positivo, saí de 4 robos no min indice manualmente e retornou cada resultado separado por magic number

O DEAL_POSITION_ID se mantem na entrada e na saida, mesmo saindo de forma manual!

Se esta funcionando, está otimo.