Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!
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.
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 🤣.
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;
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!
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;
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.
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.
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?
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
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!
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!