Esta estrategia utiliza un canal de Donchian de 24 períodos combinado con un promedio móvil de 200 períodos como las principales señales de negociación.
La lógica de la estrategia se basa principalmente en los siguientes puntos:
Un canal de Donchian se construye utilizando el máximo más alto y el mínimo más bajo en los últimos 24 períodos.
Si el precio rompe el canal de Donchian y está al otro lado del promedio móvil, una reversión puede ser probable.
Las señales de entrada son:
El stop loss para posiciones cortas se establece en el máximo máximo durante las últimas 3 barras. El take profit se establece en el precio de entrada menos 3 veces la diferencia entre el stop loss y el precio de entrada. La lógica de stop loss y take profit de la posición larga es la opuesta.
La ventaja de esta estrategia es que, al combinar el canal de Donchian y el filtro de media móvil, evita que las señales falsas se basen en un único indicador, mejorando significativamente la tasa de ganancia.
La estrategia tiene las siguientes ventajas:
Alta tasa de ganancia: al combinar el canal de Donchian y el filtro de media móvil, se evitan pérdidas innecesarias debido a señales falsas de un solo indicador.
Riesgo controlable: el uso de los niveles de alto y bajo más altos recientes como niveles de stop loss maneja efectivamente la desventaja en las operaciones perdedoras.
Simple y fácil de implementar: La lógica utiliza indicadores simples e intuitivos que son fáciles de entender y ejecutar.
Robustez a través de mercados y plazos: con relativamente pocos parámetros, la estrategia es estable a través de diferentes productos y plazos.
Los principales riesgos a los que se enfrenta esta estrategia son:
Movimientos extremos del mercado: las tendencias unidireccionales muy fuertes pueden desencadenar pérdidas de parada causando pérdidas amplificadas.
Riesgo de señales de salida prematura: salir de nuevas señales opuestas puede causar sobre-negociación en mercados agitados debido a la entrada y salida repetidas.
Riesgo de optimización de parámetros: el mal ajuste de parámetros del período de retroceso del canal de Donchian o la media móvil puede conducir a señales retrasadas o frecuentes.
La estrategia puede mejorarse de las siguientes maneras:
Optimizar el canal de Donchian y los períodos de revisión de promedio móvil para encontrar la mejor combinación de parámetros.
Prueba diferentes pérdidas de parada para tomar ratios de ganancia para equilibrar la tasa de ganancia frente a la recompensa / riesgo.
Incorporar filtros adicionales en las señales de entrada utilizando indicadores como MACD, RSI, etc. para mejorar la robustez.
Optimice la lógica de salida para evitar salidas innecesarias en mercados agitados.
Desarrollar nuevas combinaciones utilizando este marco estratégico, por ejemplo con otros canales, indicadores de banda, etc.
La estrategia de promedio móvil lento tiene una lógica clara y fácil de entender utilizando una combinación de canal de Donchian y promedio móvil para la generación de señales. Este enfoque híbrido mejora significativamente la estabilidad y la tasa de ganancia.
/*backtest start: 2023-11-06 00:00:00 end: 2023-12-06 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Mysteriown //@version=4 strategy("Lagged Donchian Channel + EMA", overlay = true) //tradePeriod = time(timeframe.period,"0000-0000:1234567")?true:false // ------------------------------------------ // // ----------------- Inputs ----------------- // // ------------------------------------------ // period = input(24, title="Channel's periods") Pema = input(200, title="EMA's periods ?") ratio = input(3, title="Ratio TP", type=input.float) loss = input(20, title="Risk Loss ($)") lev = input(5, title="Leverage *...") chan = input(title="Plot channel ?", type=input.bool, defval=false) Bpos = input(title="Plot Bull positions ?", type=input.bool, defval=false) bpos = input(title="Plot Bear positions ?", type=input.bool, defval=false) labels = input(title="Plot labels of bets ?", type=input.bool, defval=true) supp = input(title="Delete last labels ?", type=input.bool, defval=true) // ------------------------------------------ // // ---------- Canal, EMA and arrow ---------- // // ------------------------------------------ // pema = ema(close,Pema) plot(pema, title="EMA", color=color.blue) canalhaut = highest(period)[1] canalbas = lowest(period)[1] bear = close[1] > canalhaut[1] and close < open and high > pema bull = close[1] < canalbas[1] and open < close and low < pema canalhautplot = plot(chan? canalhaut:na, color=color.yellow) canalbasplot = plot(chan? canalbas:na, color=color.yellow) plotshape(bear, title='Bear', style=shape.triangledown, location=location.abovebar, color=color.red, offset=0) plotshape(bull, title='Bull', style=shape.triangleup, location=location.belowbar, color=color.green, offset=0) // ------------------------------------------ // // ------------- Position Short ------------- // // ------------------------------------------ // SlShort = highest(3) BidShort = close[1] TpShort = BidShort-((SlShort-BidShort)*ratio) deltaShort = (SlShort-BidShort)/BidShort betShort = round(loss/(lev*deltaShort)*100)/100 cryptShort = round(betShort*lev/BidShort*1000)/1000 // if bear[1] and labels //and low < low[1] // Lbear = label.new(bar_index, na, text="SHORT\n\nSL: " + tostring(SlShort) + "\n\nBid: " + tostring(BidShort) + "\n\nTP: " + tostring(TpShort) + "\n\nMise: " + tostring(betShort) + "\n\nCryptos: " + tostring(cryptShort), color=color.red, textcolor=color.white, style=label.style_labeldown, yloc=yloc.abovebar) // label.delete(supp ? Lbear[1] : na) var bentry=0.0 var bsl=0.0 var btp=0.0 if bear[1] and low < low[1] bentry:=BidShort bsl:=SlShort btp:=TpShort pbentry = plot(bpos? bentry:na, color=color.orange) plot(bpos? (bentry+btp)/2:na, color=color.gray) pbsl = plot(bpos? bsl:na, color=color.red) pbtp = plot(bpos? btp:na, color=color.green) fill(pbentry,pbsl, color.red, transp=70) fill(pbentry,pbtp, color.green, transp=70) // ------------------------------------------ // // ------------- Position Long -------------- // // ------------------------------------------ // SlLong = lowest(3) BidLong = close[1] TpLong = BidLong + ((BidLong - SlLong) * ratio) deltaBull = (BidLong - SlLong)/BidLong betLong = round(loss/(lev*deltaBull)*100)/100 cryptLong = round(betLong*lev/BidLong*1000)/1000 // if bull[1] and labels //and high > high[1] // Lbull = label.new(bar_index, na, text="LONG\n\nSL: " + tostring(SlLong) + "\n\nBid: " + tostring(BidLong) + "\n\nTP: " + tostring(TpLong) + "\n\nMise: " + tostring(betLong) + "\n\nCryptos: " + tostring(cryptLong), color=color.green, textcolor=color.white, style=label.style_labelup, yloc=yloc.belowbar) // label.delete(supp ? Lbull[1] : na) var Bentry=0.0 var Bsl=0.0 var Btp=0.0 if bull[1] and high > high[1] Bentry:=BidLong Bsl:=SlLong Btp:=TpLong pBentry = plot(Bpos?Bentry:na, color=color.orange) plot(Bpos?(Bentry+Btp)/2:na, color=color.gray) pBsl = plot(Bpos?Bsl:na, color=color.red) pBtp = plot(Bpos?Btp:na, color=color.green) fill(pBentry,pBsl, color.red, transp=70) fill(pBentry,pBtp, color.green, transp=70) // ------------------------------------------ // // --------------- Strategie ---------------- // // ------------------------------------------ // Bear = bear[1] and low < low[1] Bull = bull[1] and high > high[1] if (Bear and strategy.opentrades==0) strategy.order("short", false, 1, limit=BidShort) strategy.exit("exit", "short", limit = TpShort, stop = SlShort) strategy.cancel("short", when = high > SlShort or low < (BidShort+TpShort)/2) strategy.close("short", when=bull) if (Bull and strategy.opentrades==0) strategy.order("long", true, 1, limit=BidLong) strategy.exit("exit", "long", limit = TpLong, stop = SlLong) strategy.cancel("long", when = low < SlLong or high > (BidLong+TpLong)/2) strategy.close("long", when=bear)