Estrategia de seguimiento de tendencias del canal de Donchian


Fecha de creación: 2024-01-22 12:30:05 Última modificación: 2024-01-22 12:30:05
Copiar: 0 Número de Visitas: 645
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias del canal de Donchian

Descripción general

La estrategia de seguimiento de tendencias de canal donchiano es una estrategia de seguimiento de tendencias basada en el indicador de canal donchiano. Utiliza canales donchianos de diferentes longitudes para identificar tendencias de precios y generar señales de negociación cuando los precios se rompen en el canal.

La idea principal de esta estrategia es utilizar los canales Donchian de largos períodos para determinar la dirección de las grandes tendencias, y utilizar los canales Donchian de períodos cortos como señales de entrada y parada. Su objetivo es capturar las tendencias de precios de las líneas medias y largas y evitar ser confundido por las fluctuaciones de corto plazo en el mercado.

Principio de estrategia

  1. Los precios máximos y mínimos de cierre de un período largo (por ejemplo, 50 días) se calculan para construir el canal Donchian. Cuando el precio se eleva por encima del canal, se ve más alto, y cuando se baja, se ve más bajo. Esta es la base para juzgar la gran tendencia.

  2. Calcular el precio máximo de cierre y el precio mínimo de cierre en un período corto (por ejemplo, 20 días) como criterios de entrada y parada. Cuando el precio rompe el canal largo, si el precio de cierre también rompe el canal corto, la entrada es más / vacía.

  3. Cuando se mantiene una posición de más de una cabeza, se detiene si el precio cae por debajo de la línea corta. Cuando se mantiene una posición de cabeza vacía, se detiene si el precio se rompe por encima de la línea corta.

  4. El punto de parada está configurado como N veces ATR. Esto puede ajustarse automáticamente según la volatilidad del mercado, lo que ayuda a reducir la posibilidad de que se active el stop loss.

  5. Se puede optar por cerrar la posición antes de que finalice la operación, o mantener la posición hasta que se detenga la pérdida. Esto se puede controlar mediante un parámetro de entrada.

La estrategia tiene en cuenta tanto el juicio de tendencias como el cierre de pérdidas de ganancias, y permite capturar tendencias de precios y controlar el riesgo, lo que es adecuado para operaciones de línea media y larga.

Análisis de las ventajas

  1. Identificar con eficacia las tendencias de largo plazo y evitar ser molestado por el ruido de los mercados a corto plazo.

  2. El mecanismo de detención automática de pérdidas puede limitar las pérdidas individuales.

  3. ATR Stop puede ajustar la distancia de detención de acuerdo con la volatilidad del mercado, reduciendo la posibilidad de que el stop loss sea impactado.

  4. Se puede optar por hacer un cierre automático de la posición cuando no se puede negociar, para administrar el riesgo de la operación.

  5. La lógica de la estrategia es simple, clara y fácil de entender.

Análisis de riesgos

  1. En mercados sin tendencias claras, las estrategias producen más operaciones, lo que aumenta el costo de las operaciones y la posibilidad de obtener pérdidas.

  2. Aunque hay un mecanismo de stop loss, en circunstancias excepcionales, las brechas de precios pueden caer directamente por encima de los puntos de stop loss y causar grandes pérdidas.

  3. El ATR se calcula basándose únicamente en datos históricos y no puede predecir con exactitud el movimiento y la volatilidad en el futuro, por lo que la distancia real de parada puede ser demasiado grande o demasiado pequeña.

  4. En el mundo real, los pedidos de stop loss no pueden ser ejecutados con total seguridad. En casos extremos, pueden ser omitidos y causar pérdidas.

