Cancelar Ordem Pendente (Setup 9.1)

 

Estou criando um EA baseado no setup do Larry Williams, mas estou tendo dificuldade para fechar uma odem pendente, caso o proximo candle não ative a ordem. 

Aqui está parte do meu codigo:

 //TOMADA DE DECISÂO
   if(rates[1].open < ma[1] && rates[1].close > ma[1] && ma[1] > ma[2] && ma[1] > ma_filtro[1] && HoraNegociacao() && PositionsTotal()==0 && OrdersTotal()==0)
   {
      double prec_entrada = rates[1].high + (30*_Point);
      double sl = rates[1].low - (30*_Point);
      trade.BuyStop(contratos,prec_entrada,Symbol(),sl,0,0,0,"LW | COMPRADO");
   }
   
      if(rates[1].open > ma[1] && rates[1].close < ma[1] && ma[1] < ma[2] && ma[1] < ma_filtro[1] && HoraNegociacao() && PositionsTotal()==0 && OrdersTotal()==0)
   {
      double prec_entrada = rates[1].low - (30*_Point);
      double sl = rates[1].high + (30*_Point);
      trade.SellStop(contratos,prec_entrada,Symbol(),sl,0,0,0,"LW | VENDIDO");
   }
   //---------------------------------------------
   
   
   //MOVER STOP
   if(PositionsTotal() == 1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
   {
      MoverStop_Compra(rates[1].low);
   }
   
     if(PositionsTotal() == 1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
   {
      MoverStop_Venda(rates[1].high);
   }
   //-------------------------------------
   
   //CANCELAR ORDEM
   CancelarOrdem_Compra(rates[1].close);
   CancelarOrdem_Venda(rates[1].close);
  }
//+------------------------------------------------------------------+
void CancelarOrdem_Compra(double fech_ant){
   for(int i=OrdersTotal()-1; i>=0; i--){
   ulong ticket = OrderGetTicket(i);
   string symbol = OrderGetString(ORDER_SYMBOL);
   ulong magic = OrderGetInteger(ORDER_MAGIC);
   double prec = OrderGetDouble(ORDER_PRICE_OPEN);
   if(symbol == _Symbol && magic == MagicNum){
   if(!rates[1].close > rates[2].high + (30*_Point) && OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_BUY){
   trade.OrderDelete(ticket);
   }
   }
   
   }
}

void CancelarOrdem_Venda(double fech_ant){
   for(int i=OrdersTotal()-1; i>=0; i--){
   ulong ticket = OrderGetTicket(i);
   string symbol = OrderGetString(ORDER_SYMBOL);
   ulong magic = OrderGetInteger(ORDER_MAGIC);
   double prec = OrderGetDouble(ORDER_PRICE_OPEN);
   if(symbol == _Symbol && magic == MagicNum){
   if(!rates[1].close < rates[2].low - (30*_Point) && OrderGetInteger(ORDER_TYPE)==ORDER_TYPE_SELL){
   trade.OrderDelete(ticket);
   }
   }
   
   }
}


 

Para eliminar as ordens pendentes tente a lógica abaixo:


        for(int i = OrdersTotal() - 1; i >= 0; i--) 

        {

              if(OrderGetTicket(i) > 0) 

              {

                  if (OrderGetString(ORDER_SYMBOL)==Symbol())

                  {                      

                      trade.OrderDelete(OrderGetTicket(i));  

                  }

              }

        }


 
Ivan Ronchi:

Para eliminar as ordens pendentes tente a lógica abaixo:


        for(int i = OrdersTotal() - 1; i >= 0; i--) 

        {

              if(OrderGetTicket(i) > 0) 

              {

                  if (OrderGetString(ORDER_SYMBOL)==Symbol())

                  {                      

                      trade.OrderDelete(OrderGetTicket(i));  

                  }

              }

        }


Sim amigo!! Fechar a ordem eu consigo... A dúvida é, como eu consigo idenficar se o candle anterior não abriu a ordem ? Sendo que desta forma:

if(!rates[1].close > rates[2].high + (30*_Point)

Ele olhara para o candle anterior e o candle anterior é o candle que foi usado como parâmetro pra abertura de ordem, logo ele não é maior que 30 pontos acima da máxima do anterior, dessa forma o robô fica posicionando e cancelando a ordem sem parar.

E mesmo que eu faça:

if(rates[1].close < ma[1]
Isso não funciona tambem, no caso de uma ordem de compra.
 
Fala amigo, conseguiu achar a solução ?
 
daniel.moura #:
Fala amigo, conseguiu achar a solução ?


Segue exemplo (não testado):

   for(int cnt = OrdersTotal() - 1; cnt >= 0; cnt --)
     {
      ulong ticket = OrderGetTicket(cnt);
      if(ticket == 0)
        {
         Print("Failed to get order ticket...");
         return;
        }
      if(OrderGetString(ORDER_SYMBOL) == _Symbol)
        {
         int OrdTimeIdx = iBarShift(_Symbol, PERIOD_CURRENT, OrderGetInteger(ORDER_TIME_SETUP), false);
         if(OrdTimeIdx < 0)
           {
            return;
           }
         if(OrdTimeIdx > 0)
           {
            trade.OrderDelete(ticket);
           }
        }
     }



... Se preferir não utilizar o iBarShift():

. . .

if(OrderGetInteger(ORDER_TIME_SETUP) < iTime(_Symbol, PERIOD_CURRENT, 0))
  {
   trade.OrderDelete(ticket);
  }
Razão: