Ordem encerrando 0.5 abaixo do Take Profit.

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

Boa tarde amigos,

Estou com EA, que executa a ordem a mercado com SL de 4 pt  e TK de 1 pt. Apesar dele posicionar corretamente os SL e TK  ele tem saido no TK 0.5;

Ja li algo aqui no forum, mas não consegui entender corretamente. (deixe o link no final) .. abaixo uma parte do códico com a ação de Venda a mercado.

void VendaAMercado()
  {
   MqlTradeRequest   requisicao;    // requisição
   MqlTradeResult    resposta;      // resposta
   
   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   //--- Cacacterísticas da ordem de Venda
   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        = NormalizeDouble(tick.bid,_Digits);            // Preço para Venda
   requisicao.sl           = tick.bid + StopLoss;// Preço Stop Loss
   requisicao.tp           = tick.bid - TakeProfit;// 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_FOK;                            // Tipo deo Preenchimento da ordem
   //---
   OrderSend(requisicao,resposta);
   //---
     if(resposta.retcode == 10008 || resposta.retcode == 10009)
       {
        Print("Ordem de Venda executada com sucesso!");
       }
     else
       {
        Print("Erro ao enviar Ordem Venda. Erro = ", GetLastError());
        ResetLastError();
       } 
 }

O problema é que ele faz a sainda meio ponto antes.. mesmo que a ordem esteja corretamente posicionada.

... Em aneo tem uma imagem de uma operação real  ( a operação daria mais de 1 pt e saiu com meio)

Agradeço a atenção de todos.

Link do artigo que já li , mas nao consegui adaptar

https://www.mql5.com/pt/forum/301457

Problemas para sair da operação no E.A
Problemas para sair da operação no E.A
  • 2019.01.30
  • www.mql5.com
Estou usando a classe CTrade (https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade), mas, quando opero na real a ordem que o E...
Arquivos anexados:
Trader_Patinhas
1124
Trader_Patinhas  
admlaugusto:

Boa tarde amigos,

Estou com EA, que executa a ordem a mercado com SL de 4 pt  e TK de 1 pt. Apesar dele posicionar corretamente os SL e TK  ele tem saido no TK 0.5;

Ja li algo aqui no forum, mas não consegui entender corretamente. (deixe o link no final) .. abaixo uma parte do códico com a ação de Venda a mercado.

O problema é que ele faz a sainda meio ponto antes.. mesmo que a ordem esteja corretamente posicionada.

... Em aneo tem uma imagem de uma operação real  ( a operação daria mais de 1 pt e saiu com meio)

Agradeço a atenção de todos.

Link do artigo que já li , mas nao consegui adaptar

https://www.mql5.com/pt/forum/301457

Isso é normal. 

O TP é acionado no primeiro momento em que ocorrer algum negócio com preço igual ao valor que vc configurou (no seu caso esse valor era 3796.0). 

A saída pelo TP se dá por meio de uma ordem a mercado, ou seja, a plataforma lança automaticamente uma ordem a mercado para zerar a sua posição. No seu caso, como vc está comprado, o TP lançará uma ordem de venda a mercado, que vai vender seus ativos pela melhor oferta de compra disponível no livro de ofertas, ou seja vai vender pelo preço BID.

O que vc tem que ter consciência é que o TP será acionado assim que alguém fizer uma compra a mercado pelo valor-alvo, ou seja, num momento em que o preço ASK estará no valor-alvo (3796.0 no seu caso), mas, ao vender a mercado, ele vai vender pelo preço BID, que no caso do dólar geralmente estará 0.5 ponto abaixo do preço ASK. Esta é a razão de vc ter saído 0.5 ponto abaixo do seu preço-alvo, no valor de 3795.5, pois esse era o preço BID no momento em que o stop-loss foi acionado. 

É bom vc saber também que, embora a perda normal por spread no dólar seja de 0.5 ponto, em algumas ocasiões mais raras quando ocorre um surto intenso de fluxo comprador ou vendedor, o spread pode se alargar e o preço de venda por TP pode ficar 1.0, 1.5 ou mais pontos aquém do desejado.

Para evitar sofrer o desconto valor do spread (diferença entre ASK e BID) na hora de sair da posição, uma possível solução é, em vez de usar o TP, colocar uma ordem de venda pendente no preço-alvo. Isso garantirá que vc vai receber exatamente o valor do preço-alvo, caso a venda seja fechada.  

