Estrategia inteligente de seguimiento de tendencias de ADX


Fecha de creación: 2023-11-28 14:04:00 Última modificación: 2023-11-28 14:04:00
Copiar: 0 Número de Visitas: 887
1
Seguir
1621
Seguidores

Estrategia inteligente de seguimiento de tendencias de ADX

Descripción general

La estrategia inteligente de seguimiento de tendencias de ADX utiliza el índice de tendencias promedio (ADX) para determinar la fuerza de la tendencia, capturar la tendencia cuando la tendencia es débil y obtener ganancias de seguimiento en una tendencia fuerte. La estrategia determina la fuerza de la tendencia y, al mismo tiempo, combina la ruptura de precios para generar una señal de negociación.

Principio de estrategia

La estrategia se basa principalmente en el índice de tendencia promedio (ADX) para juzgar la fuerza de la tendencia actual. El ADX representa la fuerza de la tendencia calculando el promedio del indicador direccional de la fluctuación de los precios en un período determinado. Cuando el ADX está por debajo del umbral establecido, consideramos que la situación se está arreglando, y en ese momento se determina el rango de cuadros.

Concretamente, la estrategia primero calcula el valor de ADX de 14 ciclos, considerando que la tendencia es débil cuando está por debajo de 18. Luego calcula el rango de cuadrados formados por los precios más altos y más bajos de las últimas 20 líneas K. Cuando el precio rompe el cuadro, genera una señal de compra y venta.

La estrategia combina al mismo tiempo el juicio de la fuerza de la tendencia y la señal de ruptura, para poder capturar en caso de que la tendencia sea débil y entrar en ordenamiento, evitando el comercio frecuente en situaciones desordenadas. En cambio, cuando se produce una tendencia fuerte, el alcance de la parada es mayor y se puede obtener más ganancias.

Ventajas estratégicas

  1. La combinación de la fuerza de la tendencia con el juicio, evita el comercio frecuente en situaciones desordenadas.
  2. La brecha de cuadro añade un cierto filtro para evitar ser atrapado en situaciones de temblor.
  3. En el caso de las tendencias, se obtiene un mayor margen de maniobra.
  4. Se pueden personalizar los parámetros ADX, parámetros de cuadros, parámetros de deterioro, etc., para adaptarse a diferentes variedades.

Riesgo estratégico

  1. La configuración incorrecta de los parámetros de ADX puede perder tendencias o errores de juicio.
  2. El tamaño de los cuadros puede afectar el resultado.
  3. Un coeficiente de frenado incorrecto puede causar una frenada demasiado pequeña o demasiado temprana.

Se puede optimizar mediante la adaptación de los parámetros ADX, parámetros de cuadrados, parámetros de stop loss, etc., para que sean más adecuados para diferentes variedades y entornos comerciales. Al mismo tiempo, es importante una gestión estricta de los fondos, controlar el porcentaje de pérdidas individuales y evitar grandes pérdidas individuales.

Dirección de optimización de la estrategia

  1. Los parámetros ADX pueden probar diferentes efectos de ciclo.
  2. Los parámetros del cuadro permiten probar diferentes longitudes para determinar el tamaño óptimo del rango.
  3. El coeficiente de detención de pérdidas se puede ajustar para optimizar la relación riesgo-beneficio.
  4. Se puede probar el efecto de una transacción unilateral de solo hacer más, solo hacer nada.
  5. Se puede combinar con otros indicadores, como el indicador de aumento de la potencia.

Resumir

La estrategia de seguimiento de tendencias inteligente de ADX es una estrategia de tendencias más estable en general. Combina al mismo tiempo el juicio de la fuerza de la tendencia y la señal de ruptura del precio, evitando en cierta medida el problema de perseguir los altos y bajos de las estrategias de seguimiento de tendencias comunes.

Código Fuente de la Estrategia
/*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)