Ordens pendentes negadas pelo servidor. Mensagem: "Order received. Sending to OMS"

 

Pessoal, 

               gostaria da ajuda de vocês para saber se alguém passa ou passou pelo mesmo problema que estou passando. Desenvolvi um robô que envia ordens pendentes mas estou recebendo cancelamento do servidor da XP Corretora sem qualquer indicação ou causa do erro. Como podemos verificar nos logs do Terminal MT5 (vide imagens anexas),  o servidor confirma que as ordens pendente foram colocadas, chegando a retornar o ticket da ordem, porém em seguida informa a mensagem "Order received. Sending to OMS." e cancela minhas ordens sem qualquer notificação de erro identificáveis nos logs do terminal. Esse comportamento somente acontece na conta real, na conta demo não havia qualquer anomalia quando tentava enviar ordens pendentes (Sell Limit e Buy Limit).

 

Sds, 

 

Sergio Brito 

 
sergio.brito:

Pessoal, gostaria da ajuda de vocês para saber se alguém passa ou passou pelo mesmo problema que estou passando. Desenvolvi um robô que envia ordens pendentes mas estou recebendo cancelamento do servidor da XP Corretora sem qualquer indicação ou causa do erro. Como podemos verificar nos logs do Terminal MT5 (vide imagens anexas),  o servidor confirma que as ordens pendente foram colocadas, chegando a retornar o ticket da ordem, porém em seguida informa a mensagem "Order received. Sending to OMS." e cancela minhas ordens sem qualquer notificação de erro identificáveis nos logs do terminal. Esse comportamento somente acontece na conta real, na conta demo não havia qualquer anomalia quando tentava enviar ordens pendentes (Sell Limit e Buy Limit).

Sds, 

Sergio Brito 

Olá sergio.brito,

Seria interessante se você pudesse colocar aqui trechos do código que você está utilizando, especificamente a parte onde você faz o roteamento das ordens.

Talvez algum dos parâmetros possa estar errado e, na minha opinião, essa seria a melhor forma de ajudá-lo.

Abraços 

 
Rodrigo Malacarne:

Olá sergio.brito,

Seria interessante se você pudesse colocar aqui trechos do código que você está utilizando, especificamente a parte onde você faz o roteamento das ordens.

Talvez algum dos parâmetros possa estar errado e, na minha opinião, essa seria a melhor forma de ajudá-lo.

Abraços 

Olá Rodrigo Malacarne,

 

                                     deixei a mesma dúvida para você lá no fórum em inglês, favor desconsiderar. Segue abaixo o trecho do código. Desconfiei da mesma coisa que você e coloquei os parâmetros expiration=0 e comment=""(vazio) mas não funcionou. Pode ser o parâmetro ORDER_TIME_GTC que está errado? Vi lá nas referências e achei que não seria ele. Não testei outros parâmetros de ORDER_TIME. Aguardo sua análise, muito obrigado!

 

int OnInit(){

   //--- configuração do número mágico do robô
      int MagicNumber=123456;
      Trade.SetExpertMagicNumber(MagicNumber);
   //--- mode de preenchimento de ordem
      Trade.SetTypeFilling(ORDER_FILLING_FOK);
   //--- modo de geração de logs 
      Trade.LogLevel(1);
}

 

 

         double volume=Lots;
         string symbol=_Symbol;    // specify the symbol, at which the order is placed
         double point=SymbolInfoDouble(symbol,SYMBOL_POINT);         // point
         double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);             // current buy price
         double bid=SymbolInfoDouble(symbol,SYMBOL_BID);             // current sell price
         double price_buy=bid;                                 // preço de compra não normalizado
         double price_sell=ask;                                 // preço de venda não normalizado
         price_buy=NormalizeDouble(price_buy,2);                      // normalizing open price
         price_sell=NormalizeDouble(price_sell,2);                      // normalizing open price
         double SL_BuyLimit=price_buy-SL+point;  // Stop Loss não normalizado das ordens BuyLimit
         double SL_SellLimit=price_sell+SL*point;  // Stop Loss não normalizado das ordens SellLimit
         SL_BuyLimit=NormalizeDouble(SL_BuyLimit,2);  // Stop Loss normalizado das ordens BuyLimit
         SL_SellLimit=NormalizeDouble(SL_SellLimit,2);  // Stop Loss normalizado das ordens SellLimit
         double TP_BuyLimit=price_buy+TP*point;  // Stop Loss não normalizado das ordens BuyLimit
         double TP_SellLimit=price_sell-TP*point;  // Stop Loss não normalizado das ordens SellLimit
         TP_BuyLimit=NormalizeDouble(TP_BuyLimit,2);  // Stop Loss normalizado das ordens BuyLimit
         TP_SellLimit=NormalizeDouble(TP_SellLimit,2);  // Stop Loss normalizado das ordens SellLimit
         datetime expiration=TimeTradeServer()+PeriodSeconds(PERIOD_D1);
         string comment_buy=StringFormat("Buy Limit %s, lote de %d ações a %f, SL=%f TP=%f",
                               symbol,volume,
                               DoubleToString(price_buy,2),
                               DoubleToString(SL_BuyLimit,2),
                               DoubleToString(TP_BuyLimit,2));
         string comment_sell=StringFormat("Sell Limit %s, lote de %d ações a %f, SL=%f TP=%f",
                               symbol,volume,
                               DoubleToString(price_sell,2),
                               DoubleToString(SL_SellLimit,2),
                               DoubleToString(TP_SellLimit,2));
                               
         //--- Todas as variaveis prontas, enviando ordens pendentes de BuyLimit e SellLimit ao servidor
         if(!Trade.BuyLimit(volume,price_buy,symbol,SL_BuyLimit,TP_BuyLimit,ORDER_TIME_GTC,expiration,comment_buy))
           {
           //--- Mensagem caso a ordem BuyLimit falhe
           Print("BuyLimit() method failed. Return code=",Trade.ResultRetcode(),
                 ". Descrição do código: ",Trade.ResultRetcodeDescription());
           }
         else
           {
           //--- Mensagem caso a ordem seja executada com sucesso
           Print("BuyLimit() method executed successfully. Return code=",Trade.ResultRetcode(),
                 " (",Trade.ResultRetcodeDescription(),") and Ticket order=", Trade.ResultOrder());
           buylimit_order=Trade.ResultOrder();
           }                      
         if(!Trade.SellLimit(volume,price_sell,symbol,SL_SellLimit,TP_SellLimit,ORDER_TIME_GTC,expiration,comment_buy))
           {
           //--- Mensagem caso a ordem BuyLimit falhe
           Print("SellLimit() method failed. Return code=",Trade.ResultRetcode(),
                 ". Descrição do código: ",Trade.ResultRetcodeDescription());
           }
         else
           {
           Print("SellLimit() method executed successfully. Return code=",Trade.ResultRetcode(),
                 " (",Trade.ResultRetcodeDescription(),") and Ticket order=", Trade.ResultOrder());
           selllimit_order=Trade.ResultOrder();
           }  

 

 

         

 
sergio.brito:

Olá Rodrigo Malacarne, deixei a mesma dúvida para você lá no fórum em inglês, favor desconsiderar. Segue abaixo o trecho do código. Desconfiei da mesma coisa que você e coloquei os parâmetros expiration=0 e comment=""(vazio) mas não funcionou. Pode ser o parâmetro ORDER_TIME_GTC que está errado? Vi lá nas referências e achei que não seria ele. Não testei outros parâmetros de ORDER_TIME. Aguardo sua análise, muito obrigado!

Olá sergio.brito,

Experimente trocar dentro de OnInit a seguinte linha:

Trade.SetTypeFilling(ORDER_FILLING_FOK);

 para

Trade.SetTypeFilling(ORDER_FILLING_RETURN);

Por favor não esqueça de nos reportar o resultado!

Abraços,
Malacarne

 
Rodrigo Malacarne:

Olá sergio.brito,

Experimente trocar dentro de OnInit a seguinte linha:

 para

Por favor não esqueça de nos reportar o resultado!

Abraços,
Malacarne

Rodrigo, 

 

                foi exatamente isso. Resolveu. Muito obrigado!

 

Sds,

Sérgio Brito 

 
Eu estava com esse problema e, realmente, só acontece na real. Valeu!
Razão: