Estrategia de trailing stop en marcos temporales múltiples


Fecha de creación: 2024-01-08 11:24:24 Última modificación: 2024-01-08 11:24:24
Copiar: 0 Número de Visitas: 644
1
Seguir
1617
Seguidores

Estrategia de trailing stop en marcos temporales múltiples

Descripción general

Esta estrategia es la versión multi-marco de la estrategia simple de seguimiento de stop loss que publiqué anteriormente. La estrategia anterior solo usaba el seguimiento de stop loss básico para entrar en una posición.

En esta estrategia, puede usar solo el stop ATR y elegir otros 3 marcos de tiempo más altos, así como el marco de tiempo actual. El stop de seguimiento en estos marcos de tiempo se trazará en el gráfico. Si todos los 4 marcos de tiempo emiten señales de múltiples cabezas, ingrese más.

Principio de estrategia

El núcleo de la estrategia es el seguimiento de los stops y el seguimiento de la tendencia. El seguimiento de los stops se utiliza para establecer los puntos de parada, que se calculan en función del valor de ATR para evitar que los stops se rompan. El seguimiento de la tendencia se decide en la entrada observando la dirección de la tendencia en diferentes marcos de tiempo.

Concretamente, la estrategia primero calcula el valor del ATR en diferentes marcos de tiempo y establece la distancia de parada. Luego, se emite una señal de más o menos cuando se determina que el precio ha roto el punto de parada. Si las señales en varios marcos de tiempo coinciden, se entra.

Al combinar las tendencias de diferentes períodos, se puede filtrar eficazmente las brechas falsas. Al mismo tiempo, el seguimiento de los stop loss puede bloquear las ganancias y controlar eficazmente el riesgo.

Ventajas estratégicas

  1. El uso de juicios de múltiples marcos de tiempo para filtrar el ruido y identificar la dirección de las tendencias
  2. ATR rastrea los paros para ajustar dinámicamente la distancia de los paros y reducir la probabilidad de que se derive
  3. La combinación de seguimiento de tendencias y gestión de pérdidas permite el seguimiento de tendencias y el cierre de pérdidas a tiempo
  4. Menos parámetros, fácil de entender y ajustar

Análisis de riesgos

  1. Si los parámetros están mal configurados, pueden estar demasiado cerca o lejos del precio, ser fácilmente rotados o estancados demasiado lejos.
  2. Combinación de marcos de tiempo múltiple Si los parámetros no están configurados correctamente, puede no funcionar de manera eficiente o juzgar errores
  3. Necesita configurar los parámetros de stop loss y los parámetros del marco de tiempo a la vez, de lo contrario no se puede obtener el mejor efecto

La solución:

  1. Prueba repetidamente diferentes combinaciones y variedades de parámetros para encontrar el mejor
  2. Optimización de la proporción y cantidad de marcos de tiempo para asegurar un juicio de tendencias fiable
  3. Ajuste el múltiplo de los paros ATR para encontrar un equilibrio entre que el parón no se rompa y que la distancia no sea demasiado grande

Dirección de optimización

Las estrategias se pueden optimizar en los siguientes aspectos:

  1. Aumentar o disminuir el número de marcos de tiempo para encontrar una combinación de marcos que juzguen las mejores tendencias
  2. Prueba de diferentes ATR para determinar la mejor distancia de frenado
  3. Añadir un mecanismo de reingreso para crear más posiciones si la tendencia continúa
  4. En combinación con otros indicadores de filtración de tiempo de entrada, por ejemplo, indicadores de cantidad y precio
  5. Optimización para diferentes parámetros de variedad

Resumir

La estrategia logra una combinación orgánica de seguimiento de tendencias y control de riesgos a través de la forma en que el ATR de múltiples marcos de tiempo rastrea los paros. En comparación con un solo parón, se puede juzgar con mayor claridad la dirección de la tendencia; en comparación con un solo marco de tiempo, se filtra mucho el ruido. La configuración racional de los parámetros de parón y el marco de tiempo es clave para lograr un efecto óptimo.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

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

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

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

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


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // 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]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

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

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

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

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)