tendencia siguiendo una estrategia basada en los canales de Donchian

El autor:¿ Qué pasa?, Fecha: 2023-10-31 17:44:19
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Ventajas

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

Los riesgos

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

Direcciones de optimización

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

Resumen de las actividades

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)

Más.