Order close

 
O meu envio de abertura está com abaixo, mas a função de fechar a ordem ORDER_TYPE_SELL ele não identifica a minha ordem de abertura e fecha...ele cria outras  de envio como sell

requisicao.action       = TRADE_ACTION_DEAL;                            
   requisicao.magic        = magic_number;                                 
   requisicao.symbol       = _Symbol;                                      
   requisicao.volume       = num_lots;                                     
   requisicao.price        = SymbolInfoDouble(_Symbol , SYMBOL_ASK);       
   requisicao.type         = ORDER_TYPE_BUY;                               
   requisicao.type_filling = ORDER_FILLING_FOK;                            
   requisicao.sl           = 0;
   requisicao.tp           = 0;
   requisicao.deviation    = 50;                                           
   OrderSend(requisicao,resposta);
//---
 
danielg13:
O meu envio de abertura está com abaixo, mas a função de fechar a ordem ORDER_TYPE_SELL ele não identifica a minha ordem de abertura e fecha...ele cria outras  de envio como sell

Releia sua frase. Veja se faz algum sentido.

Não da para entender nada. Você precisa expressar melhor sua duvida para que obtenha ajuda.

 
Joscelino Celso de Oliveira:

Releia sua frase. Veja se faz algum sentido.

Não da para entender nada. Você precisa expressar melhor sua duvida para que obtenha ajuda.

Realmente nao me expressei corretamente, segue reformulado:

Estou usando o codigo abaixo para Abertura de Ordem para BUY

requisicao.action       = TRADE_ACTION_DEAL;                            
   requisicao.magic        = magic_number;                                 
   requisicao.symbol       = _Symbol;                                      
   requisicao.volume       = num_lots;                                     
   requisicao.price        = SymbolInfoDouble(_Symbol , SYMBOL_ASK);       
   requisicao.type         = ORDER_TYPE_BUY;                               
   requisicao.type_filling = ORDER_FILLING_FOK;                            
   requisicao.sl           = 0;
   requisicao.tp           = 0;
   requisicao.deviation    = 50;                                           
   OrderSend(requisicao,resposta);

E para Fechar Ordem uso o seguinte :

      requisicao.action       = TRADE_ACTION_DEAL;
      requisicao.magic        = magic_number;
      requisicao.symbol       = _Symbol;
      requisicao.volume       = num_lots; 
      requisicao.price        = SymbolInfoDouble(Symbol(),SYMBOL_BID); 
      requisicao.deviation    = 5;                                            
      requisicao.type         = ORDER_TYPE_SELL;
      requisicao.type_filling = ORDER_FILLING_RETURN;
      OrderSend(requisicao,resposta);

O problema é que o código acima, não fecha a ORDEM, ela usa o mesmo MAGIC_NUMBER, mas no TESTADOR, ele faz como uma nova abertura mas como SELL.

O que preciso é fechar uma ORDEM que eu abri, no momento que eu atender as especificações para a mesma.

 

Meu caro, se vc está querendo encerrar uma posição comprada, utilize 

request.type = ORDER_TYPE_SELL

e preço pelo BID e vice-versa para a posição vendida.  Outra coisa, o código informado é para contas do tipo netting.... 

Sugiro consultar a documentação abaixo:

Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Trade Request Structure
Documentation on MQL5: Constants, Enumerations and Structures / Data Structures / Trade Request Structure
  • www.mql5.com
Interaction between the client terminal and a trade server for executing the order placing operation is performed by using trade requests. The trade request is represented by the special predefined structure of MqlTradeRequest type, which contain all the fields necessary to perform trade deals. The request processing result is represented by...
 
danielg13:

Realmente nao me expressei corretamente, segue reformulado:

Estou usando o codigo abaixo para Abertura de Ordem para BUY

E para Fechar Ordem uso o seguinte :

O problema é que o código acima, não fecha a ORDEM, ela usa o mesmo MAGIC_NUMBER, mas no TESTADOR, ele faz como uma nova abertura mas como SELL.

O que preciso é fechar uma ORDEM que eu abri, no momento que eu atender as especificações para a mesma.

@danielg13,


Primeiramente, parece-me que você esta confundindo "ordens" com "posições".

Sugiro que você leia o artigo neste link.

