Como fechar uma posição?

Para adicionar comentários, por favor Faça o login ou registrar
Sergio Gelli
335
Sergio Gelli  

O codigo abaixo abre uma posição de compra sem problemas.

         mrequest.action = TRADE_ACTION_DEAL;                        // immediate order execution
         mrequest.price = ASCPRICE;                                             // latest ask price
         mrequest.sl = MyStop;                                                       // Stop Loss
         mrequest.tp = MyProft;                                                      //  Take Profit
         mrequest.symbol = _Symbol;                                             // currency pair
         mrequest.volume = Lot;                                                     // number of lots to trade
         mrequest.magic = EA_Magic;                                             // Order Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                // Buy Order
         mrequest.type_filling = ORDER_FILLING_FOK;                 // Order execution type
         mrequest.deviation=100;                                                   // Deviation from current price
        OrderSend(mrequest,mresult);

Como faço para fechar essa posição quando ocorrer um evento ?

Agradeço antecipadamente.

Rogerio Figurelli
Moderador
58519
Rogerio Figurelli  
Sergio Gelli:

O codigo abaixo abre uma posição de compra sem problemas.

Como faço para fechar essa posição quando ocorrer um evento ?

Agradeço antecipadamente.

Olá Sergio Gelli, para postar códigos aqui por favor utilize o botão SRC do editor (já fiz a alteração no seu post com esse recurso).

Quanto à pergunta, note que esse código que você postou é simplificado e tem vários ítens de ajuste, como por exemplo testar o retorno da função OrderSend().

Seja como for, para ajudar na resposta, no MT5 a posição é fechada se você encaminhar uma ordem com o mesmo volume da posição, porém do tipo oposto, que no exemplo seria SELL, já que você executou um BUY. 

Sergio Gelli
335
Sergio Gelli  
Rogerio Figurelli:

Olá Sergio Gelli, para postar códigos aqui por favor utilize o botão SRC do editor (já fiz a alteração no seu post com esse recurso).

Quanto à pergunta, note que esse código que você postou é simplificado e tem vários ítens de ajuste, como por exemplo testar o retorno da função OrderSend().

Seja como for, para ajudar na resposta, no MT5 a posição é fechada se você encaminhar uma ordem com o mesmo volume da posição, porém do tipo oposto, que no exemplo seria SELL, já que você executou um BUY. 

Obrigado Sr Rogério, sua orientação sobre SRC está anotada.

Um pouco difícil de entender essa lógica. Ordens enviadas em tempos diferentes, certamente vão encontrar preços diferentes gerando lucros ou perdas diferentes, então como um pode ? Isso seria explicado quando vemos o histórico de negociações, onde aparece um BUY quando compramos e ao fechar essa posição, aparece um SELL ?

Neste caso, imagino que não há necesidade de enviar todos os outros itens de ajuste da ordem para fechamento, mas acredito também que alguns são obrigatórios. Poderia informar quais deles?

Rogerio Figurelli
Moderador
58519
Rogerio Figurelli  
Sergio Gelli:

Obrigado Sr Rogério, sua orientação sobre SRC está anotada.

Um pouco difícil de entender essa lógica. Ordens enviadas em tempos diferentes, certamente vão encontrar preços diferentes gerando lucros ou perdas diferentes, então como um pode ? Isso seria explicado quando vemos o histórico de negociações, onde aparece um BUY quando compramos e ao fechar essa posição, aparece um SELL ?

Neste caso, imagino que não há necesidade de enviar todos os outros itens de ajuste da ordem para fechamento, mas acredito também que alguns são obrigatórios. Poderia informar quais deles?

Olá Sergio Gelli, essa é a lógica do mercado, se você encaminhou uma ordem e abriu uma posição, o momento que encerrar essa posição irá influenciar em lucros ou perdas diferentes, uma vez que os preços estão mudando em tempo real, a cada nova transação entre vendedores e compradores do instrumento financeiro que você está posicionado.

Quanto ao histórico, o que você comentou vale tanto para uma ordem de BUY no início (long position) como de SELL (short position), uma vez que você também pode entrar 'vendido'. 

Quanto a enviar todos os itens, isso depende muito da posição atual, portanto recomendo não fazer essa análise no nível de ordens já encaminhadas, mas sim de verificação e análise da posição atual e de qual é a ordem necessária para encerrar essa posição.

Sergio Gelli
335
Sergio Gelli  
Rogerio Figurelli:

Olá Sergio Gelli, essa é a lógica do mercado, se você encaminhou uma ordem e abriu uma posição, o momento que encerrar essa posição irá influenciar em lucros ou perdas diferentes, uma vez que os preços estão mudando em tempo real, a cada nova transação entre vendedores e compradores do instrumento financeiro que você está posicionado.

Quanto ao histórico, o que você comentou vale tanto para uma ordem de BUY no início (long position) como de SELL (short position), uma vez que você também pode entrar 'vendido'. 

Quanto a enviar todos os itens, isso depende muito da posição atual, portanto recomendo não fazer essa análise no nível de ordens já encaminhadas, mas sim de verificação e análise da posição atual e de qual é a ordem necessária para encerrar essa posição.

Esse é o método correto ( e único) p/encerrar por considerar que se esta ordem não deve continuar ativa? É que reluto em usar esse método porque presumo que cada "Ordem BUY" ou "Ordem SELL" pagam spread. Não seria correto e conveniente usar uma função específica para fechar ordens?

Existe muita fartura de exemplos de programação MQL5, contudo o fechamento de ordens está uma verdadeira caixa preta e o melhor código que encontrei não usa reverter ordens BUY e SELL. Veja abaixo:

if(AccountFreeMargin()<0)
{
bool CloseTicketNo=false;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==MagicNumber)
{
if(OrderType()==OP_BUY) CloseTicketNo=OrderClose(OrderTicket(),OrderLots() ,Bid,3,clrLightSeaGreen);
if(OrderType()==OP_SELL) CloseTicketNo=OrderClose(OrderTicket(),OrderLots() ,Ask,3,clrIndianRed);
if(OrderType()>1) CloseTicketNo=OrderDelete(OrderTicket());
}
}
}
}  
Rogerio Figurelli
Moderador
58519
Rogerio Figurelli  
Sergio Gelli:

Esse é o método correto ( e único) p/encerrar por considerar que se esta ordem não deve continuar ativa? É que reluto em usar esse método porque presumo que cada "Ordem BUY" ou "Ordem SELL" pagam spread. Não seria correto e conveniente usar uma função específica para fechar ordens?

Existe muita fartura de exemplos de programação MQL5, contudo o fechamento de ordens está uma verdadeira caixa preta e o melhor código que encontrei não usa reverter ordens BUY e SELL. Veja abaixo:

Olá Sergio Gelli, esse método é o padrão que foi adotado pelo mercado internacional (após a crise de 2008), e foi compatibilizado no MT5 (position centric architecture) em relação ao MT4.

Note que o código que você postou, com a função OrderClose(), é do MQL4. No MQL5 até existe a função OrderSelect(), mas apenas para selecionar ordens pendentes.

Seja como for, você pode utilizar outras funções ou classes para abstrair esse processo, mas no final o método será o mesmo no MT5.

Por exemplo, recomendo estudares a função PositionClose() disponível na biblioteca CTrade, que possivelmente é a mais utilizada no Forex para fechar posições. Mas tenha cuidado se utilizar essa função na BM&FBovespa, pois não foi projetada originalmente para esse mercado e o código pode não ser compatível com todas nossas corretoras.

Alessandro Paulino
271
Alessandro Paulino  
Rogerio Figurelli:

Olá Sergio Gelli, esse método é o padrão que foi adotado pelo mercado internacional (após a crise de 2008), e foi compatibilizado no MT5 (position centric architecture) em relação ao MT4.

Note que o código que você postou, com a função OrderClose(), é do MQL4. No MQL5 até existe a função OrderSelect(), mas apenas para selecionar ordens pendentes.

