Ordem pendente fechar uma posição no sistema hedging?

 

É possível uma ordem pendente fechar uma posição em aberto no sistema HEDGING?

Imagine a seguinte situação:
Assim que uma posição é aberta, uma ordem oposta do tipo limit é enviada em um determinado nível de preço com o dobro do volume da posição que está aberta.
Então ela vai servir para inverter a mão quando o preço atingir esse determinado nível.
No sistema NETTING está funcionando normalmente.
O problema aparece quando estou testando no sistema hedging. Ao atingir o preço, ele está abrindo uma nova posição oposta com o dobro do volume.
Este comportamento que está correto no sistema hedging, pois as ordens são tratadas de formas independentes, se nada for especificado para ela.

Segunda a documentação, no sistema hedging você tem que especificar o id da posição que você deseja fechar ou alterar.
"MqlTradeRequest features two new fields:

  • position — position ticket. Fill it when changing and closing a position for its clear identification. It usually matches the ticket of an order used to open the position.
  • position_by — opposite position ticket. It is used when closing a position by an opposite one (opened at the same symbol but in the opposite direction)."

Dai, testei da seguinte forma o envio da ordem pendente (TRADE_ACTION_PENDING), com a identificação da posição a ser fechada definida:

MqlTradeRequest request = {0};
MqlTradeResult result = {0};
request.action = TRADE_ACTION_PENDING;
request.magic = m_magic;
request.symbol = m_symbol.Name();
request.sl = 0;
request.tp = 0;
request.deviation = 0;
request.type_time = ORDER_TIME_DAY;
request.type_filling = ORDER_FILLING_RETURN;
request.expiration = TimeLocal() + PeriodSeconds(PERIOD_D1);
request.volume = m_position.Volume()*2;
request.comment = IntegerToString(m_magic);

request.position = positionId;

if(m_position.PositionType() == POSITION_TYPE_BUY) {            
  request.price = m_symbol.NormalizePrice(m_position.PriceOpen() + _distance);
  request.type = ORDER_TYPE_SELL_LIMIT;
}
else {
  request.price = m_symbol.NormalizePrice(m_position.PriceOpen() - _distance);
  request.type = ORDER_TYPE_BUY_LIMIT;
}
if(!OrderSend(request, result)) {
  Print(__FUNCTION__,":", result.comment, "-", result.retcode, "-", result.retcode_external); 
}
ZeroMemory(request);
ZeroMemory(result);

Então, apesar de ter preenchido este id na ordem limit, ao enviar é retornado erro 10013

10013

TRADE_RETCODE_INVALID

Solicitação inválida


Como este erro é meio vago, não dá pra saber exatamente o que está errado na requisição.

Como preciso inverter a mão, no momento, tenho que enviar a ordem pendente com o mesmo volume da posição a aberta.
Assim que esta ordem pendente é executada, envio uma nova ordem a mercado (TRADE_ACTION_DEAL) para fechar a posição original.
O problema está justamente nisso de ser a mercado. A ideia de usar a ordem limit é que a posição seja fechada no preço específico definido, senão estraga a estratégia.
Apesar de estar funcionando desse jeito, não serve para a estratégia.

Então, é possível uma ordem pendente fechar uma posição em aberto no sistema HEDGING?
Ou melhor, é possível uma ordem pendente inverter a mão no sistema HEDGING?

Alguma outra sugestão? 

 
Rodrigo Pandini:

É possível uma ordem pendente fechar uma posição em aberto no sistema HEDGING?

Imagine a seguinte situação:
Assim que uma posição é aberta, uma ordem oposta do tipo limit é enviada em um determinado nível de preço com o dobro do volume da posição que está aberta.
Então ela vai servir para inverter a mão quando o preço atingir esse determinado nível.
No sistema NETTING está funcionando normalmente.
O problema aparece quando estou testando no sistema hedging. Ao atingir o preço, ele está abrindo uma nova posição oposta com o dobro do volume.
Este comportamento que está correto no sistema hedging, pois as ordens são tratadas de formas independentes, se nada for especificado para ela.

Segunda a documentação, no sistema hedging você tem que especificar o id da posição que você deseja fechar ou alterar.
"MqlTradeRequest features two new fields:

  • position — position ticket. Fill it when changing and closing a position for its clear identification. It usually matches the ticket of an order used to open the position.
  • position_by — opposite position ticket. It is used when closing a position by an opposite one (opened at the same symbol but in the opposite direction)."

Dai, testei da seguinte forma o envio da ordem pendente (TRADE_ACTION_PENDING), com a identificação da posição a ser fechada definida:

Então, apesar de ter preenchido este id na ordem limit, ao enviar é retornado erro 10013

10013

TRADE_RETCODE_INVALID

Solicitação inválida


Como este erro é meio vago, não dá pra saber exatamente o que está errado na requisição.

Como preciso inverter a mão, no momento, tenho que enviar a ordem pendente com o mesmo volume da posição a aberta.
Assim que esta ordem pendente é executada, envio uma nova ordem a mercado (TRADE_ACTION_DEAL) para fechar a posição original.
O problema está justamente nisso de ser a mercado. A ideia de usar a ordem limit é que a posição seja fechada no preço específico definido, senão estraga a estratégia.
Apesar de estar funcionando desse jeito, não serve para a estratégia.

Então, é possível uma ordem pendente fechar uma posição em aberto no sistema HEDGING?
Ou melhor, é possível uma ordem pendente inverter a mão no sistema HEDGING?

