Estrategia de trading a corto plazo basada en el seguimiento de tendencias y el indicador ADX


Fecha de creación: 2024-01-22 17:10:55 Última modificación: 2024-01-22 17:10:55
Copiar: 0 Número de Visitas: 687
1
Seguir
1617
Seguidores

Estrategia de trading a corto plazo basada en el seguimiento de tendencias y el indicador ADX

Descripción general

La estrategia combina las líneas de parada dinámica que se forman con el indicador de tendencia súper, los puntos de pivot y el rango real promedio, así como el indicador de movimiento direccional promedio, para juzgar y rastrear la tendencia. La estrategia es adecuada para el comercio de líneas cortas, puede capturar la continuación de la tendencia después de la recopilación intermedia, y el control de retroceso también funciona bien.

Principio de estrategia

El indicador de hipertrend combina los puntos centrales y los paros ATR para determinar la dirección en la que el precio rompe la línea de paros dinámicos para decidir la dirección de la posición. Al mismo tiempo, el indicador ADX determina la fuerza de la tendencia y emite una señal de negociación solo cuando la tendencia es lo suficientemente fuerte.

Concretamente, el eje central recibe la resistencia de soporte más reciente, y luego forma un promedio dinámico con el promedio aritmético de los dos días anteriores. Luego calcula el ATR y multiplica por el factor ATR, y luego suma y reduce con el promedio dinámico para obtener subidas y bajadas. El indicador ADX determina la fuerza de la tendencia y solo participa en el comercio cuando la tendencia es lo suficientemente fuerte.

La línea de stop loss se ajusta dinámicamente en función de los últimos precios y valores de ATR, lo que permite un buen seguimiento de la tendencia.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. Utiliza un indicador ultratrend para seguir la dirección de la tendencia y evitar que los mercados convulsivos bloqueen los beneficios.

  2. El indicador ADX ayuda a determinar la fuerza de la tendencia y evita errores en el balance.

  3. La línea de parada se ajusta dinámicamente para bloquear el máximo de ganancias.

  4. En combinación con el RSI se evita la compraventa.

  5. En general, la configuración de los parámetros de la estrategia es razonable, se considera la continuidad en la selección de dframe, y la configuración de stop loss también es buena.

Análisis de riesgos

La estrategia también tiene sus riesgos:

  1. El indicador de tendencia súper y el indicador de MA pueden emitir señales de conflicto.

  2. El indicador ADX está configurado para 14 ciclos, con una insuficiente sensibilidad a los eventos de emergencia.

  3. Los parámetros del RSI se establecen como valores predeterminados, y es posible que no se pueda evitar la compraventa.

  4. No se tiene en cuenta el impacto de eventos inesperados, como grandes brechas de ganancias/noticias positivas.

Resolución de las mismas:

  1. Ajuste el ciclo de la MA para que coincida con el indicador de tendencia extrema.

  2. El objetivo es reducir los ciclos de ADX y aumentar la sensibilidad a las emergencias.

  3. Optimización de los parámetros RSI para encontrar el valor óptimo.

  4. El blog también incluye un módulo de filtración de noticias para evitar publicaciones importantes.

Dirección de optimización

La estrategia también puede ser optimizada en los siguientes aspectos:

  1. El uso de modelos de aprendizaje automático para el análisis de tendencias y la toma de decisiones comerciales más inteligentes.

  2. Intentar introducir indicadores ADX alternativos como el índice de emoción para evaluar la fuerza de las tendencias.

  3. Se ha añadido un módulo de detención de pérdidas adaptativo para que la detención sea más dinámica y precisa.

  4. La tecnología de aprendizaje profundo permite extraer más características y optimizar la estrategia global.

  5. Utiliza lenguajes avanzados como Python para desarrollar estrategias y aumentar la extensibilidad de las mismas.

Resumir

Esta estrategia es muy práctica en general, y su núcleo es seguir la dirección de la tendencia y participar cuando la tendencia es lo suficientemente fuerte. La configuración de stop loss y stop loss también está en su lugar para bloquear al máximo las ganancias y evitar la expansión de las pérdidas.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Bendre ADX STrend", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 21, title = "ATR Period")

StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window()  => true

var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)

float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph

if lastpp > 0
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))

var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)

//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)

//
// DMI - Direction Movement Index
// 
[diplus1, diminus1, adx] = ta.dmi(14, 14)

// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 


if (buy and vrsi > overBought and adx > 19)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long, when = window())
    // strategy.close("Sell", "close Sell")

if (sell) and (strategy.position_size > 0)
    // strategy.entry("Sell", strategy.short)
    strategy.close("Buy", "Close Buy")

if(sell and vrsi < overSold and adx > 25)
    strategy.entry("Sell", strategy.short, when = window())

if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
    strategy.close("Sell", "close Sell")

// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
//     strategy.entry("Sell", strategy.short, when = window())

// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0  and (buy))
//     strategy.close("Sell", "close Sell")