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.
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.
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.
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.
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.
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)