"Modification Failed due to order or position being close to market" utilizando meu EA

 

Estou usando meu EA na XP e estou tendo um problema, que não achei solução aqui no forum. Quando eu envio uma ordem  Sell Stop Limit ou Buy Stop Limit e ela atinge o preço de envio da ordem mas não é executada e fica pendente eu não consigo excluir até ela conseguir ser executada. NNão consigo excluir pelo MT5 na XP, mas consigo pelo home broker. Quando eu vou deletar ela, aparece esse erro: "Modification Failed due to order or position being close to market"

Alguém sabe alguma solução?


 for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders

     {

      if(myorder.SelectByIndex(i)) // selects the pending order by index for further access to its properties

        {

         if(myorder.Symbol()!=mysymbol.Name() || myorder.Magic()!=Magic_Number)continue;

         if(myorder.OrderType()!=ORDER_TYPE_BUY_STOP_LIMIT && myorder.OrderType()!=ORDER_TYPE_SELL_STOP_LIMIT)continue;

         if(myorder.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT)

           {

            price_order=OrderGetDouble(ORDER_PRICE_OPEN);

            if(SymbolInfoDouble(_Symbol,SYMBOL_BID)>price_order+2*ticksize)

              {

               DeleteALL();

               CloseALL();

               mensagens=__FUNCSIG__+" Ordem BUY STOP LIMIT aberta não executada. Fechando Posições."+"\n"

                         +"BID "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits)+

                         " Preço da Ordem "+DoubleToString(price_order,_Digits);

               WriteToFile(filelog,mensagens);

               Print(mensagens);

               return;

              }


           }

         if(myorder.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)

           {

            price_order=OrderGetDouble(ORDER_PRICE_OPEN);

            if(SymbolInfoDouble(_Symbol,SYMBOL_ASK)<price_order-2*ticksize)

              {

               DeleteALL();

               CloseALL();

               mensagens=__FUNCSIG__+" Ordem SELL STOP LIMIT aberta não executada. Fechando Posições."+"\n"

                         +"ASK "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits)+

                         " Preço da Ordem "+DoubleToString(price_order,_Digits);

               WriteToFile(filelog,mensagens);

               Print(mensagens);

               return;

              }


           }


        }//Order Select

     }//Fim for

 
Vinnycruz:


Bom dia, 

uma observação antes da resposta, use o copiador de código Alt-S para colar códigos,  a postagem fica mais inteligível, então vamos lá.


... Ao executar o start do BUY/SELL STOP LIMIT a oferta vai para pedra, até aqui tudo OK, mas dizer que o MT5 que não pode exclui-la e que você é obrigado a usar o HB isso é um problema e deve ser relatado ao suporte da XP.


... Agora um fato que você precisa saber é que as operações feitas no HB não são sincronizadas com o terminal MT5  de forma automática,  então quando você exclui uma ordem pelo HB ela permanece no MT5 e ao tentar excluir dá o erro  "Modification Failed due to order or position being close to market"

 
Rogerio Giannetti Torres:

Bom dia, 

uma observação antes da resposta, use o copiador de código Alt-S para colar códigos,  a postagem fica mais inteligível, então vamos lá.


... Ao executar o start do BUY/SELL STOP LIMIT a oferta vai para pedra, até aqui tudo OK, mas dizer que o MT5 que não pode exclui-la e que você é obrigado a usar o HB isso é um problema e deve ser relatado ao suporte da XP.


... Agora um fato que você precisa saber é que as operações feitas no HB não são sincronizadas com o terminal MT5  de forma automática,  então quando você exclui uma ordem pelo HB ela permanece no MT5 e ao tentar excluir dá o erro  "Modification Failed due to order or position being close to market"


Obrigado pelo comentário. Quando excluo pelo home broker, imediatamente ela some do mt5. Vou relatar ao suporte da XP, mas se alguém mais tiver alguma ideia de como consertar no próprio ea, agradeço demais... 
 
Vinnycruz:

