Erro 4756 intermitente

 

Olá.

Tem ocorrido de forma intermitente o erro 4756 na abertura de ordens através de robô em ativos ações.

Porém o detalhe é que esse erro é intermitente. Envio uma abertura de posição com preço de entrada, tp, sl e número de lotes e ocorre o erro. Minutos ou segundos depois envio a ordem com os mesmos dados e valores e dá certo, sem ocorrer o erro.

Se alguém puder me dar uma luz do que pode ser esse erro, agradeço.

Obs.: Estou executando em bases de demonstração da XP e Modal e o erro ocorre em ambas.


Segue o código da rotina para envio de ordem que estou utilizando:

void OrdemVenda()

  {

   MqlTradeRequest   requisicao;    // requisição

   MqlTradeResult    resposta;      // resposta

   

   ZeroMemory(requisicao);

   ZeroMemory(resposta);

   

   requisicao.action       = TRADE_ACTION_DEAL;                            // Executa ordem a mercado        

   requisicao.magic        = magic_number;                                 // Nº mágico da ordem

   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo

   requisicao.volume       = num_lotes;                                    // Nº de Lotes

   requisicao.price        = NormalizeDouble(preco_entrada,_Digits);       // Preço para Venda               

   requisicao.sl           = NormalizeDouble(preco_objetivo_loss,_Digits); // Preço Stop Loss

   requisicao.tp           = NormalizeDouble(preco_objetivo_gain,_Digits); // Alvo de Ganho - Take Profit

   requisicao.deviation    = 0;                                            // Desvio Permitido do preço

   requisicao.type         = ORDER_TYPE_SELL;                              // Tipo da Ordem                 

   requisicao.type_filling = ORDER_FILLING_IOC;                            // Tipo de Preenchimento da ordem

   //---

   OrderSend(requisicao,resposta);

   //---

   if(resposta.retcode == 10008 || resposta.retcode == 10009)

     {

      Print("Ativo - ",Symbol()," - Ordem de Venda executada com sucesso!");

     }

   else

     {

      Print("Ativo - ",Symbol()," - Erro ao enviar Ordem Venda. Erro = ", GetLastError());

      ResetLastError();

     } 

 }

 
Mesmo erro, conseguiu resolver?

O mesmo robô funciona na máquina de um amigo.
 

As corretoras brasileiras geralmente não aceitam ordem IOC.

Experimente trocar ORDER_FILLING_IOC por ORDER_FILLING_RETURN.

 

 Patinhas, ajuda novamente? =)

 Estou com mesmo erro. Porém no meu caso é para ordem de saída. Pois consigo enviar a ordem de entradas normalmente.

 Como faço para executar a saída. 


 Obrigado pessoal.

                  request.action   = TRADE_ACTION_CLOSE_BY;                 
                  request.symbol   = "WINM20";                                                              
                  request.type     = ORDER_TYPE_SELL_STOP_LIMIT;               
                  request.price    = NormalizeDouble(rates[1].open, Digits()); 
                  request.magic    = magicNum;  
                  request.type_filling=ORDER_FILLING_RETURN;
                  
               
                  if(!OrderSend(request,result))
                     PrintFormat("Pegar erro %d",GetLastError());                
 
marcelodelta:

 Patinhas, ajuda novamente? =)

 Estou com mesmo erro. Porém no meu caso é para ordem de saída. Pois consigo enviar a ordem de entradas normalmente.

 Como faço para executar a saída. 


 Obrigado pessoal.

use a classe CTrade e não se preocupe com o preenchimento.

 

 Jonathan obrigado pela atenção.

 Mais estou tentando enviar ordem para outro símbolo a partir deste gráfico.

 
marcelodelta:

 Jonathan obrigado pela atenção.

 Mais estou tentando enviar ordem para outro símbolo a partir deste gráfico.

Ué e qual o problema??

Funciona da na mesma forma, só definir o symbol que esta mandando a ordem.

assinatura do metodo sell e buy


bool CTrade::Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")

bool CTrade::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")


Basta ler a documentação que vc vai notar que tem como.


https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade

Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade
Documentação sobre MQL5: Biblioteca Padrão / Classes de negociação / CTrade
  • www.mql5.com
Biblioteca Padrão / Classes de negociação / CTrade - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 

 Jonathan Muito obrigado pela atenção, funcionou perfeitamente na entrada.

 

 Poderia ajudar mais algo.


Como faço uma saída no preço. Por exemplo quando chegar na linha inferior de um Bolinger?

if (rates[2].close > upBand[1]){  
                     trade.SellLimit(contratos,simbolo,NormalizeDouble(rates[2].close, 2),0,0,NULL);
                   } 
 
marcelodelta:

 Jonathan Muito obrigado pela atenção, funcionou perfeitamente na entrada.

 

 Poderia ajudar mais algo.


Como faço uma saída no preço. Por exemplo quando chegar na linha inferior de um Bolinger?

Você pode usar um PositionClose para fechar a mercado ou no caso de estar comprado usar um SellStop, vendido seria um BuyLimit(problema disso é que o valor da banda vai mudando conforme novos candles vão formando) ai teria que ir modificando suas ordens pendentes, pode ser que volte para o negativo e não pegue sua saída.

Mas isso depende muito da sua estratégia de saída, há varias formas de se sair nessa situação, num cenário de compra, poderia por um sellstop pouco abaixo da intersecção do preço X banda, poderia por um selllimit ligeiramente acima, fechar a mercado, mover o stop para mediana do boliguer, como disse depende muito do que realmente vc quer fazer.  
 

 Perfeito. 

 Como tenho dois robôs para o mesmo ativo PositionClose não funcionaria pois ele cancelaria todas a ordens em aberto, certo?

 Se tivesse a opção de ticket e symbol ao mesmo tempo. 

 Ele não encontra o symbolo remoto. Que seria WINM20
2020.05.26 17:00:11.764 Ticks   old tick WINM20.GRAFICOv2 (tick: 2020.05.26 16:59:00.097, last: 2020.05.26 17:00:00.008) 85600/85605
 
marcelodelta:

 Patinhas, ajuda novamente? =)

 Estou com mesmo erro. Porém no meu caso é para ordem de saída. Pois consigo enviar a ordem de entradas normalmente.

 Como faço para executar a saída. 


 Obrigado pessoal.

Mas qual o erro que está dando?

Se for ordem inválida, vc tem que verificar:

- se o preço é múltiplo de 5

- se o preço está acima do preço ASK

- se a sua conta é conta hedging (acho que somente nesse tipo de conta funciona o TRADE_ACTION_CLOSE_BY) 

- sendo conta hedging, se a posição que está sendo fechada ainda está ativa

- se o volume corresponde ao volume da posição que está sendo fechada

- e por aí vai ... 

Razão: