Estrategia dinámica de detención de pérdidas y toma de ganancias basada en la doble detención de seguimiento ATR

El autor:¿ Qué pasa?, Fecha: 2024-03-22 13:52:59
Las etiquetas:

img

Resumen general

Esta estrategia construye líneas de stop-loss dinámicas con dos indicadores de Rango Verdadero Medio (ATR) con diferentes períodos, generando señales comerciales cuando el precio rompe las líneas de stop-loss. También establece dinámicamente el nivel de take-profit basado en la longitud del cuerpo de la vela actual para lograr una stop-loss y take-profit dinámicos. La estrategia también incorpora indicadores EMA para ayudar a juzgar la tendencia.

Principios de estrategia

  1. Calcular los valores del indicador ATR para dos períodos diferentes (default 10 y 20), y luego multiplicarlos por sus respectivos coeficientes de sensibilidad (default 1 y 2) para obtener dos anchuras de stop-loss.
  2. Generar señales largas o cortas basadas en la posición de precio por encima o por debajo de las dos líneas de stop-loss y la situación de ruptura.
  3. El nivel de ganancia se calcula dinámicamente sobre la base de 1,65 veces (ajustable) la longitud actual del cuerpo de la vela.
  4. Después de abrir una posición, si el precio alcanza el nivel de take-profit, la posición se cierra para obtener ganancias.
  5. Utilice indicadores como la EMA para ayudar a juzgar la tendencia actual y proporcionar referencia para la entrada.

Esta estrategia utiliza las características del indicador ATR para construir dos stop-loss dinámicos, que pueden adaptarse bien a diferentes volatilidades del mercado y responder rápidamente a los cambios del mercado.

Análisis de ventajas

  1. Las líneas de stop-loss dinámicas duales pueden adaptarse a las diferentes volatilidades del mercado y tienen una gran flexibilidad.
  2. El nivel de take-profit se calcula dinámicamente en función de la longitud actual del cuerpo de la vela, lo que permite capturar más ganancias en los mercados de tendencia.
  3. El uso de la EMA y otros indicadores para ayudar a juzgar la tendencia proporciona una referencia para la entrada y mejora la fiabilidad de la estrategia.
  4. La lógica del código es clara y legible, por lo que es fácil de entender y optimizar.

Análisis de riesgos

  1. En los mercados de rango limitado, las operaciones frecuentes pueden acarrear altos costes de transacción y afectar a la rentabilidad.
  2. La configuración de los parámetros de la línea de stop-loss y los multiplicadores de take-profit deben optimizarse de acuerdo con las diferentes características del mercado y del producto; los parámetros inadecuados pueden resultar en un mal rendimiento de la estrategia.
  3. La estrategia se basa principalmente en las rupturas de precios de las líneas de stop-loss dinámicas para generar señales, que pueden producir señales falsas en algunas rupturas falsas de gran fluctuación.

Direcciones de optimización

  1. Para los mercados de rango, considere introducir más indicadores o condiciones para filtrar las señales de negociación, como el RSI y el MACD.
  2. Para diferentes productos y mercados, se puede utilizar la retroevaluación histórica y la optimización de parámetros para encontrar los parámetros óptimos de la línea de stop-loss y los multiplicadores de beneficios.
  3. Considerar la introducción de módulos de gestión de posiciones y control de riesgos para ajustar dinámicamente el tamaño de las posiciones en función de la volatilidad del mercado y el riesgo de la cuenta.
  4. Añadir más indicadores de tendencia para mejorar la fiabilidad y precisión de las señales.

Resumen de las actividades

Esta estrategia, con su diseño de líneas de stop-loss dinámicas duales y take-profit dinámico, puede adaptarse bien a diferentes entornos de mercado y tener un buen rendimiento en los mercados de tendencia. Sin embargo, en los mercados de rango, puede enfrentar el problema de operaciones frecuentes y compensaciones de ganancias y pérdidas. Por lo tanto, esta estrategia es más adecuada para su uso en los mercados de tendencia y necesita ser optimizada y ajustada en función de las características del producto y las condiciones del mercado. Además, todavía hay espacio para una mayor optimización, como la introducción de más condiciones de filtrado, gestión de posiciones y módulos de control de riesgos para mejorar la robustez y rentabilidad de la estrategia. En general, la estrategia tiene una idea clara, una lógica simple y fácil de entender, y tiene cierto valor práctico y espacio para la optimización, que es digno de investigación y aplicación adicionales.


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

//@version=4
strategy(title="UT Bot Strategy", overlay=true)

