Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
Fala pessoal, tudo certo? Eu estou montando uma estratégia de máximas e mínimas onde a compra é realizada quando o preço toca na média inferior e a saída da compra se dá quando o preço toca na média superior. Porém, muitas vezes o preço pega a ordem de saída e continua subindo. Então eu gostaria de adicionar na minha estratégia um Breakeven + Trailing Stop para aproveitar essa impulsão do preço. A ideia seria a seguinte: a ordem de saída "apareceria" (20 pontos abaixo) no exato momento em que o preço toca na média superior e a partir daí seguiria através do Trailing Stop. Isso é possível?
Ola Maicon,
Não sei qual são seus alvos, porém uma forma de utilizar o Trailing Stop + Breakeven a seu favor seria assim:
Supondo que seu alvo seja 100 pts no indice.
Crie uma ordem OCO com alvo bem maior, como 300 e loss de 50.
O alvo de 300pts é justamente para poder aproveitar a possibilidade de uma tendencia que seria perdida se o alvo de 100pts finalizasse a operação. Lembrando que qdo seu alvo de 100 pts for atingido, vc garante 50pts (Breakeven) e deixa 50pts aberto para tentar pegar a possível tendencia. Nada é de graça. rsrs
o breakeven Even fica:
Gain para Disparo: 50
Distancia do preço de entrada: 0
O trailing Stop:
Gain para disparo: 100 // Chegando em 100 pts de ganho
Distancia da Ultima cotação: 50 // atualize o stop 50 pts abaixo da ultima cotação
Frequência de Ajuste: 40 // E continue fazendo isso a cada 40 pts para cima.
Dessa forma qdo os 100 pts forem atingidos, voce ja garante 50 pts e conforme o Gain chegar a 140,180,220,260 pts, seu stop vai subindo 50 pts abaixo da ultima cotação.
Agora é fazer o back teste e ver se serve para você.
Espero ter ajudado.
Abraços
==>+<==++==>+<==
<+> Peace and Love <+>
==>+<==++==>+<==
Boa @tenere22! Usar stop móvel e breakeven é uma boa estratégia para gerir melhor o risco das operações.
@maicon-wollmann, Acho que você já deve ter visto o snippet de Stop móvel com breakeven no site, embora estejam em função de ticks (fixos).
Vou fazer uma versão adaptada para que possa colocar o breakeven em ticks (o que zera o risco da operação), e com o acionamento do stop móvel no toque de um alvo (sua média superior), atualizando sempre X ticks atrás do preço de fechamento. Aí você configura quantos ticks atrás do preço deseja que o stop móvel caminhe. Tem a versão discreta que atualiza o stop sempre que o preço anda a favor X ticks ou o stop móvel que atualiza sempre no fechamento da barra. Qual seria sua preferência?
Acho que hoje mais tarde (a noite) consigo postar aqui, caso ninguém o faça antes.
Abs!
E ai, @maicon-wollmann! Tranquilo?
Segue abaixo o código de estratégia que utiliza stop móvel e breakeven. Acredito que ele atende exatamente ao que precisa.
Você terá que configurar as constantes relacionadas ao stop:
No mais é só adequar a parte inicial do código para definir corretamente os sinais de compra e venda (variáveis bSinalCompra e bSinalVenda).
Espero que o código lhe ajude! Qualquer dúvida estamos aqui!]
Abs!
const //Relação risco/ganho de 3:1 cStopEmTicks = 30; cStopOffsetEmTicks = 10; cTrailingStopOffset = 15; cBreakevenEmTicks = 30; cAlvoEmTicks = 90; input bGestaoDeRiscoPelaEstrategia(true); iHorarioInicioAberturaPosicao(0905); iHorarioFimAberturaPosicao(1630); iHorarioEncerramentoDaytrade(1645); var iCaraCoroa: integer; bSinalCompra, bSinalVenda, bPosicionado: boolean; fPrecoStop, fPrecoAlvo, fPrecoStopOffset: float; bBreakevenAtivado, bStopMovelAtivado: boolean; bConfigurouRiscoInicial: boolean; begin bSinalCompra := false; bSinalVenda := false; bPosicionado := hasPosition; // CONFIGURE AQUI OS SEUS SINAIS DE COMPRA E VENDA PARA ABRIR POSIÇÃO // ------------------------------------------------------------------ if Not bPosicionado and (Time >= iHorarioInicioAberturaPosicao) and (Time <= iHorarioFimAberturaPosicao) then begin //ESTRATÉGIA CARA OU COROA! //Gera um numero aleatorio de 0 a 9. Se for menor igual a 4, gera //sinal de compra, se for maior que 4 geral sinal de venda //Número aleatório foi substituido por minuto par ou impar para permitir depurar //melhor o robô quando a estratégia é inserida multiplas vezes: como indicador e como execução //iCaraCoroa := Random(10); iCaraCoroa := mod(Time,2); if iCaraCoroa <= -1 then bSinalCompra := true else bSinalVenda := true; end; // ------------------------------------------------------------------ //Gera ordem de compra a mercado quando há um Sinal de COMPRA //e define ordem stoploss e take profit if bSinalCompra then BuyAtMarket; //Gera ordem de venda a mercado quando há um Sinal de VENDA //e define ordem stoploss e take profit if bSinalVenda then SellShortAtMarket; if bGestaoDeRiscoPelaEstrategia then begin //Código responsável pela manutenção das ordens de stoploss e take profit if isBought then begin if Not bConfigurouRiscoInicial then begin //CONFIGURE AQUI O SEU ALVO inicial fPrecoAlvo := BuyPrice + cAlvoEmTicks*MinPriceIncrement; // ------------------------------------------------------------------ fPrecoStop := BuyPrice - cStopEmTicks*MinPriceIncrement; fPrecoStopOffset := fPrecoStop - cStopOffsetEmTicks*MinPriceIncrement; bConfigurouRiscoInicial := true; end; if ((Close - cTrailingStopOffset*MinPriceIncrement) >= fPrecoStop) and bBreakevenAtivado and bStopMovelAtivado then fPrecoStop := Close - cTrailingStopOffset*MinPriceIncrement; if (Close >= (BuyPrice + cBreakevenEmTicks*MinPriceIncrement)) and (not bBreakevenAtivado) then begin fPrecoStop := BuyPrice; bBreakevenAtivado := true; end; if (Close >= fPrecoAlvo) and (not bStopMovelAtivado) then begin fPrecoStop := Close - cTrailingStopOffset*MinPriceIncrement;; bStopMovelAtivado := true; end; fPrecoStopOffset := fPrecoStop-cStopOffsetEmTicks*MinPriceIncrement; SellShortStop(fPrecoStop,fPrecoStopOffset); end; //Código responsável pela manutenção das ordens de stoploss e take profit if isSold then begin if Not bConfigurouRiscoInicial then begin //CONFIGURE AQUI O SEU ALVO INICIAL fPrecoAlvo := SellPrice - cAlvoEmTicks*MinPriceIncrement; // ------------------------------------------------------------------ fPrecoStop := SellPrice + cStopEmTicks*MinPriceIncrement; fPrecoStopOffset := fPrecoStop + cStopOffsetEmTicks*MinPriceIncrement; bConfigurouRiscoInicial := true; end; if ((Close + cTrailingStopOffset*MinPriceIncrement) <= fPrecoStop) and bBreakevenAtivado and bStopMovelAtivado then fPrecoStop := Close + cTrailingStopOffset*MinPriceIncrement; if (Close <= (SellPrice - cBreakevenEmTicks*MinPriceIncrement)) and (not bBreakevenAtivado) then begin fPrecoStop := SellPrice; bBreakevenAtivado := true; end; if (Close <= fPrecoAlvo) and (not bStopMovelAtivado) then begin fPrecoStop := Close + cTrailingStopOffset*MinPriceIncrement; bStopMovelAtivado := true; end; fPrecoStopOffset := fPrecoStop + cStopOffsetEmTicks*MinPriceIncrement; BuyStop(fPrecoStop,fPrecoStopOffset); end; //Encerra posicao if (Time >= iHorarioEncerramentoDaytrade) and HasPosition then ClosePosition; if Not hasPosition and bConfigurouRiscoInicial then begin bConfigurouRiscoInicial := false; bBreakevenAtivado := false; bStopMovelAtivado := false; end; end; end;