Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

leaf leftleaf right
Notifications
Clear all

[Solucionado] Breakeven + Trailing Stop

4 Posts
3 Usuários
2 Reactions
425 Visualizações
(@maicon-wollmann)
Novo membro
Registrou: 2 anos atrás
Posts: 1
Iniciador do tópico  

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?


   
Citar
(@tenere22)
Membro ativo
Registrou: 2 anos atrás
Posts: 5
 

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 <+>
==>+<==++==>+<==


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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!


   
tenere22 reacted
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

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:

  • cStopEmTicks -> Seu stop inicial;
  • cStopOffsetEmTicks -> É o offset que você configura no stop para tentar miitigar o risco do pulo da ordem stop;
  • cBreakevenEmTicks -> Com quantos ticks a favor da sua posição, sua estratégia vai zerar o risco? Ou seja, colocar o stop no preço de abertura da posição.
  • cTrailingStopOffset -> Este é o valor em ticks que seu stop será configurado atrás do preço de fechamento das barras quando sua estratégia atingir o Alvo inicial da operação;
  • cAlvoEmTicks -> Pode desconsiderar esta constante. É importante definir o alvo quando a posição é aberta. Os locais do código estão sinalizados

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;

   
tenere22 reacted
ReplyCitar