Erro 4756 intermitente

Para adicionar comentários, por favor Faça o login ou registrar
fernandoconcatto
35
fernandoconcatto  

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();

     } 

 }

lowinho
20
lowinho  
Mesmo erro, conseguiu resolver?

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

As corretoras brasileiras geralmente não aceitam ordem IOC.

Experimente trocar ORDER_FILLING_IOC por ORDER_FILLING_RETURN.

marcelodelta
263
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.

                  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());                
Jonathan Pereira
1059
Jonathan Pereira  
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.

marcelodelta
263
marcelodelta  

 Jonathan obrigado pela atenção.

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

Jonathan Pereira
1059
Jonathan Pereira  
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
marcelodelta
263
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?

if (rates[2].close > upBand[1]){  
                     trade.SellLimit(contratos,simbolo,NormalizeDouble(rates[2].close, 2),0,0,NULL);
                   } 
Jonathan Pereira
1059
Jonathan Pereira  
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.  
marcelodelta
263
marcelodelta  

 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
Trader_Patinhas
1127
Trader_Patinhas  
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 ... 

12
Para adicionar comentários, por favor Faça o login ou registrar