Dirección de optimización

  1. Ajuste de los parámetros del canal Donchian para optimizar la detección de tendencias.

  2. Combinado con otros indicadores que confirman las señales de negociación, como MACD, KDJ, etc., mejora la estabilidad de la estrategia.

  3. Aumentar el Stop Loss móvil para que el Stop Loss se mueva con el precio, limitando aún más las pérdidas.

  4. Prueba el efecto de diferentes períodos de tenencia sobre el efecto general para determinar el período de tenencia óptimo.

  5. Considere la posibilidad de ajustar dinámicamente el tamaño de la posición y aumentar la posición en una situación de tendencia.

Resumir

La estrategia de seguimiento de tendencias del canal de Donchian integra el juicio de tendencias con el control de riesgos, obteniendo excess return a través de la identificación de tendencias, mientras que el mecanismo de parada controla el riesgo de la cola. La estrategia es adecuada para identificar y capturar tendencias de precios de línea media y larga, que pueden obtener un rendimiento positivo estable después de la optimización de los parámetros y la complementación del mecanismo.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Donchian", overlay=true, calc_on_every_tick=true)

// =============================================================================
// VARIABLES
// =============================================================================

donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10')
permit_long  = input.bool(title = 'Permit long', defval = true)
permit_short  = input.bool(title = 'Permit short', defval = true)
risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25)
stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5)
atrLen = input.int(title="ATR Length", defval=20)
close_in_end  = input.bool(title = 'Close in end', defval = true)
permit_stop  = input.bool(title = 'Permit stop', defval = true)


// =============================================================================
// CALCULATIONS
// =============================================================================

donch_len_big = 
 donch_string == '50/20' ? 50 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 20 : 
 donch_string == '100/100' ? 100 : 
 na
donch_len_small = 
 donch_string == '50/20' ? 20 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 10 : 
 donch_string == '100/100' ? 100 : 
 na

big_maxclose = ta.highest(close, donch_len_big)
big_minclose = ta.lowest(close, donch_len_big)

small_maxclose = ta.highest(close, donch_len_small)
small_minclose = ta.lowest(close, donch_len_small)

atrValue = ta.atr(atrLen)[1]

tradeWindow  = true

// =============================================================================
// NOTOPEN QTY
// =============================================================================

risk_usd     = (risk_percent / 100) * strategy.equity
atr_currency = (atrValue * syminfo.pointvalue)
notopen_qty  = risk_usd / (stopOffset * atr_currency)

// =============================================================================
// LONG STOP
// =============================================================================

long_stop_price = 0.0
long_stop_price := 
 strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : 
 strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price:
 strategy.position_size > 0 ? long_stop_price[1] : 
 na

// =============================================================================
// SHORT STOP
// =============================================================================

short_stop_price = 0.0
short_stop_price := 
 strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : 
 strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price :
 strategy.position_size < 0 ? short_stop_price[1] : 
 na

// =============================================================================
// PLOT BG VERTICAL COLOR
// =============================================================================

cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
cross_dn =  strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
bg_color = cross_up ? color.green : cross_dn ? color.red : na
bg_color := color.new(bg_color, 70)
bgcolor(bg_color)

// =============================================================================
// PLOT HORIZONTAL LINES
// =============================================================================

s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na
s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na
s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : 
 strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na

plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black")
plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black")

plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow")
plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red")
plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia")

// =============================================================================
// ENTRY ORDERS
// =============================================================================

if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
    strategy.entry("Long", strategy.long, qty=notopen_qty)

if (strategy.position_size >= 0) and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
    strategy.entry("Short", strategy.short, qty=notopen_qty)

// =============================================================================
// EXIT ORDERS
// =============================================================================

if strategy.position_size > 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price)

if strategy.position_size < 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price)

// ==========

if strategy.position_size > 0 and close == small_minclose and not barstate.islast
    strategy.close(id="Long", comment='Donch')

if strategy.position_size < 0 and close == small_maxclose and not barstate.islast
    strategy.close(id="Short", comment='Donch')

// ==========

if close_in_end
    if not tradeWindow
        strategy.close_all(comment='In end')

// =============================================================================
// END
// =============================================================================