Alem disso, sugiro que repense a abordagem durante a elaboração de seu código. Você relata que quer encerrar a  ordem ( o correto seria posição) apos atender determinada especificação. Que especificação? Se for lucro, o ideal seria usar ordem TP, se for prejuízo, SL. Se a especificação for horário, use o encerramento por posição (ou posição oposta). Para conta netting veja a documentação aqui e para conta hedge, neste link.

Outro ponto importante eh se a conta eh netting ou hedge (como ja observado pelo @Rodolpho Nogueira De Sousa). Se você usar o código da forma que esta fazendo em conta hedge vai acabar por abrir nova posição. Cuidado com isso e pense nestas coisas.

Percebo também que você não verifica o resultado da função OrderSend() e que não trata eventuais erros. Tenha atenção neste ponto!!!

Por fim, sugiro que estude a classe CTRADE. Vai facilitar sua vida.


[ ]'s

 

Boa Tarde Pessoal, Tudo bem ?

Estou com o mesmo problema do nosso amigo acima, estava utilizando "ORDER_FILLING_RETURN" e meu programa enviava ordem de comprava/vendia em partes, porem na hora de fechar as posições ele acabava enviando ordens também, segue foto

Historico


Atualmente voltei para FOK ( que nunca tive problemas ), segue a programação ( Por favor, se tiver algo errado ou como melhor avisem, agradeço desde já )

Porem gostaria de utilizar a "ORDER_FILLING_RETURN" da forma correta, que não aconteça de enviar ordens "duplicadas eu acho"

Poderiam me ajudar a converter a programação abaixo que está em FOK para "ORDER_FILLING_RETURN" de forma correta ?

void CompraAMercado() // 
  {
   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_lots;                                     // Nº de Lotes
   requisicao.price        = SymbolInfoDouble(Symbol(),SYMBOL_ASK);        // Preço para a compra
   requisicao.sl           = tick.last-SL;                                 // Preço Stop Loss
   requisicao.tp           = tick.last+TP;                                 // Alvo de Ganho - Take Profit
   requisicao.deviation    = 10;                                           // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_BUY;                               // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                            // Tipo deo Preenchimento da ordem
   
   int ticket=OrderSend(requisicao,resposta);
   if(ticket<0)
     {
       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
     }
   else
      Print("Ordem de Compra executada com sucesso!");
     }
  
void VendaAMercado()
  {
   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_lots;                                     // Nº de Lotes
   requisicao.price        = SymbolInfoDouble(Symbol(),SYMBOL_BID);        // Preço para Venda
   requisicao.sl           = tick.last+SL;                                 // Preço Stop Loss
   requisicao.tp           = tick.last-TP;                                 // Alvo de Ganho - Take Profit
   requisicao.deviation    = 10;                                           // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_SELL;                              // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                            // Tipo deo Preenchimento da ordem
   
   int ticket=OrderSend(requisicao,resposta);
   if(ticket<0)
     {
       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
     }
   else
      Print("Ordem de Compra executada com sucesso!");
     }
 
void FechaCompra()
   {
      MqlTradeRequest   requisicao;    // requisição
      MqlTradeResult    resposta;      // resposta
      ZeroMemory(requisicao);
      ZeroMemory(resposta);
      requisicao.action       = TRADE_ACTION_DEAL;
      requisicao.magic        = magic_number;
      requisicao.symbol       = _Symbol;
      requisicao.volume       = num_lots; 
      requisicao.price        = 0; 
      requisicao.deviation    = 10;                                            
      requisicao.type         = ORDER_TYPE_SELL;
      requisicao.type_filling = ORDER_FILLING_FOK;
         
   int ticket=OrderSend(requisicao,resposta);
   if(ticket<0)
     {
       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
     }
   else
      Print("Ordem de Compra executada com sucesso!");
     }

void FechaVenda()
   {   
      MqlTradeRequest   requisicao;    // requisição
      MqlTradeResult    resposta;      // resposta
      ZeroMemory(requisicao);
      ZeroMemory(resposta);
      requisicao.action       = TRADE_ACTION_DEAL;
      requisicao.magic        = magic_number;
      requisicao.symbol       = _Symbol;
      requisicao.volume       = num_lots; 
      requisicao.price        = 0;
      requisicao.deviation    = 10;                                            
      requisicao.type         = ORDER_TYPE_BUY;
      requisicao.type_filling = ORDER_FILLING_FOK;
   
   int ticket=OrderSend(requisicao,resposta);
   if(ticket<0)
     {
       Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
     }
   else
      Print("Ordem de Compra executada com sucesso!");
     }
Razão: