Tendencia del canal de Donchian siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2024-01-22 12:30:05
Las etiquetas:

img

Resumen general

La estrategia de seguimiento de tendencias del canal de Donchian es una estrategia de seguimiento de tendencias basada en el indicador del canal de Donchian.

La idea principal de esta estrategia es utilizar un canal de Donchian de período más largo para determinar la dirección de la tendencia principal y un canal de Donchian de período más corto como la señal para la entrada y el stop loss.

Estrategia lógica

  1. Calcular el precio de cierre más alto y el precio de cierre más bajo durante un largo período (por ejemplo, 50 días) para construir el canal de Donchian. Una ruptura por encima de la banda superior indica una tendencia alcista mientras que una ruptura por debajo de la banda inferior indica una tendencia bajista. Esto determina la dirección de la tendencia principal.

  2. Cuando el precio rompe el canal de período largo, si el precio de cierre también rompe el canal de período corto, tome una posición larga/corta en consecuencia.

  3. Cuando se mantiene una posición larga, si el precio cae por debajo de la banda inferior de corto período, se detiene con pérdida.

  4. El stop loss se establece en N veces ATR. Esto se ajusta automáticamente en función de la volatilidad del mercado, lo que reduce la probabilidad de que se produzca un stop loss.

  5. Hay una opción para cerrar posiciones antes de que termine la sesión de negociación o mantener posiciones hasta que se alcance el stop loss.

La estrategia tiene en cuenta tanto la identificación de tendencias como el stop loss de ganancias. Puede capturar las tendencias de precios mientras controla los riesgos. Es adecuado para el comercio a medio y largo plazo.

Análisis de ventajas

  1. Identifica eficazmente las tendencias a medio y largo plazo sin ser interferido por ruidos de mercado a corto plazo.

  2. Mecanismo automático de limitación de pérdidas por pérdida de operaciones.

  3. El sistema ATR permite ajustar la distancia de parada en función de la volatilidad del mercado, reduciendo así la probabilidad de que se produzca una parada de pérdida.

  4. Cierre automático de posiciones cuando la negociación no permita gestionar los riesgos.

  5. Una lógica estratégica simple y clara que es fácil de entender.

Análisis de riesgos

  1. En los mercados sin tendencias, la estrategia puede generar más operaciones, aumentando los costos de negociación y las posibilidades de pérdida.

  2. A pesar de tener un mecanismo de stop loss, las brechas de precios en condiciones volátiles pueden penetrar el punto de stop loss causando directamente pérdidas enormes.

  3. El cálculo del ATR se basa únicamente en datos históricos y no puede predecir con precisión los movimientos futuros de los precios y la volatilidad.

  4. Las órdenes de stop loss no siempre se pueden cumplir en el comercio en vivo, sino que pueden saltarse en condiciones de volatilidad extrema que causan pérdidas.

Direcciones de optimización

  1. Ajustar los parámetros del canal de Donchian para optimizar el rendimiento de identificación de tendencias.

  2. Incorporar otros indicadores como MACD, KDJ para confirmar las señales comerciales y mejorar la estabilidad de la estrategia.

  3. Agregue el stop loss para mover el punto de stop loss junto con el precio, limitando aún más las pérdidas.

  4. Probar el impacto de los diferentes períodos de retención para obtener resultados generales óptimos.

  5. Considere ajustar dinámicamente el tamaño de la posición, ampliando las posiciones en condiciones de tendencia.

Resumen de las actividades

La estrategia de seguimiento de tendencias del canal Donchian integra la identificación de tendencias y el control de riesgos. Su objetivo es generar rendimientos excedentes mediante la identificación de tendencias mientras se controlan los riesgos de cola con mecanismos de stop loss. Esta estrategia es adecuada para identificar y capturar tendencias de precios a mediano y largo plazo. Con la optimización de parámetros y las mejoras del mecanismo, puede lograr resultados positivos constantes.


/*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
// =============================================================================

Más.