Seja como for, você pode utilizar outras funções ou classes para abstrair esse processo, mas no final o método será o mesmo no MT5.

Por exemplo, recomendo estudares a função PositionClose() disponível na biblioteca CTrade, que possivelmente é a mais utilizada no Forex para fechar posições. Mas tenha cuidado se utilizar essa função na BM&FBovespa, pois não foi projetada originalmente para esse mercado e o código pode não ser compatível com todas nossas corretoras.

Olá, Rogerio. Por que você diz que o PositionClose da biblioteca CTrade não foi projetada para a BM&F? Existe algum detalhe em que impede dela ser utilizada lá?
Rogerio Figurelli
Moderador
58519
Rogerio Figurelli  
Alessandro Paulino:
Olá, Rogerio. Por que você diz que o PositionClose da biblioteca CTrade não foi projetada para a BM&F? Existe algum detalhe em que impede dela ser utilizada lá?

Olá Alessandro, nenhuma função de execução de ordens no MT5 foi feita especificamente para BM&FBovespa.

Portanto nas bibliotecas, como a CTrade, que fazem a camada de abstração, deve-se ter cuidado redobrado, embora seja possível utilizar elas, até porque também é possível mudar diretamente o código fonte.

Sds.,

Rogério Figurelli 

Luiz_Nunes
25
Luiz_Nunes  
Sergio Gelli:

O codigo abaixo abre uma posição de compra sem problemas.

Como faço para fechar essa posição quando ocorrer um evento ?

Agradeço antecipadamente.


Olá Sergio,


Recentemente me deparei com uma situação que acho ser semelhante à sua, apesar de já fazer muito tempo a sua postagem e que provavelmente você já deve ter chegado a um resultado, resolvi postar a solução que encontrei porque acho que poderá ajudar outras pessoas que como eu estão ou estarão com o mesmo impasse.

Pois bem segue  o link da solução que achei na própria referência do MQL5:

https://www.mql5.com/pt/docs/constants/tradingconstants/enum_trade_request_actions

No item: "Exemplo de ordem de negociação TRADE_ACTION_DEAL para fechadura de posições:"

Documentação sobre MQL5: Constantes Padrão, Enumeradores e Estruturas / Constantes de Negociação (Trade) / Tipos de Operações de Negociação (Trade)
Documentação sobre MQL5: Constantes Padrão, Enumeradores e Estruturas / Constantes de Negociação (Trade) / Tipos de Operações de Negociação (Trade)
  • www.mql5.com
Constantes Padrão, Enumeradores e Estruturas / Constantes de Negociação (Trade) / Tipos de Operações de Negociação (Trade) - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
vinyoliver
29
vinyoliver  
Luiz_Nunes:


Olá Sergio,


Recentemente me deparei com uma situação que acho ser semelhante à sua, apesar de já fazer muito tempo a sua postagem e que provavelmente você já deve ter chegado a um resultado, resolvi postar a solução que encontrei porque acho que poderá ajudar outras pessoas que como eu estão ou estarão com o mesmo impasse.

Pois bem segue  o link da solução que achei na própria referência do MQL5:

https://www.mql5.com/pt/docs/constants/tradingconstants/enum_trade_request_actions

No item: "Exemplo de ordem de negociação TRADE_ACTION_DEAL para fechadura de posições:"


Olá Luiz, estou passando pelo mesmo problema porem ainda sem solução :(

Estou abrindo a operação normalmente usando MqlTradeRequest porem não consigo fechar a posição.

O que já tentei:

1. Utilizar o metodo positionClose da classe CTrade mas obtenho o código de erro 10006.

2.Abrir uma posição invesa a posição original. Mas acabo na verdade só ficando com mais operações em aberto...

3.Fazer um novo request usando o action TRADE_ACTION_CLOSE_BY mas ocorre erro invalid request


Att

Bruno Ferreira
41
Bruno Ferreira  
Tem algum caminho pra eu fechar as operações abertas por um sinal na minha conta?
Para adicionar comentários, por favor Faça o login ou registrar