Esta estratégia utiliza um canal de Donchian de 24 períodos combinado com uma média móvel de 200 períodos como os principais sinais de negociação.
A lógica estratégica baseia-se principalmente nos seguintes pontos:
Um canal de Donchian é construído usando o mais alto alto e o mais baixo baixo nos últimos 24 períodos.
A média móvel de 200 períodos atua como um filtro para o viés longo / curto.
Os sinais de entrada são:
O stop loss para posições curtas é definido como o mais alto durante os últimos 3 bares. O take profit é definido como o preço de entrada menos 3 vezes a diferença entre o stop loss e o preço de entrada. A lógica de stop loss e take profit da posição longa é o oposto.
A vantagem desta estratégia é que, combinando o canal de Donchian e o filtro da média móvel, evita que os sinais falsos dependam de um único indicador, melhorando significativamente a taxa de vitória.
A estratégia apresenta as seguintes vantagens:
Alta taxa de vitória: Combinando o canal de Donchian e o filtro da média móvel, perdas desnecessárias devido a falsos sinais de um único indicador são evitadas.
Risco controlado: Usando o nível mais alto/baixo mais baixo recente como níveis de stop loss efetivamente gerencia a queda em negociações perdedoras.
Simples e fáceis de implementar: a lógica utiliza indicadores simples e intuitivos que são fáceis de entender e executar.
Robustez em todos os mercados e prazos: com relativamente poucos parâmetros, a estratégia é estável em todos os produtos e prazos.
Os principais riscos que esta estratégia enfrenta são os seguintes:
Movimentos extremos do mercado: tendências unidirecionais muito fortes podem desencadear perdas de stop causando perdas amplificadas.
Risco de sinal de saída prematuro: sair de novos sinais opostos pode causar excesso de negociação em mercados agitados devido à entrada e saída repetidas.
Risco de otimização de parâmetros: A má regulação de parâmetros do período de retrospecção do canal de Donchian ou média móvel pode levar a sinais atrasados ou frequentes.
A estratégia pode ser reforçada das seguintes formas:
Otimizar o canal de Donchian e os períodos de revisão da média móvel para encontrar a melhor combinação de parâmetros.
Teste diferentes paradas de perda para obter rácios de lucro para equilibrar a taxa de ganho versus recompensa/risco.
Incorporar filtros adicionais nos sinais de entrada utilizando indicadores como MACD, RSI, etc. para melhorar a robustez.
Otimizar a lógica de saída para evitar saídas desnecessárias em mercados agitados.
Desenvolver novas combinações utilizando este quadro estratégico, por exemplo com outros canais, indicadores de faixa, etc.
A estratégia de média móvel lenta tem uma lógica clara e fácil de entender, usando uma combinação de canal de Donchian e média móvel para geração de sinal. Esta abordagem híbrida melhora significativamente a estabilidade e a taxa de vitória. A relação lucro/perda de 3: 1 também fornece um bom potencial de recompensa.
/*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)