Estratégia de rastreamento de tendência de média móvel de Kaufman dinâmica auto-adaptativa

Autora:ChaoZhang, Data: 2024-02-26 16:36:30
Tags:

img

Resumo

Esta estratégia é concebida com base na Kaufman Adaptive Moving Average (KAMA) para ajustar dinamicamente as posições de negociação e rastrear automaticamente as tendências do mercado.

  1. Calcular dinamicamente o tamanho da etapa de negociação (em pips) e adaptar-se à volatilidade do mercado
  2. Gerar sinais de compra e venda com base na direção do KAMA
  3. Definir uma distância de stop loss após o sinal é acionado, e ajustá-lo de acordo com os movimentos do preço
  4. Confirmação opcional da barra próxima ao filtro de sinais falsos

Através da aplicação destas funções, a estratégia procura obter lucros adicionais a partir das tendências, controlando os riscos.

Estratégia lógica

A estratégia funciona com base no indicador Kaufman Adaptive Moving Average. A KAMA calcula a relação entre o impulso dos preços e a volatilidade para ajustar dinamicamente o peso e a suavidade da média móvel, permitindo que ela responda mais rapidamente às mudanças de preços.

Quando a KAMA cruza acima da linha de stop loss descendente, ela indica uma reversão de tendência e desencadeia um sinal de compra. Quando a KAMA cruza abaixo da linha de stop loss ascendente, ela sugere uma reversão de tendência e desencadeia um sinal de venda. Após entrar em uma posição, a estratégia calcula uma distância de stop loss dinâmica baseada no ATR e define uma linha de stop loss favorável. À medida que a KAMA se move em uma direção favorável, a linha de stop loss também se ajusta de acordo, mudando para uma posição mais favorável para bloquear mais lucros.

Desta forma, a estratégia pode acompanhar a tendência, mover gradualmente a linha de stop loss até que ela seja acionada ou um sinal reverso seja acionado para fechar a posição.

Vantagens

Em comparação com as estratégias tradicionais de média móvel, esta estratégia tem as seguintes vantagens:

  1. A KAMA tem uma elevada sensibilidade e pode captar as tendências dos preços mais rapidamente;
  2. A distância dinâmica de stop loss bloqueia mais lucros à medida que se ajusta à tendência;
  3. A barra opcional de confirmação de fechamento filtra sinais falsos e reduz as entradas desnecessárias.

Em geral, a estratégia é sensível, controlável e um sistema típico de rastreamento de tendências.

Riscos

A estratégia comporta também alguns riscos:

  1. Risco de reversão da tendência: a KAMA pode adaptar-se de forma flexível às flutuações de preços, mas pode não responder em tempo suficiente a reversões súbitas da tendência.
  2. Se a distância de stop loss dinâmica for definida de forma demasiado larga, pode ser demasiado agressiva e não conseguir bloquear os lucros a tempo.
  3. O risco de sinais falsos: o uso de confirmação de fechamento de barra ajuda a reduzir os sinais falsos, mas não pode eliminá-los completamente.

Para gerenciar esses riscos, métodos como otimizar a distância de stop loss e definir uma porcentagem máxima de stop loss podem ser usados.

Orientações de otimização

As possibilidades de otimização da estratégia incluem:

  1. Otimizar os parâmetros KAMA: ajustar os comprimentos da média móvel, ajustar a suavidade;
  2. Otimizar a perda de travagem dinâmica: testar as distâncias de travagem óptimas e os tamanhos dos passos com base em diferentes produtos;
  3. Adicionar indicadores de filtragem: incorporar outros indicadores de tendência para confirmar os sinais de negociação e melhorar a confiabilidade.

Por exemplo, o MACD pode ser adicionado como um indicador de confirmação auxiliar, exigindo que o MACD Dif seja positivo e se expanda ao lado da cruz de ouro da KAMA. Isso pode filtrar alguns sinais falsos e evitar entradas repetidas desnecessárias.

Conclusão

O funcionamento geral desta estratégia é suave. Usando um stop loss dinâmico para rastrear tendências e maximizar os lucros da tendência, juntamente com a adaptabilidade do indicador KAMA para responder rapidamente a rápidas mudanças no mercado, esta estratégia pode se tornar um sistema de rastreamento de tendências eficiente após alguma otimização, adequado para negociação de médio a longo prazo.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


Mais.