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
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.
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!
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.
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.
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

- www.mql5.com
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.
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.
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
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.

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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