Estrategia de seguimiento de tendencias de Donichan


Fecha de creación: 2024-01-31 16:53:31 Última modificación: 2024-01-31 16:53:31
Copiar: 0 Número de Visitas: 647
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias de Donichan

Descripción general

La estrategia de seguimiento de tendencias de la caja negra es una estrategia de seguimiento de tendencias desarrollada según el principio del canal de la caja negra descrito en el artículo Black Box Trend Following Lifting the Veil . La estrategia utiliza el canal de la caja negra para determinar la tendencia de los precios y establecer posiciones de venta o ventaja en función de la innovación de precios.

Principio de estrategia

La estrategia se basa en la dirección de la tendencia de los indicadores de los canales de Dony. Los canales de Dony se componen de un canal de ciclo más largo y un canal de ciclo más corto.

Concretamente, la longitud del canal de ciclo más largo es de 50 días o 20 días, y la longitud del canal de ciclo más corto es de 50 días, 20 días o 10 días. Si el precio es igual al precio más alto en 50 días, se abre una oferta; si el precio es igual al precio más bajo en 50 días, se abre una oferta en blanco. Si el precio es igual al precio más bajo en 20 días o 10 días, se borra una oferta; si el precio es igual al precio más alto en 20 días o 10 días, se borra una oferta en blanco.

De esta manera, a través de una combinación de dos canales de dónica de diferentes períodos, se puede determinar la dirección de la posición al comienzo de la tendencia y detener la pérdida a tiempo al final de la tendencia.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. La capacidad de captura de tendencias es alta. Se puede seguir la tendencia de manera efectiva al romper el canal de la concha y determinar el comienzo y el final de la tendencia.

  2. El control de riesgo está en su lugar. El uso de stop loss móvil para controlar las pérdidas individuales.

  3. Ajuste de parámetros flexible. Se puede elegir libremente la combinación de ciclos del canal para adaptarse a diferentes variedades y entornos de mercado.

  4. Una lógica de transacción simple y clara. Fácil de entender e implementar.

Análisis de riesgos

La estrategia también tiene los siguientes riesgos:

  1. No se puede adaptar a un mercado en turbulencia. Cuando la tendencia no es clara, se producen varios ajustes de menor magnitud, con pérdidas de parada.

  2. Riesgo de fracaso de la ruptura. El precio puede volver a llamar una vez que haya roto el canal, lo que provoca un alto.

  3. El riesgo de selección de ciclo. Si el ciclo de la vía se establece incorrectamente, se producirá trading in noise.

  4. Riesgo de caída del Sharpe Ratio. Si aumenta la posición sin ajustar el stop loss, se enfrenta al riesgo de caída del Sharpe Ratio.

Resolución de las mismas:

  1. Optimización de parámetros para seleccionar la combinación de ciclos de acceso adecuada.
  2. Ajuste adecuado de la posición y el stop loss para controlar el riesgo.
  3. Utiliza esta estrategia en variedades y mercados con una tendencia evidente.

Dirección de optimización

La estrategia puede ser optimizada en las siguientes direcciones:

  1. Aumentar las condiciones de filtración para evitar whipsaws. Indicadores como la capacidad de unión para determinar la verdadera brecha.

  2. Optimización de la combinación y control de posiciones en el ciclo de la vía, mejora de la relación de pérdidas y ganancias. Se puede introducir un mecanismo de amortización de pérdidas.

  3. El objetivo es encontrar la mejor combinación de parámetros para optimizar el punto de ruptura.

  4. Aumentar los algoritmos de aprendizaje automático para optimizar y ajustar dinámicamente los parámetros.

Resumir

La estrategia de seguimiento de tendencias de Donizetti es una estrategia de seguimiento de tendencias muy práctica que se ajusta a los parámetros de la estrategia de forma flexible y fácil de implementar. Pero también se debe tener en cuenta la falta de rentabilidad en situaciones de crisis y el riesgo que conlleva la selección de parámetros.

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,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=2, slippage=2)

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

donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50')
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 = false)

// =============================================================================
// 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 VERTICAL COLOR BAR
// =============================================================================

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 DONCHIAN 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='Close in end')

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