Tendencia siguiendo la estrategia de ruptura del canal con media móvil y parada de seguimiento

El autor:¿ Qué pasa?, Fecha: 15 de enero de 2024 12: 25:26
Las etiquetas:

img

Resumen general

Esta es una estrategia de ruptura basada en el canal de precios, combinada con indicadores de promedio móvil y stop/take profit para la entrada y salida.

Estrategia lógica

La estrategia calcula promedios móviles de precios altos/bajos para formar un canal de precios. Específicamente, calcula longitud 10 SMA de precios altos/bajos para trazar la banda superior e inferior del canal. Cuando el precio se rompe por encima de la banda inferior en la banda superior, entra en largo. Cuando el precio se rompe desde la banda superior en la banda inferior, entra en corto.

Después de la entrada, la estrategia utiliza un stop loss fijo o un trailing stop para salir. El trailing stop consta de dos parámetros: nivel fijo de ganancia y offset de activación. Cuando el precio alcanza el offset de activación, el nivel de ganancia comienza a arrastrar el precio. Esto permite bloquear las ganancias manteniendo algo de espacio abierto.

La estrategia también combina el filtro de rango de tiempo, solo ejecutando backtest dentro de un marco de tiempo histórico especificado, para probar el rendimiento en diferentes etapas del mercado.

Análisis de ventajas

La estrategia explota el canal de precios y el seguimiento de tendencias con trailing stop, lo que le permite capturar las direcciones de tendencias a medio y largo plazo.

En general, la estrategia tiene una lógica clara, indicadores y parámetros mínimos, fácil de probar, adecuada para el comercio de tendencias a medio y largo plazo y puede beneficiarse de tendencias fuertes.

Análisis de riesgos

La estrategia tiende a detenerse fácilmente durante los mercados agitados, incapaces de mantener las ganancias.

La regulación de los parámetros es bastante subjetiva y requiere ajustes en diferentes etapas del mercado.

Oportunidades de mejora

Otros indicadores como el volumen, las bandas de Bollinger se pueden incorporar para filtrar las señales de entrada, evitando trampas.

Las reglas de salida pueden actualizarse a trailing stop o Chandelier Exit. Los objetivos de ganancia parcial pueden considerarse cuando el precio vuelve a entrar en el canal.

Conclusión

En resumen, esta es una estrategia cuantitativa basada en el canal de precios, el seguimiento de tendencias, la gestión de stop loss / take profit. Tiene un flujo lógico claro, una estructura de parámetros simple, fácil de entender y backtest. Es adecuado para aprender conceptos de negociación algorítmica. La estrategia se puede mejorar en varios aspectos para mejorar la estabilidad y la rentabilidad. La idea central es capturar la dirección de la tendencia y gestionar los riesgos a través de stop loss y take profit. Se puede aplicar a varios productos en diferentes plazos.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

Más.