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] Venda ou Compra em rompimento de maximas ou abertura e fechamentos ou minimas de candle anteriores

15 Posts
8 Usuários
0 Reactions
465 Visualizações
(@traderbunker)
Novo membro
Registrou: 2 anos atrás
Posts: 1
Iniciador do tópico  

Alguem conseguiu fazer a Automação fazer uma venda no rompimento de minima ou fechamento do candle anterior?

Ou então Compra no rompimento da maxima ou abertura do candle anterior?

 

Tambem estou tentando fazer a compra no topo do corpo do candle e venda na parte inferior do corpo de candle.


   
Citar
(@dfrobinson)
Membro ativo
Registrou: 2 anos atrás
Posts: 4
 

Olá. Tenho muito pouca experiência nesse tipo de programação mas até onde entendi, o código é executado apenas ao final de cada candle. Dessa forma, me parece que só será possível enviar uma ordem stop no preço desejado (p.ex. máxima/mínima de um candle anterior) e aguardar que ordem seja executada. 


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

Postado por: @dfrobinson

Olá. Tenho muito pouca experiência nesse tipo de programação mas até onde entendi, o código é executado apenas ao final de cada candle. Dessa forma, me parece que só será possível enviar uma ordem stop no preço desejado (p.ex. máxima/mínima de um candle anterior) e aguardar que ordem seja executada. 

@dfrobinson foi direto na questão! É isso aí!

Eu fiz o código abaixo com entradas utilizando ordens stop para que você possa evoluir da maneira que entender ser melhor (recomendo assistir esse vídeo, no qual eu explico um roteiro para melhor implementações). Observe que a estratégia tem 3 parâmetros.

  • pRiscoGanho -> estabelece o alvo em função do stop;
  • pTriggerEmTicks -> Margem de segurança (em ticks) para considerar rompimento
  • pModuloAutomacao -> Dependendo do contexto de execução utiliza ordens diferentes

OBS:

1) Devido a forma como o Módulo de Automação funciona, peço que configure a quantidade máxima da posição 2 vezes o valor da sua posição. Ex: se vai fazer operações com apenas 1 contrato, deixe na configuração da automação o valor de 2 na quantidade máxima de posição. Isso é para garantir que a ordem de takeprofit vai aparecer corretamente no primeiro candle após a abertura (momento no qual é necessário cancelar a ordem stop de abertura que não foi executada).

2) Não esqueça de configurar também o parâmetro de pModuloAutomacao para true na hora de criar a automação.

Abs e boa programação ai!

input
  pRiscoGanho(3.0);
  pTriggerEmTicks(2);
  pModuloAutomacao(false);
var
  fPrecoAlvo, fPrecoStop, fPrecoStopOffset: float;
  fPrecoVenda, fPrecoCompra: float;
  fRange: float;
begin
  if not hasPosition then 
  begin
    fPrecoVenda := Low - pTriggerEmTicks*MinPriceIncrement;
    fPrecoCompra := High + pTriggerEmTicks*MinPriceIncrement;
    fRange := Range;
    SellShortStop(fPrecoVenda);
    BuyStop(fPrecoCompra);
  end;

  if isBought then
  begin
    fPrecoStop := buyPrice - fRange;
    fPrecoStopOffset := fPrecoStop - 10*MinPriceIncrement;
    fPrecoAlvo := buyPrice + pRiscoGanho*fRange;

    CancelPendingOrders;
    if pModuloAutomacao then
    begin
      SellShortStop(fPrecoStop, fPrecoStopOffset);
      SellShortLimit(fPrecoAlvo);
      if isBought and (Close <= fPrecoStopOffset) then ClosePosition;
    end
    else
    begin
      SellToCoverStop(fPrecoStop, fPrecoStopOffset);
      SellToCoverLimit(fPrecoAlvo);
      if isBought and (Close <= fPrecoStopOffset) then ClosePosition;
    end;
     
  end;

  if isSold then
  begin
    fPrecoStop := sellPrice + fRange;
    fPrecoStopOffset := fPrecoStop + 10*MinPriceIncrement;
    fPrecoAlvo := sellPrice - pRiscoGanho*fRange;

    CancelPendingOrders;
    if pModuloAutomacao then
    begin
      BuyStop(fPrecoStop, fPrecoStopOffset);
      BuyLimit(fPrecoAlvo);  
      if isSold and (Close >= fPrecoStopOffset) then ClosePosition;
    end
    else
    begin
      BuyToCoverStop(fPrecoStop, fPrecoStopOffset);
      BuyToCoverLimit(fPrecoAlvo);  
      if isSold and (Close >= fPrecoStopOffset) then ClosePosition;
    end;
  end;


end;

 


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

@admin Bom dia! nessa estratégia pode me ajudar como faço para definir um alvo de ganho de 2 pontos e um preçode Stop loss de 5 pontos? sera que é possível? Obrigado.


   
ReplyCitar
(@alexandre-ferreira-cardoso)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
 

@admin Bom dia. Como poderia plotar uma reta no valor do máximo e outra no mínimo do candle que gerou o range usado como referência para as ordens até o próximo candle referência?


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

Bom dia @alexandre-ferreira-cardoso! Tudo bem?

