Estrategia de seguimiento de tendencias inteligente de ADX

El autor:¿ Qué pasa?, Fecha: 2023-11-28 14:04:00
Las etiquetas:

img

Resumen general

La estrategia de seguimiento de tendencias inteligente de ADX utiliza el índice direccional promedio (ADX) para juzgar la fuerza de las tendencias y capturar tendencias cuando son débiles y seguir tendencias fuertes para obtener ganancias.

Principio de la estrategia

El núcleo de esta estrategia se basa principalmente en el índice direccional promedio (ADX) para juzgar la fuerza de la tendencia actual. ADX calcula el valor promedio del indicador direccional de las fluctuaciones de precios durante un cierto período para representar la fuerza de la tendencia. Cuando el valor de ADX está por debajo del umbral establecido, creemos que el mercado se está consolidando. En este momento, se determina el rango de la caja. Si el precio rompe los carriles superior e inferior de la caja, se genera una señal de negociación.

Específicamente, la estrategia primero calcula el valor de ADX de 14 ciclos. Cuando es inferior a 18, se considera que la tendencia es más débil. Luego calcula el rango de la caja formada por los precios más altos y más bajos de las últimas 20 líneas K. Cuando el precio rompe esta caja, se generan señales de compra y venta. La distancia de stop loss es del 50% del tamaño de la caja, y la distancia de toma de ganancias es del 100% del tamaño de la caja.

Esta estrategia combina el juicio de la fuerza de la tendencia y las señales de avance para capturar las tendencias cuando son más débiles y entrar en una consolidación, evitando las operaciones frecuentes en mercados desordenados.

Ventajas de la estrategia

  1. La combinación del juicio de la fuerza de la tendencia puede evitar el comercio frecuente en mercados desordenados.
  2. El avance de la caja aumenta el filtrado para evitar quedar atrapados en mercados volátiles.
  3. En los mercados de tendencia, se pueden obtener objetivos de ganancias más altos.
  4. Parámetros ADX personalizables, parámetros de caja, coeficientes de stop loss, etc. para adaptarse a las diferentes variedades.

Riesgos de la estrategia

  1. La configuración incorrecta de los parámetros ADX puede hacer que se pierdan las tendencias o se hagan juicios erróneos.
  2. Los rangos de cajas demasiado grandes o pequeños pueden afectar a los resultados.
  3. Los coeficientes de stop loss y take profit inadecuados pueden causar una stop loss insuficiente o una toma de beneficios demasiado temprana.

Los parámetros como ADX, el rango de caja, los coeficientes de stop loss se pueden optimizar para que sea más adecuado para diferentes productos y entornos de mercado.

Direcciones para la optimización de la estrategia

  1. Los parámetros ADX pueden probar los resultados de diferentes ciclos.
  2. Los parámetros de la caja pueden probar diferentes longitudes para determinar los tamaños óptimos del rango.
  3. Ajusta los coeficientes de stop loss y take profit para optimizar las relaciones riesgo-rendimiento.
  4. Prueba los efectos de la negociación unilateral larga/corta solamente.
  5. Añadir otros indicadores para las combinaciones, como los indicadores de volumen.

Resumen de las actividades

La estrategia de seguimiento de tendencias inteligente de ADX es generalmente una estrategia de seguimiento de tendencias relativamente estable. Combina el juicio de la fuerza de la tendencia y las señales de avance del precio para evitar los problemas como perseguir máximos y matar mínimos que son comunes en las estrategias típicas de seguimiento de tendencias. A través de la optimización de parámetros y la estricta gestión del dinero, la estrategia puede obtener ganancias de manera constante.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Developer: Andrew Palladino. 
//Creator: Rob Booker.
//Date: 9/29/2017
//@version=5
//Date: 08/10/2022
//Updated to V5 from V1, default cash settings added and indicators made more easily visible by:
// @ Powerscooter

strategy("Rob Booker - ADX Breakout", shorttitle="ADX Breakout V5", overlay=true, default_qty_type = strategy.cash, default_qty_value = 100000, initial_capital = 100000)