Estou usando meu EA na XP e estou tendo um problema, que não achei solução aqui no forum. Quando eu envio uma ordem  Sell Stop Limit ou Buy Stop Limit e ela atinge o preço de envio da ordem mas não é executada e fica pendente eu não consigo excluir até ela conseguir ser executada. NNão consigo excluir pelo MT5 na XP, mas consigo pelo home broker. Quando eu vou deletar ela, aparece esse erro: "Modification Failed due to order or position being close to market"

Alguém sabe alguma solução?


 for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders

     {

      if(myorder.SelectByIndex(i)) // selects the pending order by index for further access to its properties

        {

         if(myorder.Symbol()!=mysymbol.Name() || myorder.Magic()!=Magic_Number)continue;

         if(myorder.OrderType()!=ORDER_TYPE_BUY_STOP_LIMIT && myorder.OrderType()!=ORDER_TYPE_SELL_STOP_LIMIT)continue;

         if(myorder.OrderType()==ORDER_TYPE_BUY_STOP_LIMIT)

           {

            price_order=OrderGetDouble(ORDER_PRICE_OPEN);

            if(SymbolInfoDouble(_Symbol,SYMBOL_BID)>price_order+2*ticksize)

              {

               DeleteALL();

               CloseALL();

               mensagens=__FUNCSIG__+" Ordem BUY STOP LIMIT aberta não executada. Fechando Posições."+"\n"

                         +"BID "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits)+

                         " Preço da Ordem "+DoubleToString(price_order,_Digits);

               WriteToFile(filelog,mensagens);

               Print(mensagens);

               return;

              }


           }

         if(myorder.OrderType()==ORDER_TYPE_SELL_STOP_LIMIT)

           {

            price_order=OrderGetDouble(ORDER_PRICE_OPEN);

            if(SymbolInfoDouble(_Symbol,SYMBOL_ASK)<price_order-2*ticksize)

              {

               DeleteALL();

               CloseALL();

               mensagens=__FUNCSIG__+" Ordem SELL STOP LIMIT aberta não executada. Fechando Posições."+"\n"

                         +"ASK "+DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits)+

                         " Preço da Ordem "+DoubleToString(price_order,_Digits);

               WriteToFile(filelog,mensagens);

               Print(mensagens);

               return;

              }


           }


        }//Order Select

     }//Fim for

Tente usar a função abaixo (realize alterações na mesma se necessário). Veja se resolve o problema.

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|Funcao exclui ordens pendentes                                    |
//+------------------------------------------------------------------+
void ExcluiOrdens()
  {
//-- Declaração e inicialização do pedido e resultado 
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
   int total=OrdersTotal(); // número de ordens pendentes colocadas 
//--- iterar todas as ordens pendentes colocadas 
   for(int i=total-1; i>=0; i--)
     {
      ulong order_ticket=OrderGetTicket(i); // bilhete da ordem
      ulong magic=OrderGetInteger(ORDER_MAGIC); // MagicNumber da ordem 
      //--- se o MagicNumber coincidir
      if(magic==EXPERT_MAGIC)
        {
         //--- zerar os valores do pedido e o resultado
         ZeroMemory(request);
         ZeroMemory(result);
         //--- instalação de parâmetros de operação 
         request.action=TRADE_ACTION_REMOVE; // tipo de operação de negociação
         request.order=order_ticket; // bilhete da ordem
         //--- envio do pedido
         if(!OrderSend(request,result))
            PrintFormat("OrderSend error %d",GetLastError()); // Se não for capaz de enviar o pedido, exibir um código de erro 
            string msg = "Verifique o robo urgente!";//-- Mensagem de notificacao APP
            SendNotification(msg);
         //--- informações sobre a operação 
         PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
        }
     }
  }
 
Vinnycruz:

Obrigado pelo comentário. Quando excluo pelo home broker, imediatamente ela some do mt5. Vou relatar ao suporte da XP, mas se alguém mais tiver alguma ideia de como consertar no próprio ea, agradeço demais... 

Você diz que:  Quando exclue pelo home broker, imediatamente ela some do mt5,   Não é ao contrário?   Tenho que rever isso.  Já faz uma tempão que não uso o HB da XP. pois só o opero usando o MT5, vou na Segunda fazer um teste.

Razão: