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
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(); }
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
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
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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