Estratégia de acompanhamento de tendências baseada em bandas dinâmicas de pivô

Autora:ChaoZhang, Data: 2023-12-26 11:57:20
Tags:

img

Resumo

Esta estratégia calcula os preços mais altos e mais baixos recentes em um determinado período, combinados com o preço atual, para formar uma linha média dinâmica. O canal de baixa vermelho e o canal de alta verde são gerados com base na volatilidade recente. As três linhas de canal formam um intervalo negociável. Quando o preço se aproxima dos limites do canal, as operações reversas são realizadas visando os lucros de volta à linha média. Enquanto isso, há um cálculo de tendência dentro da estratégia para filtrar as negociações contra a tendência e evitar ser destruída pela tendência principal.

Estratégia lógica

  1. Calcular a linha média dinâmica com o preço mais alto recente, o preço mais baixo e o preço de fechamento atual
  2. Gerar faixas dinâmicas baseadas no ATR e no multiplicador, alterações de largura com a volatilidade do mercado
  3. Vá longo quando o preço salta da faixa inferior, vá curto quando salta da faixa superior
  4. Ter lucro e stop-loss lógica direcionando linha do meio
  5. Entretanto, calcule o índice de tendência para filtrar as negociações contra a tendência

Análise das vantagens

  1. Bandas dinâmicas adaptadas à volatilidade do mercado em tempo real
  2. Alta probabilidade de negociação ao longo da tendência
  3. Controles de perda de parada de perda única

Análise de riscos

  1. Optimização inadequada dos parâmetros pode levar a excesso de negociação
  2. Incapacidade de eliminar completamente as transacções contrárias às tendências sob as principais tendências
  3. A fuga unilateral pode continuar a funcionar.

Direcção de otimização

  1. Ajustar os parâmetros das faixas para se adequarem aos diferentes produtos
  2. Parâmetros do índice de tendência para melhorar a probabilidade de negociação de tendências
  3. Introduzir elementos de aprendizagem de máquina para otimização de parâmetros dinâmicos

Resumo

Esta estratégia depende principalmente da oscilação do mercado para obter lucros. Ao capturar pontos de reversão de preço dinamicamente com as bandas, combinado com a filtragem de tendência, ele pode efetivamente lucrar com a reversão média enquanto controla os riscos. A chave está no ajuste de parâmetros para tornar as bandas responsivas, mas não supersensíveis. O índice de tendência também precisa de períodos adequados para desempenhar seu papel. Com tendência e paradas teóricas favoráveis, essa estratégia pode alcançar retornos decentes através da otimização.


/*backtest
start: 2023-11-25 00:00:00
end: 2023-12-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Strategy - Bobo PAPATR", overlay=true, default_qty_type = strategy.fixed, default_qty_value = 1, initial_capital = 10000)

// === STRATEGY RELATED INPUTS AND LOGIC ===
len = input(24, minval=1, title="Pivot Length, defines lookback for highs and lows to make pivots")
length = input(title="ATR lookback (Lower = bands more responsive to recent price action)", type=input.integer, defval=22)
myatr = atr(length)
dailyatr = myatr[1]
atrmult = input(title="ATR multiplier (Lower = wider bands)", type=input.float, defval=3)
pivot0 = (high[1] + low[1]  + close[1]) / 3

// PIVOT CALC
h = highest(len)
h1 = dev(h, len) ? na : h
hpivot = fixnan(h1)
l = lowest(len)
l1 = dev(l, len) ? na : l
lpivot = fixnan(l1)
pivot = (lpivot + hpivot + pivot0) / 3
upperband1 = (dailyatr * atrmult) + pivot
lowerband1 = pivot - (dailyatr * atrmult)
middleband = pivot

// == TREND CALC ===
i1=input(2, "Momentum Period", minval=1) //Keep at 2 usually
i2=input(20, "Slow Period", minval=1)
i3=input(5, "Fast Period", minval=1)
i4=input(3, "Smoothing Period", minval=1)
i5=input(4, "Signal Period", minval=1)
i6=input(50, "Extreme Value", minval=1)
hiDif = high - high[1]
loDif = low[1] - low
uDM = hiDif > loDif and hiDif > 0 ? hiDif : 0
dDM =  loDif > hiDif and loDif > 0 ? loDif : 0
ATR = rma(tr(true), i1)
DIu = 100 * rma(uDM, i1) / ATR
DId = 100 * rma(dDM, i1) / ATR
HLM2 =  DIu - DId
DTI = (100 * ema(ema(ema(HLM2, i2), i3), i4)) /  ema(ema(ema(abs(HLM2), i2), i3), i4)
signal = ema(DTI, i5)


// === RISK MANAGEMENT INPUTS ===
inpTakeProfit   = input(defval = 0, title = "Take Profit (In Market MinTick Value)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss (In Market MinTick Value)", minval = 0)

// === RISK MANAGEMENT VALUE PREP ===
// if an input is less than 1, assuming not wanted so we assign 'na' value to disable it.
useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na

// === STRATEGY - LONG POSITION EXECUTION ===
enterLong = (((low<=lowerband1) and (close >lowerband1)) or ((open <= lowerband1) and (close > lowerband1))) and (strategy.opentrades <1) and (atr(3) > atr(50)) and (signal>signal[3])
exitLong = (high > middleband)
strategy.entry(id = "Long", long = true, when = enterLong) 
strategy.close(id = "Long", when = exitLong)

// === STRATEGY - SHORT POSITION EXECUTION ===
enterShort = (((high>=upperband1) and (close < upperband1)) or ((open >= upperband1) and (close < upperband1))) and (strategy.opentrades <1) and (atr(3) > atr(50)) and (signal<signal[3])
exitShort = (low < middleband)
strategy.entry(id = "Short", long = false, when = enterShort)
strategy.close(id = "Short", when = exitShort)

// === STRATEGY RISK MANAGEMENT EXECUTION ===
strategy.exit("Exit Long", from_entry = "Long", profit = useTakeProfit, loss = useStopLoss)
strategy.exit("Exit Short", from_entry = "Short", profit = useTakeProfit, loss = useStopLoss)

// === CHART OVERLAY ===
plot(upperband1, color=#C10C00, linewidth=3)
plot(lowerband1, color=#23E019, linewidth=3)
plot(middleband, color=#00E2E2, linewidth=3)
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

Mais.