Neo traderBot

Neo traderBot

Você sabia?

Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)

leaf leftleaf right
Notifications
Clear all

[Solucionado] Como LIMITAR ROBÔ pelo LIMITE DE PERDA OU OBJETIVO DE GANHO

12 Posts
7 Usuários
2 Reactions
243 Visualizações
(@jorge-luiz)
Novo membro
Registrou: 2 anos atrás
Posts: 2
Iniciador do tópico  

Olá Johnathas e membros do fórum. Por gentiliza se alguém puder me ajudar ficarei muito grato. A respeito do vídeo em que limita gain e loss pelo código, existiria uma maneira/especie de drawdown, em que atingindo ex. R$ 200,00 de gain, ao invés de encerrar as operações do dia, colocasse uma trava a R$ 150,00 e continuasse a operar ate a um outro patamar de gain especifico ou ate atingir o rebaixamento a R$ 150,00 e assim encerrasse as operações diárias. Muito obrigado. 


   
Citar
Credson
(@m4tr1xbr)
Membro Moderator
Registrou: 2 anos atrás
Posts: 45
 

Acredito que seria possível colocando um Trailing Stop baseado no DailyResult, porém o ideal seria se fosse tick a tick, o que via código no momento não é possível.

O que daria para fazer seria usando OHLC, o problema é que no OHLC o preço pode ir acima de 200,00 e voltar abaixo de 150,00 antes de ativar o Trailling, mas vou deixar essa pra o Jonhathas, fiquei curioso agora 🤣. 


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

Olá @jorge-luiz e @credson!

         O negócio é só imaginar um modelo e depois programar! E dá para pensar e fazer tanta coisa diferente na programação, que é por isso que sou contra a Nelogica ficar gastando tanto tempo com interface gráfica e não corrigindo os problemas centrais da NTSL.

         O que o @jorge-luiz quer fazer não é nada demais...ele quer uma lógica para proteger ganhos. Basicamente há uma gestão de risco inicial (objetivo de lucro e limite de perda), se atingido o objetivo de ganho você quer aplicar uma gestão para proteger parte do ganho, colocando um limite de perda menor. Se o objetivo de ganho for novamente satisfeito, protege novamente.

          As complicações vão surgindo quando tentamos traduzir para a linguagem, porque começam a aparecer as especificidades. Por exemplo, o @jorge-luiz não quer encerrar a posição quando o objetivo de ganho for atingido.

          O @credson generalizou bem, é um trailing stop baseado não no resultado de cada trade, mas no resultado do dia. Isso não elimina a possibilidade de fazer simultaneamente trailing stop de cada operação, caso não esteja fazendo ainda - Tem um eBook sobre isso!.

         Acredito que o código abaixo possa ser útil. Teste e veja se te atende. Eu vou fazer uns testes aqui também para criar um snippet. Obs: a linha de "if LastBarOnChart" foi comentada para que você rode em backtesting...para rodar em tempo real ou replay, descomente a linha.

 

Grande abs!

input
  pPlotarResultado("TOTAL");
  pLimitePerdaDiaria(100.00);
  pObjetivoGanhoDiario(300.00);
  pProtecaoGanho(200.00);

var
  fResultado: float;
  fResultadoDiario: float;
  iHora: integer;

  fObjetivoAtualGanho, fLimiteAtualPerda: float;
  fNovaReferencia: float;

  bPrimeiraBarraDoDia : boolean;
  iDataAtual          : integer;
  bPrimeiroTickDaBarra : boolean;
  iBarraAtual          : integer;