// Inputs
a1 = input(1, title="Key Value 1 ('This changes the sensitivity')")
c1 = input(10, title="ATR Period 1")
a2 = input(2, title="Key Value 2 ('This changes the sensitivity')")
c2 = input(20, title="ATR Period 2")
h = input(false, title="Signals from Heikin Ashi Candles")

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)
 
// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate
 
////////////////////////////////////////////////////////////////////////////////

xATR1 = atr(c1)
nLoss1 = a1 * xATR1
xATR2 = atr(c2)
nLoss2 = a2 * xATR2

src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=false) : close

xATRTrailingStop1 = 0.0
xATRTrailingStop1 := iff(src > nz(xATRTrailingStop1[1], 0) and src[1] > nz(xATRTrailingStop1[1], 0), max(nz(xATRTrailingStop1[1]), src - nLoss1),
   iff(src < nz(xATRTrailingStop1[1], 0) and src[1] < nz(xATRTrailingStop1[1], 0), min(nz(xATRTrailingStop1[1]), src + nLoss1), 
   iff(src > nz(xATRTrailingStop1[1], 0), src - nLoss1, src + nLoss1)))

xATRTrailingStop2 = 0.0
xATRTrailingStop2 := iff(src > nz(xATRTrailingStop2[1], 0) and src[1] > nz(xATRTrailingStop2[1], 0), max(nz(xATRTrailingStop2[1]), src - nLoss2),
   iff(src < nz(xATRTrailingStop2[1], 0) and src[1] < nz(xATRTrailingStop2[1], 0), min(nz(xATRTrailingStop2[1]), src + nLoss2), 
   iff(src > nz(xATRTrailingStop2[1], 0), src - nLoss2, src + nLoss2)))
 
pos = 0   
pos := iff(src[1] < nz(xATRTrailingStop1[1], 0) and src > nz(xATRTrailingStop1[1], 0), 1,
   iff(src[1] > nz(xATRTrailingStop1[1], 0) and src < nz(xATRTrailingStop1[1], 0), -1, nz(pos[1], 0))) 
   
xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue 

ema1 = ema(src, 1)
above1 = crossover(ema1, xATRTrailingStop1)
below1 = crossover(xATRTrailingStop1, ema1)
buy1 = src > xATRTrailingStop1 and above1 
sell1 = src < xATRTrailingStop1 and below1
barbuy1 = src > xATRTrailingStop1 
barsell1 = src < xATRTrailingStop1 

ema2 = ema(src, 1)
above2 = crossover(ema2, xATRTrailingStop2)
below2 = crossover(xATRTrailingStop2, ema2)
buy2 = src > xATRTrailingStop2 and above2 
sell2 = src < xATRTrailingStop2 and below2
barbuy2 = src > xATRTrailingStop2 
barsell2 = src < xATRTrailingStop2 

plotshape(buy1,  title="Buy 1",  text='Buy 1',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell1, title="Sell 1", text='Sell 1', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)
plotshape(buy2,  title="Buy 2",  text='Buy 2',  style=shape.labelup,   location=location.belowbar, color=color.green, textcolor=color.white, transp=0, size=size.tiny)
plotshape(sell2, title="Sell 2", text='Sell 2', style=shape.labeldown, location=location.abovebar, color=color.red,   textcolor=color.white, transp=0, size=size.tiny)

barcolor(barbuy1  ? color.green : na)
barcolor(barsell1 ? color.red   : na)
barcolor(barbuy2  ? color.green : na)
barcolor(barsell2 ? color.red   : na)

// Calculate SL and TP levels
candle_size = abs(open - close)
tp_level = close + candle_size *65

// Close long positions if TP is hit
strategy.exit("TP Long", "long", limit=tp_level)

// Close short positions if TP is hit
strategy.exit("TP Short", "short", limit=tp_level)

// Enter long position
strategy.entry("long", strategy.long, when=(buy1 or buy2) and time_cond)

// Enter short position
strategy.entry("short", strategy.short, when=(sell1 or sell2) and time_cond)

//adding ema with width
// Calculate EMA and SMA
ema5 = ema(close, 5)
ema200 = ema(close, 200)
ema21 = ema(close, 21)
ema50 = ema(close, 50)
sma50 = sma(close, 50)

// Plot EMA and SMA with width
plot(ema5, color=color.rgb(130, 235, 139), title="EMA 5", linewidth=1)
plot(ema200, color=color.rgb(243, 246, 249), title="EMA 200", linewidth=2)
plot(ema21, color=color.blue, title="21", linewidth=1)
plot(ema50, color=color.rgb(255, 64, 0), title="EMA 50", linewidth=2)
//plot(sma50, color=color.purple, title="SMA 20", linewidth=2)

Más.