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