Status de uma ordem

 

Bom dia, a todos,

Estou a alguns dias pesquisando e quebrando a cabeça para encontrar a solução, que penso que deveria ser facil.


No meu EA, eu crio um sequencia de ordens pendentes do tipo BuyStop e preciso identificar quando a ordem se tornou um posição e quando ela se encerrou pelo TP ou SL.


Porem eu não consigo definir um fluxo para acompanhar as mudanças dos ID.

Quando crio a ordem e consigo recuperar o ticket da ordem:

-- Coloca ordem Pendente
trade.BuyLimit(lote,aux.price,_Symbol,0,aux.price+steps_inpoint,0,0,"Bidu Gold - BuySTOP");

-- Recuperar o Ticket da Ordem
aux.ticket = trade.ResultOrder();


Porem quando ela vira um Posição eu perco a referencia já que o ID da posição é diferente do ID da Ordem:

-- Log do teste do EA
order [#5 buy limit 0.01 XAUUSD at 1700.00] triggered
deal #2 buy 0.01 XAUUSD at 1700.00 done (based on order #5)
deal performed [#2 buy 0.01 XAUUSD at 1700.00]
order performed buy 0.01 at 1700.00 [#5 buy limit 0.01 XAUUSD at 1700.00]

--Log do encerramento
take profit triggered #5 buy 0.01 XAUUSD 1700.00 tp: 1750.00 [#22 sell 0.01 XAUUSD at 1750.00]
deal #3 sell 0.01 XAUUSD at 1750.00 done (based on order #22)
deal performed [#3 sell 0.01 XAUUSD at 1750.00]
order performed sell 0.01 at 1750.00 [#22 sell 0.01 XAUUSD at 1750.00]


Já tentei algumas alternativas analisando o Histórico de Posições.

Mas não consigo verificar quando o Ordem foi finalizada :s


Podem me auxiliar?


Att,

Bidu

 
LordBidu:


Bom tarde, respondendo a cada pergunta.

1)  Porem quando ela vira um Posição eu perco a referencia já que o ID da posição é diferente do ID da Ordem:

Use o POSITION_ID e ORDER_POSITION_ID para estabelecer a relação entre as tuplas 1:N ( Netting) ou 1:1 ( Hedging )


2)  No meu EA, eu crio um sequencia de ordens pendentes do tipo BuyStop e preciso identificar quando a ordem se tornou um posição e quando ela se encerrou pelo TP ou SL.

Vamos aos senão, ok. 

2.1) Quando a ordem se tornou posição? A posição é gerada no MT5 assim quando ocorre a primeira execução da ordem. Como é muito comum não operar com lote mínimo, pode ocorrer a execução de várias parciais  até o preenchimento total da ordem, quando isso ocorre a ordem sai da lista de ordens pendentes e vai para histórico.

Em resumo: Enquanto existir na lista de ordens uma ordem com POSITION_ORDER_ID = POSITION_ID a ordem não foi totalmente preenchida, podendo também acontecer da posição ser encerrada da SL e o restante da  ordem ficar na pedra.

2.2) O TP/SL é uma ordem a mercado oposta a posição e no final de seu preenchimento sai da lista de ordens vai para histórico de ordens, ao mesmo tempo em que a posição sai da lista de posições abertas e vai para histórico de DEALS.

2.3) Lembre-se que  SL não significa necessariamente prejuízo,  pois pode ser um SL resultado do movimento de um trailing stop em posição de lucro. Então para saber se uma posição encerrou com prejuízo/lucro o programa tem que varrer o histórico de posições por POSITION_ID.

O MT5 dispõe do evento Trade que pode ser manipulado no OnTradeTransacion() para saber a situação do pedido de negociação: Ordem --> Posição --> Encerramento.



void OnTradeTransaction(const MqlTradeTransaction & trans,
                        const MqlTradeRequest & request,
                        const MqlTradeResult & result)
  {
   ResetLastError();
   if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == ativo)
     {
      if(HistoryDealSelect(trans.deal))
        {
         deal_magic = HistoryDealGetInteger(trans.deal, DEAL_MAGIC);
         deal_entry = (ENUM_DEAL_ENTRY) HistoryDealGetInteger(trans.deal, DEAL_ENTRY);
         deal_reason = (ENUM_DEAL_REASON) HistoryDealGetInteger(trans.deal, DEAL_REASON);
         deal_type = trans.deal_type;
         if(deal_magic == inpMagicNumber)
           {
            if(deal_entry != DEAL_ENTRY_IN)
                // Teste saída parcial

            if((ENUM_DEAL_ENTRY)deal_entry == DEAL_ENTRY_IN)
                // Teste entrada parcial
        }
     }
   if(trans.type == TRADE_TRANSACTION_ORDER_ADD && trans.symbol == ativo)
      // ORDEM colocada da lista ordens
     
   if(trans.type == TRADE_TRANSACTION_ORDER_DELETE && trans.symbol == ativo)
      // ORDEM excluída da lista de ordens
 
   if(trans.type == TRADE_TRANSACTION_HISTORY_ADD && trans.symbol == ativo)
      // ORDEM executada ou cancelada e colocada no histórico    
  }