A estratégia de Puling é uma estratégia de tendência baseada em canais de Donchian. Ela usa canais de Donchian rápidos e lentos para identificar a direção da tendência e entrar em retrações. As vantagens desta estratégia são que ela pode rastrear tendências automaticamente e cortar perdas no tempo quando a tendência muda. Mas também tem os riscos de retração e stop loss estar muito perto.
A estratégia define primeiro o período do canal rápido como 20 bares e o período do canal lento como 50 bares.
Em primeiro lugar, o máximo máximo e o mínimo mínimo do canal rápido são calculados, e o ponto médio é tomado como a linha de stop loss.
Quando o preço atravessa o topo do canal lento, vá longo. Quando o preço atravessa o fundo do canal lento, vá curto. Depois de entrar na posição, defina o stop loss no ponto médio do canal rápido.
Assim, o canal lento determina a direção da tendência principal, enquanto o canal rápido rastreia breakouts menores dentro de um pequeno intervalo para determinar o ponto de stop loss.
A estrutura de canal duplo pode rastrear automaticamente as tendências e cortar rapidamente as perdas quando as tendências se revertem.
Entrar em pullbacks, com algum efeito de filtragem de tendência.
A distância de parada de perda próxima pode controlar a perda única.
As estratégias que seguem tendências podem ter baixas relativamente elevadas, o que requer uma preparação psicológica.
O período do canal rápido é curto, então o stop loss está perto, propenso a ser parado.
A estrutura de canal duplo pode gerar entradas excessivas, exigindo um dimensionamento razoável das posições.
Podemos adicionar volatilidade etc. nas condições de entrada para filtrar breakouts sem força de tendência suficiente.
Otimizar os parâmetros do período do canal. Podemos encontrar as combinações ótimas de parâmetros do canal sistematicamente.
Combinar vários prazos: determinar a tendência principal em prazos mais longos e negociar em prazos menores.
Distância dinâmica de stop loss. Ajustar a distância de stop dinamicamente com base na volatilidade do mercado.
A estratégia de Puling é uma estratégia padrão de tendência seguindo a estratégia em geral. Ela usa canais de preços para determinar a direção da tendência e define stop loss para controlar riscos. A estratégia tem algumas vantagens, mas também os problemas de drawdown e stop loss sendo muito perto. Podemos otimizá-la ajustando parâmetros de canal, adicionando filtros, etc. Mas devemos notar que as estratégias de tendência seguem exigem uma forte psicologia para suportar drawdowns.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2020 //@version=4 strategy("Noro's RiskTurtle Strategy", shorttitle = "RiskTurtle str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") risk = input(2, minval = 0.1, maxval = 99, title = "Risk size, %") fast = input(20, minval = 1, title = "Fast channel (for stop-loss)") slow = input(50, minval = 1, title = "Slow channel (for entries)") showof = input(true, defval = true, title = "Show offset") showll = input(true, defval = true, title = "Show lines") showdd = input(true, defval = true, title = "Show label (drawdown)") showbg = input(true, defval = true, title = "Show background") fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Donchian price channel fast hf = highest(high, fast) lf = lowest(low, fast) center = (hf + lf) / 2 //Donchian price chennal slow hs = highest(high, slow) ls = lowest(low, slow) //Lines colorpc = showll ? color.blue : na colorsl = showll ? color.red : na offset = showof ? 1 : 0 plot(hs, offset = offset, color = colorpc, title = "Slow channel high") plot(ls, offset = offset, color = colorpc, title = "Slow channel low") plot(center, offset = offset, color = colorsl, title = "Fast channel stop-loss") //Background size = strategy.position_size colorbg = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na bgcolor(colorbg, transp = 70) //Var loss = 0.0 maxloss = 0.0 equity = 0.0 truetime = true //Lot size risksize = -1 * risk risklong = ((center / hs) - 1) * 100 coeflong = abs(risksize / risklong) lotlong = (strategy.equity / close) * coeflong riskshort = ((center / ls) - 1) * 100 coefshort = abs(risksize / riskshort) lotshort = (strategy.equity / close) * coefshort //Orders strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and hs > 0 and truetime) strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and ls > 0 and truetime) strategy.exit("LongExit", "Long", stop = center, when = needlong and strategy.position_size > 0) strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0) if time > timestamp(toyear, tomonth, today, 23, 59) strategy.close_all() strategy.cancel("Long") strategy.cancel("Short") if showdd //Drawdown max = 0.0 max := max(strategy.equity, nz(max[1])) dd = (strategy.equity / max - 1) * 100 min = 100.0 min := min(dd, nz(min[1])) //Max loss size equity := strategy.position_size == 0 ? strategy.equity : equity[1] loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0 maxloss := min(nz(maxloss[1]), loss) //Label min := round(min * 100) / 100 maxloss := round(maxloss * 100) / 100 labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%" var label la = na label.delete(la) tc = min > -100 ? color.white : color.red osx = timenow + round(change(time)*10) osy = highest(100) // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)