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

Ajuda para enxergar tendência

1 Posts
1 Usuários
0 Reactions
128 Visualizações
(@mrgeorge)
Membro ativo
Registrou: 2 anos atrás
Posts: 3
Iniciador do tópico  

Prezados o objetivo do código é uma compra após um pullback numa tendência de alta ou uma venda numa tendência de baixa após um pullback.

Verifico que algumas entradas são feitas contra a tendência. Gostaria que ele verificasse a tendência comparando no mínimo 2 topos e 2 fundos anteriores.

const
  cStopEmTicks      = 40;
  cBreakevenEmTicks = 27;
input
  pGatilhoDeteccao(2.0);
  pQtdePeriodosAnaliseVolat(10);
  //Variáveis globais
var
  bStarted                               : boolean;
  bSinalCompra,bSinalVenda,bSinalLiquida : boolean;
  bComprado,bVendido                     : boolean;
  ponto_entrada,ponto_stop,ponto_alvo    : float;
  //Variáveis personalizadas
  tf,topo,fundo                          : float;
  tendencia,pullback,barra_sinal         : integer;
  H,L                                    : integer;
  iIdentUltimaBarraIdentificada          : integer;
  fMaximoAtual,fMinimoAtual              : float;
  fVolatilidadeMedia                     : float;
  fTopoFundoConfirmado                   : float;
  //Inicialização da estratégia
begin
  if Not bStarted then
    begin
      bStarted := True;
    end;
  //Atribuição de variáveis por processamento
  bSinalCompra := False;
  bSinalVenda := False;
  bComprado := isBought();
  bVendido := isSold();
  iIdentUltimaBarraIdentificada := iIdentUltimaBarraIdentificada[1];
  fVolatilidadeMedia := (Summation(High,pQtdePeriodosAnaliseVolat) - Summation(Low,pQtdePeriodosAnaliseVolat)) / pQtdePeriodosAnaliseVolat;
  // Inicialização do algoritmo quando tem dados suficientes
  if CurrentBar = pQtdePeriodosAnaliseVolat then
    begin
      fMaximoAtual := High[1];
      fMinimoAtual := Low[1];
      iIdentUltimaBarraIdentificada := - 1 * (CurrentBar - 1);
    end;
  // Algoritmo inicia execução
  if CurrentBar > pQtdePeriodosAnaliseVolat then
    begin
      // Última confirmação do indicador foi um topo
      if (iIdentUltimaBarraIdentificada > 0) then
        begin
          // Verifica se houve retração de preço em relação ao valor mínimo atual maior do que o gatilho do parâmetro de entrada
          if (High >= (fMinimoAtual + pGatilhoDeteccao * fVolatilidadeMedia)) then
            begin
              // Atualiza o índice da barra de fundo com valor negativo (economia de memória)
              // e estabelece um valor inicial para o máximo atual
              fTopoFundoConfirmado := Lowest(Low,CurrentBar - Round(Abs(iIdentUltimaBarraIdentificada)) + 1);
              iIdentUltimaBarraIdentificada := - 1 * CurrentBar;
              fMaximoAtual := High;
            end;
          // Atualiza o valor mínimo atual
          if Low < fMinimoAtual then
            fMinimoAtual := Low;
        end
      // Última confirmação do indicador foi um fundo
      else 
        begin
          // Verifica se houve retração de preço em relação ao valor máximo atual maior do que o gatilho do parâmetro de entrada
          if (Low <= (fMaximoAtual - pGatilhoDeteccao * fVolatilidadeMedia)) then
            begin
              // Atualiza o índice da barra de topo com valor positivo (economia de memória)
              // e estabelece um valor inicial para o mínimo atual
              fTopoFundoConfirmado := Highest(High,CurrentBar - Round(Abs(iIdentUltimaBarraIdentificada)) + 1);
              iIdentUltimaBarraIdentificada := CurrentBar;
              fMinimoAtual := Low;
            end;
          // Atualiza o valor máximo atual
          if High > fMaximoAtual then
            fMaximoAtual := High;
        end;
    end;
  // Atribuições das variáveis da estratégia
  tf := fTopoFundoConfirmado;
  //Atribuições de topo / fundo
  if (tf <> 0) and (tf >= FECHAMENTO) then
    topo := tf;
  if (tf <> 0) and (tf <= FECHAMENTO) then
    fundo := tf;
  //Cálculo dos sinais
  //Definir tendencia
  begin
    if ((topo > fundo) and (MAXIMA > topo)) then
      tendencia := 1;
    if ((topo > fundo) and (MINIMA < fundo)) then
      tendencia := - 1;
  end;
  //Definir pullback
  begin
    if ((tendencia = 1) and (MAXIMA < MAXIMA[1])) then
      pullback := 1;
    if ((tendencia = - 1) and (MINIMA > MINIMA[1])) then
      pullback := - 1;
  end;
  // Definir barra de sinal
  begin
    if (fechamento > ABERTURA) then
      barra_sinal := 1;
    if (fechamento < ABERTURA) then
      barra_sinal := - 1;
  end;
  // Definir H1 / L1
  begin
    if ((pullback = 1) and (MAXIMA > MAXIMA[1])) then
      H := 1;
    if ((pullback = - 1) and (MINIMA < MINIMA[1])) then
      L := 1;
  end;
  //Envia ordens de compra/venda evitando comprar topo ou vender fundo
  if Not (bComprado Or bVendido) then
    begin
      if ((pullback = 1) and (H = 1) and (barra_sinal = 1)) and ((MAXIMA[1] - MAXIMA) > 50) then
        BuyStop(MAXIMA + 5);
      if ((pullback = - 1) and (L = 1) and (barra_sinal = - 1)) and (MINIMA - MINIMA[1] > 50) then
        SellShortStop(Minima - 5);
    end;
  //Administração das posições abertas
  if bComprado then
    begin
      ponto_entrada := BuyPrice();
      ponto_stop := MINIMA;
      ponto_alvo := ponto_entrada + 1.5 * (ponto_entrada - ponto_stop);
      if ((ponto_entrada - ponto_stop) > cStopEmTicks * MinPriceIncrement) then
        ponto_stop := ponto_entrada - cStopEmTicks * MinPriceIncrement;
      if (maxima > (ponto_entrada + cBreakevenEmTicks * MinPriceIncrement)) then
        ponto_stop := ponto_entrada;
      SellToCoverStop(ponto_stop);
      SellToCoverLimit(ponto_alvo);
      tendencia := 0;
      pullback := 0;
      barra_sinal := 0;
      H := 0;
      L := 0;
    end;
  if bVendido then
    begin
      ponto_entrada := Price();
      ponto_stop := MAXIMA;
      ponto_alvo := ponto_entrada - 1.5 * (ponto_stop - ponto_entrada);
      if ((ponto_stop - ponto_entrada) > cStopEmTicks * MinPriceIncrement) then
        ponto_stop := ponto_entrada + cStopEmTicks * MinPriceIncrement;
      if (fechamento < (ponto_entrada - cBreakevenEmTicks * MinPriceIncrement)) then
        ponto_stop := ponto_entrada;
      BuyToCoverStop(ponto_stop);
      BuyToCoverLimit(ponto_alvo);
      tendencia := 0;
      pullback := 0;
      barra_sinal := 0;
      H := 0;
      L := 0;
    end;
end;



   
Citar