Estrategia de seguimiento de tendencias basada en bandas dinámicas pivotantes

El autor:¿ Qué pasa?, Fecha: 2023-12-26 11:57:20
Las etiquetas:

img

Resumen general

Esta estrategia calcula los precios más altos y más bajos recientes durante un cierto período, combinados con el precio actual, para formar una línea media dinámica. El canal descendente rojo y el canal ascendente verde se generan luego en función de la volatilidad reciente. Las tres líneas de canal forman un rango negociable. Cuando el precio se acerca a los límites del canal, se llevan a cabo operaciones inversas dirigidas a los beneficios de vuelta a la línea media. Mientras tanto, hay un cálculo de tendencia dentro de la estrategia para filtrar las operaciones contra la tendencia y evitar que la tendencia principal los destruya.

Estrategia lógica

  1. Calcular la línea media dinámica con precio más alto reciente, precio más bajo y precio de cierre actual
  2. Generar bandas dinámicas basadas en ATR y multiplicador, cambios de ancho con la volatilidad del mercado
  3. Ir largo cuando el precio rebota de la banda inferior, ir corto cuando rebota de la banda superior
  4. Tener la lógica de tomar ganancias y parar pérdidas apuntando a la línea media
  5. Mientras tanto, calcular el índice de tendencia para filtrar las operaciones contra la tendencia

Análisis de ventajas

  1. Las bandas dinámicas se adaptan a la volatilidad del mercado en tiempo real
  2. Alta probabilidad de negociación a lo largo de la tendencia
  3. Control de pérdida de parada pérdida única

Análisis de riesgos

  1. La optimización inadecuada de los parámetros puede conducir a un exceso de negociación
  2. Incapacidad de eliminar por completo las operaciones contrarias a la tendencia en las principales tendencias
  3. La fuga unilateral puede continuar funcionando

Dirección de optimización

  1. Ajustar los parámetros de las bandas para adaptarse a los diferentes productos
  2. Parámetros del índice de tendencia de ajuste fino para mejorar la probabilidad de negociación de tendencias
  3. Introducir elementos de aprendizaje automático para la optimización de parámetros dinámicos

Resumen de las actividades

Esta estrategia se basa principalmente en la oscilación del mercado para obtener ganancias. Al capturar los puntos de inversión de precios dinámicamente con las bandas, combinado con el filtrado de tendencias, puede beneficiarse efectivamente de la inversión media mientras controla los riesgos. La clave radica en la puesta a punto de parámetros para hacer que las bandas sean sensibles pero no demasiado sensibles. El índice de tendencia también necesita períodos adecuados para desempeñar su papel. Con tendencia y paradas teóricas favorables, esta estrategia puede lograr retornos decentes a través de la optimización.


/*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)

Más.