
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.
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.
La estrategia tiene las siguientes ventajas:
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.
El control de riesgo está en su lugar. El uso de stop loss móvil para controlar las pérdidas individuales.
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.
Una lógica de transacción simple y clara. Fácil de entender e implementar.
La estrategia también tiene los siguientes riesgos:
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.
Riesgo de fracaso de la ruptura. El precio puede volver a llamar una vez que haya roto el canal, lo que provoca un alto.
El riesgo de selección de ciclo. Si el ciclo de la vía se establece incorrectamente, se producirá trading in noise.
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:
La estrategia puede ser optimizada en las siguientes direcciones:
Aumentar las condiciones de filtración para evitar whipsaws. Indicadores como la capacidad de unión para determinar la verdadera brecha.
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.
El objetivo es encontrar la mejor combinación de parámetros para optimizar el punto de ruptura.
Aumentar los algoritmos de aprendizaje automático para optimizar y ajustar dinámicamente los parámetros.
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.
/*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
// =============================================================================