O inconveniente dessa solução que sugeri acima é que vc terá que gerenciar explicitamente essa ordem de saída, pois, ao contrário do TP que é gerenciado automaticamente pela plataforma, vc mesmo que vai ter que cancelar a ordem de saída caso a posição seja zerada manualmente ou por stop-loss, vc mesmo que vai ter que ajustar o volume da ordem de saída caso a posição tenha sido fechada parcialmente, etc. Se vc falhar nesse gerenciamento, corre risco de a posição ser zerada e sobrar uma ordem de saída pendente, que pode depois vir a ser executada te gerando uma posição indesejável. Esse gerenciamento de uma ordem de saída substituindo o TP automático da plataforma aumenta bastante a complexidade da operação (tanto pra executar manualmente quanto pra automatizar programando robô), mas vale muito a pena pra quem faz scalping curto, pois possibilita evitar a perda do spread ASK-BID.

admlaugusto
122
admlaugusto  
Trader_Patinhas:

Isso é normal. 

"Para evitar sofrer o desconto valor do spread (diferença entre ASK e BID) na hora de sair da posição, uma possível solução é, em vez de usar o TP, colocar uma ordem de venda pendente no preço-alvo. Isso garantirá que vc vai receber exatamente o valor do preço-alvo, caso a venda seja fechada.  "

acredito que vc tenha razão quanto a isso, e tb pelo gerenciamento.

vou procurar alguma forma de tentar implementar isso.. se tiver algo ai que possa me ajudar mais neste inicio agradeço!

  

      ainda nao consegui fechar esta questão.. 

     1- entro com uma ordem a mercado, sem take profit.   

     2 - tento lançar uma ordem pendente com este código abaixo .. 

 //verifico se já estou posicionado na compra!
   if(PositionSelect(_Symbol)==true && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
        {
        MqlTradeRequest   requisicao;    // requisição
        MqlTradeResult    resposta; 
        ZeroMemory(requisicao);
       ZeroMemory(resposta);
    
    //pego o preço da minha entrada (para poteriormente definir o preço da ordem pendente que vai ser 1 ponto acima (tk)           
       double preco_abertura = PositionGetDouble(POSITION_PRICE_OPEN);
                      
            //--- Cacacterísticas da ordem de Compra
   requisicao.action       = TRADE_ACTION_PENDING;                         // Executa ordem Pendente
   requisicao.magic        = magic_number;                                 // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo
   requisicao.volume       = num_lots;                                     // Nº de Lotes
   requisicao.price        = NormalizeDouble(preco_abertura + TakeProfit,_Digits);            // Preço para a VENDA
   requisicao.type         = ORDER_TYPE_SELL;                               // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                            // Tipo deo Preenchimento da ordem
   requisicao.type_time = ORDER_TIME_DAY;
   requisicao.expiration = 0;
   requisicao.stoplimit = 0;
   requisicao.sl = 0;
   requisicao.tp = 0;
   

o erro que recebo de volta é:

2019.07.31 13:13:29.970 2019.07.29 09:00:49   failed sell 1.00 WDOQ19 at 3781.0 [Invalid request]

2019.07.31 13:29:31.118 2019.07.25 10:17:48   Erro ao enviar Ordem Compra. Erro = 4756 


--se alguma alma de luz puder dar um ajuda agradeço!


Trader_Patinhas
1124
Trader_Patinhas  
admlaugusto:

  

      ainda nao consegui fechar esta questão.. 

     1- entro com uma ordem a mercado, sem take profit.   

     2 - tento lançar uma ordem pendente com este código abaixo .. 

o erro que recebo de volta é:

2019.07.31 13:13:29.970 2019.07.29 09:00:49   failed sell 1.00 WDOQ19 at 3781.0 [Invalid request]

2019.07.31 13:29:31.118 2019.07.25 10:17:48   Erro ao enviar Ordem Compra. Erro = 4756 


--se alguma alma de luz puder dar um ajuda agradeço!


Talvez seja porque a corretora não aceita ordem "Fill or Kill" ( requisicao.type_filling = ORDER_FILLING_FOK ).

Na verdade acho que nenhuma corretora brasileira aceita (os colegas me corrijam se eu estiver enganado).

Experimenta mudar pra ORDER_FILLING_RETURN que deve resolver.

Pra você entender melhor do que se trata, leia aqui.

admlaugusto
122
admlaugusto  

Mudei para tipo Return e tb alterei o tipo da ordem  para Sell Limit

apatentemente funcionou bem.

  if(PositionSelect(_Symbol)==true && PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
        {
        MqlTradeRequest   requisicao;    // requisição
        MqlTradeResult    resposta; 
        ZeroMemory(requisicao);
       ZeroMemory(resposta);
    
    //pego o preço da minha entrada (para poteriormente definir o preço da ordem pendente que vai ser 1 ponto acima (tk)           
      double preco_abertura = PositionGetDouble(POSITION_PRICE_OPEN);
                      
           //--- Cacacterísticas da ordem de Venda
   requisicao.action       = TRADE_ACTION_PENDING;                         // Executa ordem Pendente
   requisicao.magic        = magic_number;                                 // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                      // Simbolo do ativo
   requisicao.volume       = num_lots;                                     // Nº de Lotes
   requisicao.price        = NormalizeDouble(preco_abertura + TakeProfit,_Digits);            // Preço para a VENDA
   requisicao.type         = ORDER_TYPE_SELL_LIMIT;                               // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_RETURN;                            // Tipo deo Preenchimento da ordem
   requisicao.type_time = ORDER_TIME_DAY;
   requisicao.expiration = 0;


  Obrigado pela ajuda.

  

Rogerio Figurelli
Moderador
58519
Rogerio Figurelli  
Trader_Patinhas:

Talvez seja porque a corretora não aceita ordem "Fill or Kill" ( requisicao.type_filling = ORDER_FILLING_FOK ).

Na verdade acho que nenhuma corretora brasileira aceita (os colegas me corrijam se eu estiver enganado).

Experimenta mudar pra ORDER_FILLING_RETURN que deve resolver.

Pra você entender melhor do que se trata, leia aqui.

Olá  Trader_Patinhas, essa é uma ótima pergunta, pois na minha opinião isso é muito dinâmico e depende da política de risco da corretora de forma individual para cada classe de instrumentos, e suas características diversas como volatilidade, liquidez, etc. Por exemplo, quando o MT5 começou no Brasil esse preenchimento era permitido para ativos BMF e funcionava muito bem.
Dessa forma, minha recomendação para todos desenvolvedores é fazer um teste de forma programática, por exemplo através do código exemplo abaixo presente na documentação do MT5 no link  https://www.mql5.com/pt/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode, que já faz justamente o teste por ativo.

//+------------------------------------------------------------------+ 
//| Verifica se um modo de preenchimento específico é permitido      | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(string symbol,int fill_type) 
  { 
//--- Obtém o valor da propriedade que descreve os modos de preenchimento permitidos 
   int filling=(int)SymbolInfoInteger(symbol,SYMBOL_FILLING_MODE); 
//--- Retorna true, se o modo fill_type é permitido 
   return((filling & fill_type)==fill_type); 
  }

Dessa forma, o EA não fica dependendo da política da corretora, e pode tomar a decisão de priorizar cada tipo de ordem, além do que considero o mais relevante, que é poder tratar diretamente qualquer exceção particular para um instrumento, e com um algoritmo proprietário, que é o que eu faço em meus robôs em produção.
Sds.,
Rogério Figurelli
 

Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estado de Ambiente / Propriedades do Ativo
Documentação sobre MQL5: Constantes, Enumeradores e Estruturas / Estado de Ambiente / Propriedades do Ativo
  • www.mql5.com
Para obter as informações atuais do mercado, existem várias funções: SymbolInfoInteger(), SymbolInfoDouble() e SymbolInfoString(). O primeiro parâmetro é o nome do ativo, os valores do segundo parâmetro da função podem ser um dos identificadores de ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE e ENUM_SYMBOL_INFO_STRING. Alguns símbolos...
Trader_Patinhas
1124
Trader_Patinhas  
Rogerio Figurelli:

Olá  Trader_Patinhas, essa é uma ótima pergunta, pois na minha opinião isso é muito dinâmico e depende da política de risco da corretora de forma individual para cada classe de instrumentos, e suas características diversas como volatilidade, liquidez, etc. Por exemplo, quando o MT5 começou no Brasil esse preenchimento era permitido para ativos BMF e funcionava muito bem.
Dessa forma, minha recomendação para todos desenvolvedores é fazer um teste de forma programática, por exemplo através do código exemplo abaixo presente na documentação do MT5 no link  https://www.mql5.com/pt/docs/constants/environment_state/marketinfoconstants#symbol_filling_mode, que já faz justamente o teste por ativo.

Dessa forma, o EA não fica dependendo da política da corretora, e pode tomar a decisão de priorizar cada tipo de ordem, além do que considero o mais relevante, que é poder tratar diretamente qualquer exceção particular para um instrumento, e com um algoritmo proprietário, que é o que eu faço em meus robôs em produção.
Sds.,
Rogério Figurelli
 

Excelente ideia. Obrigado pelo esclarecimento.

Joscelino
909
Joscelino  

Não sei se vocês sabem, mas a B3 colocou no ano passado em discussão um novo mecanismo de execução de ordens para clientes pessoa física ("varejo"). Na verdade foi uma consulta pública, com várias manifestações de partes interessadas ...

Segue o link pra quem quiser ir diretamente na fonte: 

http://www.b3.com.br/pt_br/regulacao/consulta-publica/rlp-e-novas-regras-para-oferta-direta/

Basicamente o novo mecanismo chama-se RLP (Retail Liquidity Provider), e tem muitas manifestações contra e a favor do mesmo ...

O mecanismo vai permitir que clientes de varejo (apenas de varejo) executem ordens a mercado sem slippage (depende obviamente do tamanho do lote).

O legal das manifestações: XP totalmente a favor do novo mecanismo, e Virtu radicalmente contra ...

Motivo: a Virtu é "market maker" em mais de 25.000 ativos no mundo todo, e também atua nos dois principais ativos aqui no Brasil: WIN e WDO ...

Com o RLP a Virtu certamente deixará de abocanhar muitas ordens de clientes de varejo, que acabam sendo executadas com slippage alto em momentos de alta volatilidade (certamente a Virtu pega boa parte dessas ordens)

Pra quem não entendeu nada, segue um resumo, feito pela CM Capital:

https://www.cmcapital.com.br/vantagens-da-rlp/


PS: Contribuição do Rodrigo Malacarne.

Rogerio Figurelli
Moderador
58519
Rogerio Figurelli  
Joscelino Celso de Oliveira:

Não sei se vocês sabem, mas a B3 colocou no ano passado em discussão um novo mecanismo de execução de ordens para clientes pessoa física ("varejo"). Na verdade foi uma consulta pública, com várias manifestações de partes interessadas ...

Segue o link pra quem quiser ir diretamente na fonte: 

http://www.b3.com.br/pt_br/regulacao/consulta-publica/rlp-e-novas-regras-para-oferta-direta/

Basicamente o novo mecanismo chama-se RLP (Retail Liquidity Provider), e tem muitas manifestações contra e a favor do mesmo ...

O mecanismo vai permitir que clientes de varejo (apenas de varejo) executem ordens a mercado sem slippage (depende obviamente do tamanho do lote).

O legal das manifestações: XP totalmente a favor do novo mecanismo, e Virtu radicalmente contra ...

Motivo: a Virtu é "market maker" em mais de 25.000 ativos no mundo todo, e também atua nos dois principais ativos aqui no Brasil: WIN e WDO ...

Com o RLP a Virtu certamente deixará de abocanhar muitas ordens de clientes de varejo, que acabam sendo executadas com slippage alto em momentos de alta volatilidade (certamente a Virtu pega boa parte dessas ordens)

Pra quem não entendeu nada, segue um resumo, feito pela CM Capital:

https://www.cmcapital.com.br/vantagens-da-rlp/


PS: Contribuição do Rodrigo Malacarne.

Olá  Joscelino Celso de Oliveira, perfeitamente, eu já conhecia, na verdade tem um documento mais recente e detalhado dos pontos a favor e contra, já do relatório da audiência (ver abaixo):

http://www.b3.com.br/data/files/18/72/07/04/5A30A610D97FFE96AC094EA8/Relatorio%20Audiencia%20Publica.pdf


Sem dúvida existem muitos conflitos de interesse e é um assunto excelente para discussão em uma thread específica.

Pessoalmente, sem entrar em polêmica (pelo menos nessa thread), e pensando apenas no usuário final, sou a favor de manter a solução atual, que, apesar de favorecer muitas vezes quem opera em alta frequência, permite a disputa de competidores em vários níveis de frequência e exposição, em tese, com visibilidade "total" para todos. Se existem distorções, ou até mesmo práticas nocivas, como muito vemos no mercado internacional de HFT, existe a vantagem da visibilidade, e formas de regular e equilibrar o jogo de forma técnica e até mesmo legal, se não existir outro meio. 

Por exemplo, e apenas para citar um caso, as ordens de S/L e T/P já fazem parte dessa competição interna dentro das corretoras, em seu OMS e servidores, e sem visibilidade nenhuma para o usuário final (até onde eu tenha acesso), dificultando o controle. E, na prática, essa nova regra aumentaria o poder para fazer o mesmo não mais apenas com esse tipo de ordem, mas toda e qualquer ordem limite no book, para todo o varejo.

Sds.,
Rogério Figurelli

Trader_Patinhas
1124
Trader_Patinhas  
Essa mudança vai facilitar as coisas para estratégias que usam ordens a mercado, mas vai prejudicar estratégias que usam ordens pendentes, inclusive uma que estou testando que trabalha com ordens pendentes próximas ao bid/ask, absorvendo as rebarbas de volatilidade (ou seja, absorve o "slippage" de quem está negociando com ordem a mercado na contraparte).
Ralph_ForNow
29
Ralph_ForNow  
Trader_Patinhas:

Isso é normal. 

O TP é acionado no primeiro momento em que ocorrer algum negócio com preço igual ao valor que vc configurou (no seu caso esse valor era 3796.0). 

A saída pelo TP se dá por meio de uma ordem a mercado, ou seja, a plataforma lança automaticamente uma ordem a mercado para zerar a sua posição. No seu caso, como vc está comprado, o TP lançará uma ordem de venda a mercado, que vai vender seus ativos pela melhor oferta de compra disponível no livro de ofertas, ou seja vai vender pelo preço BID.

O que vc tem que ter consciência é que o TP será acionado assim que alguém fizer uma compra a mercado pelo valor-alvo, ou seja, num momento em que o preço ASK estará no valor-alvo (3796.0 no seu caso), mas, ao vender a mercado, ele vai vender pelo preço BID, que no caso do dólar geralmente estará 0.5 ponto abaixo do preço ASK. Esta é a razão de vc ter saído 0.5 ponto abaixo do seu preço-alvo, no valor de 3795.5, pois esse era o preço BID no momento em que o stop-loss foi acionado. 

É bom vc saber também que, embora a perda normal por spread no dólar seja de 0.5 ponto, em algumas ocasiões mais raras quando ocorre um surto intenso de fluxo comprador ou vendedor, o spread pode se alargar e o preço de venda por TP pode ficar 1.0, 1.5 ou mais pontos aquém do desejado.

Para evitar sofrer o desconto valor do spread (diferença entre ASK e BID) na hora de sair da posição, uma possível solução é, em vez de usar o TP, colocar uma ordem de venda pendente no preço-alvo. Isso garantirá que vc vai receber exatamente o valor do preço-alvo, caso a venda seja fechada.  

O inconveniente dessa solução que sugeri acima é que vc terá que gerenciar explicitamente essa ordem de saída, pois, ao contrário do TP que é gerenciado automaticamente pela plataforma, vc mesmo que vai ter que cancelar a ordem de saída caso a posição seja zerada manualmente ou por stop-loss, vc mesmo que vai ter que ajustar o volume da ordem de saída caso a posição tenha sido fechada parcialmente, etc. Se vc falhar nesse gerenciamento, corre risco de a posição ser zerada e sobrar uma ordem de saída pendente, que pode depois vir a ser executada te gerando uma posição indesejável. Esse gerenciamento de uma ordem de saída substituindo o TP automático da plataforma aumenta bastante a complexidade da operação (tanto pra executar manualmente quanto pra automatizar programando robô), mas vale muito a pena pra quem faz scalping curto, pois possibilita evitar a perda do spread ASK-BID.

Deixe-me entender também kk, no caso para "anular o Spread eu colocaria uma ordem de venda, mas esta seria buy stop ou buy limit? Li sobre, mas fiquei com duvida nesse caso
12
Para adicionar comentários, por favor Faça o login ou registrar