La estrategia de Puling es una estrategia de seguimiento de tendencias basada en los canales de Donchian. Utiliza canales de Donchian rápidos y lentos para identificar la dirección de la tendencia y entrar en retrocesos. Las ventajas de esta estrategia son que puede rastrear las tendencias automáticamente y cortar las pérdidas a tiempo cuando la tendencia cambia. Pero también tiene los riesgos de caída y parada de pérdidas que están demasiado cerca.
La estrategia primero define el período de canal rápido como 20 barras, y el período de canal lento como 50 barras.
Primero, se calcula el máximo y mínimo más alto del canal rápido, y el punto medio se toma como la línea de stop loss.
Cuando el precio rompe la parte superior del canal lento, ir largo. Cuando el precio rompe la parte inferior del canal lento, ir corto. Después de entrar en la posición, establecer el stop loss en el punto medio del canal rápido.
Por lo tanto, el canal lento determina la dirección de la tendencia principal, mientras que el canal rápido rastrea las rupturas menores dentro de un pequeño rango para determinar el punto de stop loss.
La estructura de doble canal puede rastrear automáticamente las tendencias y cortar rápidamente las pérdidas cuando las tendencias se invierten.
Solo tomando entradas cuando el precio rompe los límites del canal se pueden filtrar algunas rupturas falsas sin tendencia real.
El riesgo controlado. La distancia de parada de pérdida cercana puede controlar la pérdida única.
Las estrategias que siguen tendencias pueden tener retiros relativamente grandes, lo que requiere una preparación psicológica.
El período del canal rápido es corto por lo que el stop loss está cerca, propenso a ser detenido.
La estructura de doble canal puede generar entradas excesivas, lo que requiere un tamaño de posición razonable.
Podemos añadir volatilidad, etc. en las condiciones de entrada para filtrar las rupturas sin suficiente fuerza de tendencia.
Podemos encontrar las combinaciones óptimas de parámetros de canal de forma sistemática.
Combinando múltiples marcos de tiempo Determina la tendencia principal en los marcos de tiempo más altos y el comercio en marcos de tiempo más bajos.
Distancia dinámica de parada de pérdida. Ajustar la distancia de parada dinámicamente en función de la volatilidad del mercado.
La estrategia de Puling es una estrategia estándar de tendencia general. Utiliza canales de precios para determinar la dirección de la tendencia y establece stop loss para controlar los riesgos. La estrategia tiene algunas ventajas, pero también los problemas de reducción y stop loss que están demasiado cerca. Podemos optimizarlo mediante el ajuste de parámetros de canal, añadiendo filtros, etc. Pero debemos tener en cuenta que las estrategias de tendencia requieren una fuerte psicología para soportar reducciones.
/*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)