begin
  // Configura a gestão de risco no primeiro tick da primeira
  // barra do dia. Necessário agora que tem roteamento no tick
  // SNIPPET de "Identificação do primeiro candle de cada dia"
  // +
  // SNIPPET de "Identificação do primeiro tick de uma barra"
  if (Date() <> iDataAtual) then
    begin
      iDataAtual := Date();
      bPrimeiraBarraDoDia := true;
    end;
  if bPrimeiraBarraDoDia then
    begin
      bPrimeiraBarraDoDia := false;

      //if LastBarOnChart then
      if (CurrentBar <> iBarraAtual) then
        begin
          iBarraAtual := CurrentBar;
          bPrimeiroTickDaBarra := true;
        end
      else
        bPrimeiroTickDaBarra := false;

      if bPrimeiroTickDaBarra then
        begin
          //Faz alguma coisa no primeiro tick da barra
          //Aplicável apenas em execução de tempo real
          fObjetivoAtualGanho := pObjetivoGanhoDiario;
          fLimiteAtualPerda := pLimitePerdaDiaria;
          fNovaReferencia := 0;
        end;

    end;


  //-----------------------------------------------------------
  // SNIPPET de "Como limitar trades por objetivo de ganho ou limite de perda"

  // Resultado fechado do dia
  // Resultado até o momento no dia (fechado + aberto)
  If pPlotarResultado = "TOTAL" then
  begin
    fResultado := DailyResult(true);
    plot(fResultado);
    SetPlotStyle(1,psDash);
    SetPlotColor(1,clGray);
    SetPlotType(1,igHistogram);

    plot2(fNovaReferencia - fLimiteAtualPerda);
    SetPlotStyle(2,psSolid);
    SetPlotColor(2,clRed);
    SetPlotWidth(2,3);

  end;


  // Estratégia qualquer de operação!!!
  // Estratégias apenas opera se resultado do dia não
  // tiver atingido objetivo de ganho ou limite de perda
  fResultadoDiario := DailyResult(true) - fNovaReferencia;

  if (fResultadoDiario > -1*fLimiteAtualPerda)
  and (fResultadoDiario < fObjetivoAtualGanho) then
  begin
    // SIMULAÇÃO DE ORDENS PARA FINS DE EXEMPLO
    for iHora := 0 to 8 do
    begin
      if (Time = (0900 + iHora*100)) then
        if random(2) = 0 then BuyAtMarket else SellShortAtMarket;

      if (Time = (0930 + iHora*100)) then
        ClosePosition;
    end;

  end
  //Se resultado excedeu objetivo de ganho cria-se novos limites
  //Se atingiu limite de perda, para de operar
  else 
  begin
    if fResultadoDiario <= -1*pLimitePerdaDiaria then
    begin
      if hasPosition then ClosePosition;
    end
    else
    if fResultadoDiario >= pObjetivoGanhoDiario then
    begin
       fNovaReferencia := fNovaReferencia + pObjetivoGanhoDiario;
       fLimiteAtualPerda := (pObjetivoGanhoDiario - pProtecaoGanho);
    end;

  end;

end;

 


   
Credson reacted
ReplyCitar
(@jorge-luiz)
Novo membro
Registrou: 2 anos atrás
Posts: 2
Iniciador do tópico  

Grande mestre John, saudações. Mestre gostaria de mais uma ajuda sua se possível. O snippet de gestão de risco móvel funcionou perfeitamente. Mas eu estava tentando juntar esse snippet juntamente com o de limitação de ordem por dia. Mestre tentei de todas formas possíveis, menos a certa. Kkkk.

Da uma luz aí mano. Vlw!


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

Olá @jorge-luiz!

     A junção dos 2 snippets ficaria do jeito abaixo.

     Uma vez que se entende a lógica de funcionamento de uma estratégia na NTSL, esses ajustes tornam-se naturais de serem realizados. Se você tiver interesse, dá uma olhada no Curso de Automatização de Trading em NTSL que estamos lançando na Comunidade com condições especiais no pré-lançamento.

     Um dos objetivos do curso é tornar esse tipo de ajuste simples para o aluno, para que ele tenha desenvoltura e modo de agir que torne o mais eficiente e eficaz a sua escrita de código fonte.

 

Abs!

 

const
  // Mude aqui a qtde maxima de trades por dia
  cQtdeMaxOperacoesNoDia = 3;

input
  pLimitePerdaDiaria(100.00);
  pObjetivoGanhoDiario(300.00);
  pProtecaoGanho(200.00);
  pTempoReal(false);
var
  fResultado: float;
  fResultadoDiario: float;
  iHora: integer;

  fObjetivoAtualGanho, fLimiteAtualPerda: float;
  fNovaReferencia: float;

  bPrimeiraBarraDoDia : boolean;
  iDataAtual          : integer;
  bPrimeiroTickDaBarra : boolean;
  iBarraAtual          : integer;


  iQtdeOperacoesNoDia: integer;
  bJaContouOperacao: boolean;