O código seria simples...seria até melhor já inserir no seu código direto...mas vou explicar aqui a ideia, pra você incluir aí:

  • Você precisa ter duas variáveis auxiliares, fLimMin e fLimMax
  • Quando você identificar que está comprado ou vendido e fLimMin e fLimMax forem iguais a zero, você vai atribuir os valores fLimMin := Low[1] e fLimMax := High[1];
  • Quando você identificar que não está nem comprado nem vendido você vai fazer fLimMin e fLimMax ser iguais a 0;
  • Quando fLimMin e fLimMax forem diferentes de zero, você vai fazer o plotN(1, fLimMin) e plotN(2,fLimMax);
  • Se fLimMin e fLimMax forem iguais a zero vai fazer NoPlot(1) e NoPlot(2);

 

É isso! Grande abs!


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

Bom dia @anaxmando!

Vou te falar dois ajustes bem pontuais para fazer o que deseja. Mas recomendo sempre ter uma relação risco/ganho maior do que um. A sua elaboração por construção já tem uma relação de risco/ganho de 0,4...o que vai exigir que sua estratégia tenha um alto nível de acerto para ser lucrativa.

 

  • Transforme fRange em uma constante e atribua o valor de 2
const
     fRange = 2;
  • Atribua ao parâmetro pRicosGanho o valor de 2.5;
    input
         pRiscoGanho(2.5);

 

Assim, seu stop será de dois pontos atrás da entrada e o take profit 2.5 vezes o stop, ou seja, 5 pontos.

 

Abs e bons trades!


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

@admin Na realidade seria o inverso o meu Stop seria de 5 pontos e o meu ganho de 2 pontos... sabe me informar como poderia configurar dessa forma? Gratidão.


   
ReplyCitar
(@alexandre-ferreira-cardoso)
Membro eminente
Registrou: 2 anos atrás
Posts: 17
 

@admin Valeu! Consegui fazer seguindo os passos. Só que começa a plotar defasado, Eu já vi em algum lugar plotar a partir do próprio candle, como na figura da direita. Alguma idéia de como fazer isso?


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

E aí, @anaxmando!

O raciocínio é análogo. Bastaria configurar fRange para 5 (que seria o stop) e a relação pRiscoGanho para 0.4.

Só reforço que projetar uma estratégia com risco ganho menor que 1 não é interessante...você vai ter que compensar com uma taxa de acerto alta para a estratégias ser lucrativa.

Abs!


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

Boa tarde! Estou começando nesse meio da programação.

Eu criei uma estrategia... mas gostaria que a estratégia funcionasse como se estivesse uma ordem OCO apregoada, para que eu possa ter uma estatística, saberia informar o que poderá modificar na estratégia abaixo para conseguir deixar fixo o alvo de Stop gain e Stop Loss, do jeito que esta... só rompe máxima e mínima, mas não coloca  a saída... se conseguir ajudar ficarei muito grato. 

 

Input
Alvo(2.0);
Stop(5.0);
ct(1);

Inicio
//Pergunta se esta comprado
Se (Isbought) entao
Inicio
//Buscar o alvo
buylimit(ct);
SellToCoverLimit(buyprice+alvo,ct); //Alvo da compra
SellToCoverStop(buyprice-stop, buyprice-stop-1,ct); //Alvo do Stop

Fim;
//Pergunta se esta vendido
Se (IsSold) entao
Inicio
BuyToCoverLimit(sellprice-alvo,ct); //Alvo da Venda
buytocoverstop(sellprice+stop, sellprice+stop+1,ct); //Alvo do Stop

Fim;

Inicio
Se (HasPosition = False) entao
Inicio
BuyStop(maxima+0.5, maxima+0.5+1);
Fim;
Se (HasPosition = False) entao
Inicio
SellShortStop(Minima-0.5, minima-0.5-1);
Fim;
Se (Hasposition = true) entao
CancelPendingOrders;
Fim;
Fim;


   
ReplyCitar
masker
(@masker)
Membro confiável
Registrou: 2 anos atrás
Posts: 41
 

@anaxmando veja se assim funciona como vc gostaria:

Input
Alvo(2.0);
Stop(5.0);
ct(1);

Inicio
Se (Isbought) entao
Inicio
buylimit(ct);
SellToCoverLimit(buyprice+alvo);
SellToCoverStop(buyprice-stop, buyprice-stop-1);

Fim;
Se (IsSold) entao
Inicio
BuyToCoverLimit(sellprice-alvo); 
buytocoverstop(sellprice+stop, sellprice+stop+1);

Fim;

Inicio
Se (HasPosition = False) entao
Inicio
BuyStop(maxima+0.5, maxima+0.5+1);
Fim;
Se (HasPosition = False) entao
Inicio
SellShortStop(Minima-0.5, minima-0.5-1);
Fim;
Se (Hasposition = true) entao
CancelPendingOrders;
Fim;
Fim;

   
ReplyCitar
(@mfpublicos)
Membro ativo
Registrou: 2 anos atrás
Posts: 7
 

 


Resumindo, nunca teremos ordens executadas antes da finalização de um Candle? É isso?

Complicado...

Principalmente pros stops. Podemos ter slippages enormes que inviabilizam os referidos robôs 

 

Abs

 


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

Oi @mfpublicos! Seu resumo não está correto...

Ordens de alvo e stop, que são consideradas ordens OCO, uma vez criadas serão executadas quando forem acionadas (e não no fechamento do Candle). Ou seja, podem ser acionadas durante a formação da barra porque já estão lá colocadas quando se abre a posição e seu código trata isso de maneira adequada. 

A atualização das ordens OCO ocorrem só no fechamento do candle/barra.

 

Grande abs!


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

@admin boa tarde, gostaria de fazer ao contrario, abrir uma compra no rompimento da minima do candle e uma venda no rompimento da maxima do candle, onde teria que inverter no código?


   
ReplyCitar