Estrategia de reversión de pérdidas de parada de seguimiento

El autor:¿ Qué pasa?, Fecha: 2023-12-01 13:41:41
Las etiquetas:

img

Resumen general

Esta es una estrategia muy simple. Consiste en un solo stop loss. Cuando se activa el stop loss, la posición se invierte y se establece un stop loss para la nueva posición.

Estrategia lógica

La estrategia se basa en uno de los tres tipos de stop loss: stop loss porcentual, stop loss ATR, stop loss absoluto.

Específicamente, la estrategia primero calcula el valor de stop loss basado en el tipo de stop loss elegido. Luego verifica las señales de entrada, yendo largo cuando el alto está por encima del precio de stop loss anterior y yendo corto cuando el bajo está por debajo del precio de stop loss anterior. Después de entrar, sigue actualizando el precio de stop loss para seguir los cambios de precio. El precio de stop loss largo es bajo menos el valor de stop loss, el precio de stop loss corto es alto más el valor de stop loss.

Análisis de ventajas

La mayor ventaja de esta estrategia es su simplicidad, que requiere el seguimiento de un solo stop loss sin necesidad de considerar las selecciones de puntos de entrada y salida.

En comparación con el stop loss fijo, el stop loss de seguimiento que emplea puede bloquear ganancias más grandes al tiempo que reduce la probabilidad de que se produzca un stop loss.

Análisis de riesgos

Los principales riesgos de esta estrategia pueden provenir de la configuración inadecuada del valor de stop loss. El valor de stop loss demasiado grande puede conducir a pérdidas amplificadas, mientras que el valor demasiado pequeño puede causar un desencadenamiento frecuente de stop loss. Esto requiere una optimización adaptativa basada en las condiciones del mercado.

Otro riesgo es el juicio direccional inexacto después de que se activa el stop loss al revertir posiciones, lo que pierde oportunidades de inversión de precios o aumenta las pérdidas.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Añadir juicio de tendencia para evitar el comercio contra tendencias
  2. Optimizar el cálculo del valor de stop loss para hacer un seguimiento más dinámico del mercado
  3. Aumentar la validación de la ruptura para señales de reversión de mayor probabilidad
  4. Incorporar medidas de volatilidad para encontrar el mejor momento de reversión

Conclusión

La estrategia realiza ganancias a través de un mecanismo de stop loss simple y es fácil de comprender para los principiantes. En comparación con las estrategias tradicionales de stop loss, agrega posiciones de reversión de gatillo de post stop loss para adquirir ganancias adicionales. Con pruebas y optimización continuas, puede convertirse en un programa cuantitativo muy práctico.


/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50)

////////////
// Inputs //

sl_type    = input("%", options = ["%", "ATR", "Absolute"])

sl_perc    = input(4,     title = "% SL",        type = input.float)
atr_length = input(10,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)
sl_absol   = input(10,    title = "Absolute SL", type = input.float)

// 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 = 2016, 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

//////////////////
// CALCULATIONS //

// SL values
sl_val = sl_type == "ATR"      ? atr_mult * atr(atr_length) : 
         sl_type == "Absolute" ? sl_absol : 
         close * sl_perc / 100
         
// Init Variables
pos         = 0
trailing_sl = 0.0

// Signals
long_signal  = nz(pos[1]) !=  1 and high > nz(trailing_sl[1])
short_signal = nz(pos[1]) != -1 and low  < nz(trailing_sl[1]) 

// Calculate SL
trailing_sl := short_signal     ? high + sl_val : 
               long_signal      ? low  - sl_val : 
               nz(pos[1]) ==  1 ? max(low  - sl_val, nz(trailing_sl[1])) :  
               nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : 
               nz(trailing_sl[1])
               
// Position var               
pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 

//////////////
// PLOTINGS //

plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)

//////////////
// STRATEGY //

if (time_cond and pos != 1)
    strategy.entry("long",  true, stop = trailing_sl)
  
if (time_cond and pos != -1) 
    strategy.entry("short", false, stop = trailing_sl)

Más.