Seguimiento de tendencias y estrategia de negociación a corto plazo basada en el indicador ADX

El autor:¿ Qué pasa?, Fecha: 2024-01-22 17:10:55
Las etiquetas:

img

Resumen general

Esta estrategia combina la súper tendencia, los puntos de giro y el rango verdadero promedio (ATR) para formar una línea de stop loss dinámica, y el indicador de índice de movimiento direccional promedio (ADX) para juzgar y rastrear tendencias.

Principio

El Super Trend combinado con Pivot Points y ATR stop loss juzga la dirección del precio rompiendo la línea de stop loss dinámica para determinar la dirección de apertura. Al mismo tiempo, el indicador ADX juzga la fuerza de la tendencia y solo emite señales comerciales cuando la tendencia es lo suficientemente fuerte.

Específicamente, los Puntos Pivot primero obtienen el último soporte y resistencia, y luego forman un precio medio dinámico con la media aritmética de los dos días anteriores. Luego, ATR se calcula y multiplica por el factor ATR, y luego se suma o resta del precio medio dinámico para obtener los rieles superior e inferior. Cuando el precio rompe el rieles superior, es alcista. Cuando rompe el rieles inferior, es bajista. El indicador ADX juzga 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 ajustará dinámicamente de acuerdo con el último precio y el valor ATR, lo que puede rastrear la tendencia muy bien.

Análisis de ventajas

La estrategia tiene las siguientes ventajas:

  1. Utilice el indicador Super Trend para rastrear la dirección de la tendencia para evitar el bloqueo de las ganancias por los mercados oscilantes.

  2. Con la ayuda del indicador ADX para juzgar la fuerza de la tendencia, evite errores en las operaciones durante la consolidación.

  3. La línea de stop loss se ajusta dinámicamente para maximizar las ganancias de bloqueo.

  4. Combine el RSI para evitar la sobrecompra y la sobreventa.

  5. En general, la configuración del parámetro de la estrategia es razonable. La selección de dframe considera la continuidad. La configuración de take profit y stop loss también es buena.

Análisis de riesgos

La estrategia también tiene algunos riesgos:

  1. Los indicadores Super Trend y MA pueden emitir señales contradictorias.

  2. El indicador ADX está ajustado a 14 ciclos, lo que no es lo suficientemente sensible a eventos repentinos.

  3. El parámetro RSI está configurado como predeterminado, lo que puede no evitar completamente la sobrecompra y la sobreventa.

  4. No se ha considerado el impacto de eventos repentinos, como las malas/buenas noticias.

Soluciones correspondientes:

  1. Ajuste el ciclo de MA para que coincida con el indicador Super Trend.

  2. Trate de acortar el ciclo de ADX para aumentar la sensibilidad a eventos repentinos.

  3. Optimice los parámetros del RSI para encontrar valores óptimos.

  4. Añadir módulo de filtro de noticias para evitar los principales comunicados de prensa.

Optimización

La estrategia también puede optimizarse en los siguientes aspectos:

  1. Agregue el modelo de aprendizaje automático para juzgar la tendencia, haciendo las decisiones comerciales más inteligentes.

  2. Trate de introducir indicadores emocionales alternativos en lugar de ADX para juzgar la fuerza de la tendencia.

  3. Aumentar el módulo de stop loss adaptativo para hacer que el stop loss sea más dinámico y preciso.

  4. Extraer más características con tecnología de aprendizaje profundo para optimizar la estrategia general.

  5. Utilice lenguajes avanzados como Python para el desarrollo de estrategias para aumentar la escalabilidad de estrategias.

Resumen de las actividades

En general, esta estrategia es muy práctica. El núcleo es rastrear la dirección de la tendencia y participar cuando la tendencia es lo suficientemente fuerte. La configuración de stop loss y take profit también está muy en su lugar para maximizar el bloqueo de ganancias evitando pérdidas. Por supuesto, todavía hay mucho espacio para la optimización.


/*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")





Más.