begin
  // Configura a gestão de risco no primeiro tick da primeira
  // barra do dia. Necessário agora que tem roteamento no tick
  // SNIPPET de "Identificação do primeiro candle de cada dia"
  // +
  // SNIPPET de "Identificação do primeiro tick de uma barra"
  if (Date() <> iDataAtual) then
    begin
      iDataAtual := Date();
      bPrimeiraBarraDoDia := true;
    end;
  if bPrimeiraBarraDoDia then
    begin
      bPrimeiraBarraDoDia := false;

      if (pTempoReal and LastBarOnChart) or not pTempoReal then
      if (CurrentBar <> iBarraAtual) then
        begin
          iBarraAtual := CurrentBar;
          bPrimeiroTickDaBarra := true;
        end
      else
        bPrimeiroTickDaBarra := false;

      if bPrimeiroTickDaBarra then
        begin
          //Faz alguma coisa no primeiro tick da barra
          //Aplicável apenas em execução de tempo real
          fObjetivoAtualGanho := pObjetivoGanhoDiario;
          fLimiteAtualPerda := pLimitePerdaDiaria;
          fNovaReferencia := 0;

          iQtdeOperacoesNoDia := 0;
          bJaContouOperacao := false;
        end;

    end;


  //-----------------------------------------------------------
  // SNIPPET de "Como limitar trades por objetivo de ganho ou limite de perda"
  // Resultado até o momento no dia (fechado + aberto)
    fResultado := DailyResult(true);
    plot(fResultado);
    SetPlotStyle(1,psDash);
    SetPlotColor(1,clGray);
    SetPlotType(1,igHistogram);

    plot2(fNovaReferencia - fLimiteAtualPerda);
    SetPlotStyle(2,psSolid);
    SetPlotColor(2,clRed);
    SetPlotWidth(2,3);

  // Estratégia qualquer de operação!!!
  // Estratégias apenas opera se resultado do dia não
  // tiver atingido objetivo de ganho ou limite de perda
  fResultadoDiario := DailyResult(true) - fNovaReferencia;

  if (fResultadoDiario > -1*fLimiteAtualPerda)
  and (fResultadoDiario < fObjetivoAtualGanho)
  and (iQtdeOperacoesNoDia < cQtdeMaxOperacoesNoDia) then
  begin
    // SIMULAÇÃO DE ORDENS PARA FINS DE EXEMPLO
    for iHora := 0 to 8 do
    begin
      if (Time = (0900 + iHora*100)) or (Time = (0930 + iHora*100)) then
        if random(2) = 0 then BuyAtMarket else SellShortAtMarket;
    end;
  end;

  // Contabiliza a abertura da posição como mais uma operação no dia
  if (isBought or isSold) and Not bJaContouOperacao then
  begin
    iQtdeOperacoesNoDia := iQtdeOperacoesNoDia + 1;
    bJaContouOperacao := true;
  end;

  // Encerramento da posição por tempo
  if (Time = (0920 + iHora*100)) Or (Time = (0950 + iHora*100)) then
    ClosePosition;

  //Se resultado excedeu objetivo de ganho cria-se novos limites
  //Se atingiu limite de perda ou proteção de ganho então para de operar
  if (fResultadoDiario <= -1*fLimiteAtualPerda)
  or (fResultadoDiario > fObjetivoAtualGanho) then 
  begin
    if fResultadoDiario <= -1*pLimitePerdaDiaria then
    begin
      if hasPosition then ClosePosition;
    end
    else
    if fResultadoDiario >= pObjetivoGanhoDiario then
    begin
       fNovaReferencia := fNovaReferencia + pObjetivoGanhoDiario;
       fLimiteAtualPerda := (pObjetivoGanhoDiario - pProtecaoGanho);
    end;

  end;

  // Se posição for encerrada ativa novamente o contador
  if Not IsBought and Not isSold and bJaContouOperacao then bJaContouOperacao := false;


end;

 

This post was modified 2 anos atrás by Johnathas

   
Credson reacted
ReplyCitar
(@anaxmando)
Membro ativo
Registrou: 2 anos atrás
Posts: 6
 

Bom dia! Estou procurando no Forum a possibilidade de parar o Robo por sequencia de trades vencedores e não por resultado... alguem poderia ajudar como poderia implementar isso no código? Grato.


   
ReplyCitar
(@jptrader)
Novo membro
Registrou: 1 ano atrás
Posts: 1
 

Ola mestre estou tentando implementar o codigo para proteger o ganho mas infelizmente não estou conseguindo, mudei apenas a estratégia de execução e as variaveis do robo que ja possuo e não consigo obter exito, ele só funciona quando colo a variavel pTemporeal=false ou seja quando desabilito ela.


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

Olá @jptrader!

     Essa configuração é para diferenciar o uso no Backtesting ou no Módulo de Automação.

     Crie um novo tópico com o seu código que a gente vê o que pode estar dando errado.

 

Abs!


   
ReplyCitar
(@diego-amaral)
Novo membro
Registrou: 1 ano atrás
Posts: 1
 

Fala pessoal, boa noite! Gostaria de tirar uma dúvida com os mestes de plantão, a função DailyResult pode ser usada no replay? Porque quando tento plotar o valor retornado por essa função não sai de ZERO. 

Alguem poderia me ajudar?


   
ReplyCitar
(@christianogm)
Novo membro
Registrou: 1 ano atrás
Posts: 1
 

Por favor, podem me ajudar?

Gostaria de um código para identificar se o mercado esta aberto, e se andar x pontos acima da abertura dar uma compra, se andar x pontos abaixo da uma venda.

Parece simples rsrs mas não consigo fazer funcionar rs

Obrigado


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

Olá @diego-amaral!

Sim...pode ser usada em replay. Possivelmente deve ter sido um bug que você experimentou. Muitas pessoas relataram também não estarem conseguindo utilizar a função DailyResult há uns dias atrás. 

 

Abs!


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

Oi @christianogm

Crie um novo tópico no fórum. Este tópico trata de "Como LIMITAR ROBÔ pelo LIMITE DE PERDA OU OBJETIVO DE GANHO".

No novo tópico que criar, eu te respondo.

Abs!


   
ReplyCitar