MT5 Rotina para Fechar as ordens pendentes

Rodrigo Evaldo Schwambach  

Fala gurizada.


Observei algo um pouco atípico, no Strategy Tester a rotina funciona conforme esperado. Contudo na conta real, observei que não exluiu as ordens pendentes (BUY LIMIT).

Poderiam verificar o que há de incorreto? Senão fornecer outra rotina para excluir todas as ordens de um simbolo específico?


//Fecha todas as ordens pendentes
void FecharOrdensPendentes(){
    
   int positions,orders;
   ulong inpMagic = 0;
   ulong ticket = PositionGetInteger(POSITION_TICKET);
   int orderType = (int)PositionGetInteger(POSITION_TYPE) ;
   int orderPendingType = (int)OrderGetInteger(ORDER_TYPE);
   string orderSymbol = PositionGetString(POSITION_SYMBOL);
   string orderPendingSymbol = OrderGetString(ORDER_SYMBOL);
   ulong orderPendingTicket = OrderGetInteger(ORDER_TICKET);
   ulong orderMagicNumber = PositionGetInteger(POSITION_MAGIC);
   ulong orderPendingMagicNumber = OrderGetInteger(ORDER_MAGIC);

   for(orders=OrdersTotal()-1;orders>=0;orders--)
     {

      ulong numOrderTicket = OrderGetTicket(orders);
      //if( (orderSymbol == _Symbol) && (orderMagicNumber==ID) ){
      if( (orderSymbol == _Symbol)  ){
         trade.OrderDelete(numOrderTicket);
      }

     }

}
Ricardo Rodrigues Lucca  
Rodrigo Evaldo Schwambach:

Fala gurizada.


Observei algo um pouco atípico, no Strategy Tester a rotina funciona conforme esperado. Contudo na conta real, observei que não exluiu as ordens pendentes (BUY LIMIT).

Poderiam verificar o que há de incorreto? Senão fornecer outra rotina para excluir todas as ordens de um simbolo específico?


Esta misturando posicao com ordens. Se voce tem uma posição selecionada, voce pode pegar os dados da posicao com PositionGet*, pra pegar dados de ordens somente via OrderGet* e a mesma regra se aplica. Tu precisa ter dado um orderselect ou orderselectbyticket para pegar os dados corretamente. Assim, se mover a atribuicao do "orderPendingSymbol" pra depois de ter obtido o valor do ticket, já esta tudo bem com esse dado, dai basta corrigir o if para usar essa variavel.

Rodrigo Evaldo Schwambach  
Ricardo Rodrigues Lucca #:

Esta misturando posicao com ordens. Se voce tem uma posição selecionada, voce pode pegar os dados da posicao com PositionGet*, pra pegar dados de ordens somente via OrderGet* e a mesma regra se aplica. Tu precisa ter dado um orderselect ou orderselectbyticket para pegar os dados corretamente. Assim, se mover a atribuicao do "orderPendingSymbol" pra depois de ter obtido o valor do ticket, já esta tudo bem com esse dado, dai basta corrigir o if para usar essa variavel.

Valeu guri.

Encontrei mais um probleminha a corretora (brasileira óbvio, gambiarra sempre há) também havia uma espécie de delay na confirmação para deletar as ordens pendentes.  Como a instrução OrderDelete está num loop FOR, o MT5 cliente roda mais rápido do que o servidor da corretora. Observei no LOG que dava erro, "falha para cancelar a ordem", levava quase 100mS para confirmar o cancelamento, sendo o ping é de 15 mS. Bom, o jeito foi fazer uma rotina de scan de verificação.

Mesmo assim, obrigado.

Ricardo Rodrigues Lucca  
Rodrigo Evaldo Schwambach #:

Valeu guri.

Encontrei mais um probleminha a corretora (brasileira óbvio, gambiarra sempre há) também havia uma espécie de delay na confirmação para deletar as ordens pendentes.  Como a instrução OrderDelete está num loop FOR, o MT5 cliente roda mais rápido do que o servidor da corretora. Observei no LOG que dava erro, "falha para cancelar a ordem", levava quase 100mS para confirmar o cancelamento, sendo o ping é de 15 mS. Bom, o jeito foi fazer uma rotina de scan de verificação.

Mesmo assim, obrigado.

Tem uma no mercado brasileiro que não devolve cancelamento (se for sincrono vai ficar preso uns 2 minutos acredito), mas ti devolve quase instantaneamente um reject na ordem cancelada (e isso o terminal não entende e fica aguardando o timeout).