adxSmoothPeriod = input(14, title="ADX Smoothing Period", group = "ADX Settings")
adxPeriod = input(14, title="ADX Period", group = "ADX Settings")
adxLowerLevel = input(18, title="ADX Lower Level", group = "ADX Settings")
boxLookBack = input(20, title="BreakoutBox Lookback Period", group = "BreakoutBox")
profitTargetMultiple = input(1.0, title="Profit Target Box Width Multiple", group = "Take Profit and Stop Loss")
stopLossMultiple = input(0.5, title="Stop Loss Box Width Multiple", group = "Take Profit and Stop Loss")
enableDirection = input(0, title="Both(0), Long(1), Short(-1)", group = "Trade Direction")


// When the ADX drops below threshold limit, then we consider the pair in consolidation. 
// Set Box around highs and lows of the last 20 candles. with upper and lower boundaries. 
// When price breaks outside of box, a trade is taken. (on close or on touch?)
// Stop is placed, default 50%, of the size of the box. So if box is 200 pips, stop is at 100 pips. 
// Profit target is 100% of the size of the box. Default. User can set a profit target of 0.5, 1 full size, 2 or 3. 


dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)

adxHigh(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	plus
	
adxLow(dilen, adxlen) => 
	[plus, minus] = dirmov(dilen)
	minus
	
sig = adx(adxSmoothPeriod, adxPeriod)
//sigHigh = adxHigh(dilen, adxlen)
//sigLow = adxLow(dilen, adxlen)

isADXLow = sig < adxLowerLevel

//boxUpperLevel = ta.highest(high, boxLookBack)[1]
//boxLowerLevel = ta.lowest(low, boxLookBack)[1]

var float boxUpperLevelCarry = 0
var float boxLowerLevelCarry = 0

boxUpperLevel = strategy.position_size == 0 ? ta.highest(high, boxLookBack)[1] : boxUpperLevelCarry
boxUpperLevelCarry := boxUpperLevel
boxLowerLevel = strategy.position_size == 0 ? ta.lowest(low, boxLookBack)[1] : boxLowerLevelCarry
boxLowerLevelCarry := boxLowerLevel

boxWidth = boxUpperLevel - boxLowerLevel

profitTarget = strategy.position_size > 0  ? strategy.position_avg_price + profitTargetMultiple*boxWidth : strategy.position_size < 0 ?  strategy.position_avg_price - profitTargetMultiple*boxWidth : na
stopLoss = strategy.position_size > 0 ? strategy.position_avg_price - stopLossMultiple*boxWidth : strategy.position_size < 0 ? strategy.position_avg_price + stopLossMultiple*boxWidth : na

plot(strategy.position_size == 0 ? boxUpperLevel : na, color=color.white, style = plot.style_linebr)
plot(strategy.position_size == 0 ? boxLowerLevel : na, color=color.white, style = plot.style_linebr)


bgcolor(isADXLow ? color.purple : na, transp=72, title = "ADX limit")
plot(stopLoss, color=color.red, linewidth=2, style = plot.style_linebr, title="StopLossLine")
plot(profitTarget, color=color.blue, linewidth=2, style = plot.style_linebr, title="ProfitTargetLine")

isBuyValid = strategy.position_size == 0 and ta.cross(close, boxUpperLevel) and isADXLow

//Long Entry Condition
strategy.exit("close_long", from_entry="open_long", limit = profitTarget, stop = stopLoss)
if isBuyValid and strategy.opentrades == 0 and (enableDirection == -1 or enableDirection == 0)
    strategy.entry("open_long", strategy.long)

isSellValid = strategy.position_size == 0 and ta.cross(close, boxLowerLevel) and isADXLow

//Short Entry condition
strategy.exit(id="close_short", from_entry="open_short", limit = profitTarget, stop = stopLoss)
if isSellValid and strategy.opentrades == 0 and (enableDirection == 1 or enableDirection == 0)
    strategy.entry("open_short", strategy.short)

Más.