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] Travar StopLoss na minima do candle gatinho e StopGain 2x o risco

4 Posts
2 Usuários
1 Reactions
216 Visualizações
(@jonatasdias)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  
//Compra//
if compra and not IsBought and not isSold then
BuyLimit(close);

//Se Estiver Comprado - Buscar Saída//
if (isBought) then
Begin
vStop := minima;
SellToCoverStop(vStop,vStop);
SellToCoverLimit(BuyPrice-vStop*2);
end;

//Venda//
if venda and not IsBought and not isSold then
SellShortLimit(close);

//Se Estiver Vendido - Buscar Saída//
if (isSold) then
Begin
vStop := maxima;
BuyToCoverStop(vStop,vStop);
BuyToCoverLimit(SellPrice+vStop*2;
end;

//Horario Final para Day-Trade
if (time>=1730) then
ClosePosition;
end;

 

Criei essa regra, onde o StopLoss abaixo do candle sinal e Gain 2x o risco, porém o StopLoss esta com "TrailingStop" e alvo não esta saindo 2x o risco. Como faço para travar esse StopLoss?


   
Citar
(@jonatasdias)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  
//Bloco de Entrada//
if (time>=0905) and (time<=1730) then

//Compra//
if compra and not IsBought and not isSold then
Begin
amp   := abs(maxima-minima);
vStop := minima-(1*MinPriceIncrement);
AlvoC := maxima+amp*2;
BuyLimit(close);
SellToCoverStop(vStop,vStop);
end;

//Se Estiver Comprado - Buscar Saída//
if (isBought) then
Begin
SellToCoverLimit(AlvoC);
SellToCoverStop(vStop,vStop);
End;

//Venda//
if venda and not IsBought and not isSold then
Begin
amp   := abs(maxima-minima);
vStop := maxima-(1*MinPriceIncrement);
AlvoV := minima-amp*2;
SellShortLimit(close);
BuyToCoverStop(vStop,vStop);
end;

//Se Estiver Vendido - Buscar Saída//
if (isSold) then
Begin
BuyToCoverLimit(AlvoV);
BuyToCoverStop(vStop,vStop);
End; 

//Horario Final para Day-Trade
if (time>=1750) then
ClosePosition;

end;

Consegui fazer dessa maneira. Espero que possa ajudar outros membros.

This post was modified 2 anos atrás 2 times by Jonatasdias

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

Oi @jonatasdias!

Cara, até já respondi pra você no Chat lá do Profit. Mas vou repetir aqui para ficar de histórico porque é uma dúvida recorrente para quem está iniciando no mundo da programação no Profit em NTSL.

Recomendo assistir o vídeo da Comunidade NeoTraderBot chamado: O QUE PRECISA SABER SOBRE ROBÔS. Vou explicar uma das coisas que falo nesse vídeo abaixo:

Um primeiro ponto a entender é como funciona a execução de um código fonte no Profit (e isso é assim em praticamente todas as plataformas). O código que escrevemos é processado toda vez que surge um novo dado. Em backtesting isso é quando uma barra (seja candle ou box) é encerrado. Ao executar em replay ou tempo real (seja em um gráfico ou no módulo de automação), o código é processado tick a tick.

Pensando assim, fica evidente, que no seu código a variável vStop é alterada sempre que tem um novo dado e consequente o seu alvo (pois depende dela).

Você precisa criar uma variável auxiliar, que servirá para definir o stop e alvo uma única vez quando você abrir uma posição. Vamos chamar de bConfigurouRisco, do tipo Boolean. Assim a ideia é que essa variável assuma o valor falso enquanto você não estiver posicionado. Se tornará verdadeira na primeira vez que a condição isBought ou isSold for verdadeira, e retornará para falso quando você não tiver mais posição.

Assim, vou incluir essa lógica na sua estratégia. 

PS: A partir de uma determinada versão do Profit, as variáveis booleanas passaram a não reter valor entre processamentos. pois isso incluo a linha de bConfigurouRisco := bConfigurouRisco[1]. Alterei seu código sem rodar novamente no Profit, depois veja se deu certo!

Outra dica: evite fazer conta como parâmetro das funções de roteamento. Crie uma variável, atribua valor a ela e depois passe essa variável. Já houve bugs no passado em relação a este ponto.

 

var
      bConfigurouRisco: boolean;
      vStop, vAlvo: float;

begin

bConfigurouRisco := bConfigurouRisco[1];

//Compra//
if compra and not IsBought and not isSold then
BuyLimit(close);

//Se Estiver Comprado - Buscar Saída//
if (isBought) then
Begin
if Not bConfigurouRisco then
   begin
        vStop := minima;
        vAlvo := BuyPrice-vStop*2;
        bConfigurouRisco  := true;
   end;

   SellToCoverStop(vStop,vStop);
   SellToCoverLimit(vAlvo);
end;

//Venda//
if venda and not IsBought and not isSold then
SellShortLimit(close);

//Se Estiver Vendido - Buscar Saída//
if (isSold) then
Begin
   if Not bConfigurouRisco then
   begin
        vStop := maxima;
        vAlvo := SellPrice+vStop*2;
        bConfigurouRisco  := true;
   end;

   BuyToCoverStop(vStop,vStop);
   BuyToCoverLimit(vAlvo );
end;

if Not hasPosition then bConfigurouRisco  := false;

//Horario Final para Day-Trade
if (time>=1730) then
ClosePosition;
end;

end;

 

 

 


   
Jonatasdias reacted
ReplyCitar
(@jonatasdias)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  

Olá, boa tarde. É possivel pegar informação de um candle do dia anterior? Por exemplo, gostaria que rotornasse o valor da abertura do candle 100 e plotasse uma linha para o dia atual. Estou fazendo dessa forma, porém plota em ondas: Close[14].


   
ReplyCitar