Alguma outra sugestão? 

Prezado Rodrigo

O Malacane fez um EA para mim assim mesmo como vc esta querendo e o EA  inverte a mão quando uma determinada condição ocorre, vc pode  contacta-lo aqui mesmo no site.  Sucesso amigo

 
Olá Paulo,

Tem certeza que seu EA está rodando no sistema HEDGING?
É estranho sua afirmação pois de acordo com o outro moderador, uma ordem pendente no sistema hedging sempre abre uma nova posição e portanto não serve para fechar (ou inverter) uma posição já aberta:
https://www.mql5.com/en/forum/97328
Fiz diversos testes e conversei com outros pessoas e também não conseguiram.
Mas de qualquer forma, vou tentar entrar em contato com ele.

Obrigado.
Is possible to close a position with a limit order in HEDGING system?
Is possible to close a position with a limit order in HEDGING system?
  • www.mql5.com
Hi, I would like know if is possible to close a position (or invert it) with a limit order (TRADE_ACTION_PENDING) in HEDGING system...
 
Rodrigo Pandini:
Olá Paulo,

Tem certeza que seu EA está rodando no sistema HEDGING?
É estranho sua afirmação pois de acordo com o outro moderador, uma ordem pendente no sistema hedging sempre abre uma nova posição e portanto não serve para fechar (ou inverter) uma posição já aberta:
https://www.mql5.com/en/forum/97328
Fiz diversos testes e conversei com outros pessoas e também não conseguiram.
Mas de qualquer forma, vou tentar entrar em contato com ele.

Obrigado.

Olá Rodrigo Pandini,

Por favor dê uma olhada na função PositionCloseBy: https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade/ctradepositioncloseby

É uma solução que pode ser usada para fechar duas posições opostas em contas hedge. 

Abraços,
Malacarne

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

Malacarne,

Pelo que entendi, a função PositionCloseBy irá fechar uma posição usando outra posição.
No meu caso eu preciso fechar uma posição usando uma ordem pendente pois preciso garantir que preço seja executado no mesmo preço definido para a ordem.
Sei que vou conseguir fechar a posição usando essa função, mas não vai garantir que o preço seja o fixado. Não é?

Obrigado.

 
Rodrigo Pandini:

Malacarne,

Pelo que entendi, a função PositionCloseBy irá fechar uma posição usando outra posição.
No meu caso eu preciso fechar uma posição usando uma ordem pendente pois preciso garantir que preço seja executado no mesmo preço definido para a ordem.
Sei que vou conseguir fechar a posição usando essa função, mas não vai garantir que o preço seja o fixado. Não é?

Obrigado.

Olá Rodrigo Pandini,

Por sua própria natureza, uma ordem pendente irá abrir automaticamente uma nova posição ao ser executada, certo?

A questão é que você está dizendo que já tem uma posição aberta, e que uma ordem pendente foi lançada pelo robô para, no caso, servir como take profit, por exemplo.

A questão aqui é: se você tem duas posições abertas, sendo uma a original que você abriu pelo robô, e a outra um "take profit" que acabou também abrindo uma nova posição, você pode perfeitamente "cancelar" as duas posições (leia-se, fechar ambas) utilizando essa função (PositionCloseBy).

Na prática o resultado é exatamente o esperado por uma ordem de take profit, que é encerrar uma posição.

Abraços,
Malacane

 

Malacarne,

Compreendi o que disse sim, e inclusive é a linha que estava seguindo.
Mas acho que meu questionamento ainda persiste: como garantir que vou fechar a posição no preço definido?
Minha restrição é exatamente essa. Preciso fechar a posição no momento que ela atingir um determinado nível de preço. Ela precisa ser fechada nesse nível.
Acredito que na maioria dos casos, quando o preço chegar no nível desejado e eu mandar fechar a posição usando outra, ela provavelmente vai ser fechada nesse nível.
Mas, diferente da ordem limitada no sistema netting, não tenho garantia quanto a isso. Não é?

Acho que é só você imaginar um momento muito volátil onde você precisa fechar a posição.
Por exemplo, se o preço estiver subindo muito rápido e chegar em um nível de preço determinado e você enviar a solicitação mandando fechar a posição, usando o PositionCloseBy, pode ser que ela seja fechada acima do nível de preço desejado. O que na prática funciona como se fosse uma ordem a mercado.
Se você for ver, esse comportamento é o mesmo quando você define o stoploss ou o takeprofit na ordem (linhas vermelhas pontilhadas). Essas ordens (sl e tp) não estão no book. Quando o preço chega no valor definido do sl (ou tp), o próprio Metatrader se encarrega de enviar uma ordem a mercado para fechar a posição. Você garante que ela vai ser fechada imediatamente, afinal é a mercado, mas não garante o preço.

De qualquer forma, vou continuar fazendo os testes aqui usando o PositionCloseBy.

Obrigado mais uma vez.
Abraço.

 

Rodrigo Malacarne,

Possuo a mesma dúvida do Rodrigo. O comando PositionCloseBy envia novas ordens a marcado afim de "zerar" as posições contrárias (não é o que estou buscando)? Ou ela simplesmente anula as 2 posições, faz uma compensação matemática dentro do MT5, neutralizando o volume aberto do ativo em questão sem o envio de novas ordens (é o que eu busco)?

Obrigado. Abraços.