Estrategia de seguimiento de tendencias de impulso

El autor:¿ Qué pasa?, Fecha: 2024-03-11 10:53:50
Las etiquetas:

img

Resumen general

Esta estrategia combina el indicador Aroon y el Histograma de Fuerza Absoluta (ASH) para identificar tendencias de mercado y oportunidades comerciales potenciales.

Estrategia lógica

La estrategia utiliza dos conjuntos de parámetros para el indicador Aroon:

  • Posiciones largas: los períodos de referencia son 56 (superior) y 20 (inferior)
  • Posiciones cortas: los períodos de referencia son 17 (superior) y 55 (inferior)

El ASH se calcula con una longitud de 9 barras utilizando el precio de cierre como fuente de datos.

La estrategia incluye normas específicas de entrada y salida:

  1. Entrada larga: Se inicia una posición larga cuando el indicador Aroon cruza el umbral inferior, lo que indica una tendencia alcista potencial.
  2. Salida larga: Una posición larga se cierra cuando el Aroon cruza de nuevo por debajo del umbral inferior.
  3. Entrada corta: Se inicia una posición corta cuando el Aroon cruza por debajo del umbral superior, lo que indica una tendencia a la baja potencial.
  4. Salida corta: Una posición corta se cierra cuando el Aroon cruza el umbral superior.

Análisis de ventajas

La principal ventaja de esta estrategia es la sinergia de la combinación de los dos indicadores. Aroon mide eficazmente la dirección y la fuerza de la tendencia. ASH proporciona información adicional sobre el impulso para ayudar con las señales de entrada y salida de tiempo.

El uso de dos parámetros de Aroon permite flexibilidad en la adaptación a las condiciones cambiantes del mercado.

Análisis de riesgos

Las principales limitaciones provienen de los propios indicadores. Aroon lucha durante los mercados de rango y puede generar señales falsas. ASH también es propenso a reacciones exageradas a corto plazo.

Los períodos largos/cortos de Aroon y la longitud de ASH necesitarían optimización para encontrar las combinaciones ideales.

Direcciones de mejora

Se podrían añadir filtros adicionales, como las rupturas de precios o el aumento de los volúmenes, para evitar señales falsas durante condiciones inestables.

Se podrían probar diferentes combinaciones de parámetros y ponderaciones para encontrar ajustes óptimos.

Conclusión

La estrategia combina efectivamente las fortalezas de Aroon y ASH para la doble confirmación de tendencias y puntos de inflexión. Pero los parámetros y las limitaciones de los indicadores aún necesitan ser refinados.


/*backtest
start: 2023-03-05 00:00:00
end: 2024-03-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © IkkeOmar

//@version=5
strategy("Aroon and ASH strategy - ETHERIUM [IkkeOmar]", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1, commission_value=0, slippage=2)


// AROON SETTINGS ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

// Inputs for longs 

length_upper_long = input.int(56, minval=15)
length_lower_long = input.int(20, minval=5)

// Inputs for shorts
//Aroon Short Side Inputs
length_upper_short = input.int(17, minval=10)
length_lower_short = input.int(55)

// ABSOLUTE STRENGTH HISTOGRAM SETTINGS ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
length = input(title='Length', defval=9)
src = input(title='Source', defval=close)




// CALCULATIONS: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Aroon
upper_long = 100 * (ta.highestbars(high, length_upper_long + 1) + length_upper_long) / length_upper_long
lower_long = 100 * (ta.lowestbars(low, length_lower_long + 1) + length_lower_long) / length_lower_long

upper_short = 100 * (ta.highestbars(high, length_upper_short + 1) + length_upper_short) / length_upper_short
lower_short = 100 * (ta.lowestbars(low, length_lower_short + 1) + length_lower_short) / length_lower_short

// Ahrens Moving Average
ahma = 0.0
ahma := nz(ahma[1]) + (src - (nz(ahma[1]) + nz(ahma[length])) / 2) / length



// CONDITIONS: ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


// Options that configure the backtest start date
startDate = input(title='Start Date', defval=timestamp('01 Jan 2018 00:00'))


// Option to select trade directions
tradeDirection = input.string(title='Trade Direction', options=['Long', 'Short', 'Both'], defval='Long')

// Translate input into trading conditions
longOK = tradeDirection == 'Long' or tradeDirection == 'Both'
shortOK = tradeDirection == 'Short' or tradeDirection == 'Both'


// Check if the close time of the current bar falls inside the date range
inDateRange = true

longCondition = ta.crossover(upper_long, lower_long) and inDateRange and lower_long >= 5 and longOK
longCloseCondition = ta.crossunder(upper_long, lower_long) and inDateRange

shortCondition = ta.crossunder(upper_short, lower_short) and inDateRange and shortOK
shortCloseCondition = ta.crossover(upper_short, lower_short) and inDateRange

// Start off with the initial states for the longs and shorts
var in_short_trade = false
var in_long_trade = false

var long_signal = false
var short_signal = false

if longCondition
    long_signal := true
if longCloseCondition
    long_signal := false
    
if shortCondition
    short_signal := true
if shortCloseCondition
    short_signal := false

// While no trades active and short condition is met, OPEN short
if true and in_short_trade == false and in_long_trade == false and shortCondition
    strategy.entry("short", strategy.short, when = shortCondition)
    in_short_trade := true
    in_long_trade := false

// While no trades and long condition is met, OPEN LONG
if true and in_short_trade == false and in_long_trade == false and longCondition
    strategy.entry("long", strategy.long, when = longCondition)
    in_long_trade := true
    in_short_trade := false

    
// WHILE short trade and long condition is met, CLOSE SHORT and OPEN LONG
if true and in_short_trade == true and in_long_trade == false and longCondition
    // strategy.close("short", when = longCondition)
    strategy.entry("long", strategy.long, when = longCondition)
    in_short_trade := false
    in_long_trade := true
    
    
// WHILE long trade and short condition is met, CLOSE LONG and OPEN SHORT
if true and in_short_trade == false and in_long_trade == true and shortCondition
    // strategy.close("long", when = shortCondition)
    strategy.entry("short", strategy.short, when = shortCondition)
    in_short_trade := true
    in_long_trade := false

// WHILE long trade and exit long condition is met, CLOSE LONG
// if short signal is active, OPEN SHORT
if true and in_short_trade == false and in_long_trade == true and longCloseCondition
    if short_signal
        strategy.entry("short", strategy.short, when = short_signal)
        in_long_trade := false
        in_short_trade := true
    else
        strategy.close("long", when = longCloseCondition)
        in_long_trade := false
        in_short_trade := false

// if in short trade only and exit short condition is met, close the short
// if long signal still active, OPEN LONG
if true and in_short_trade == true and in_long_trade == false and shortCloseCondition
    if long_signal
        strategy.entry("long", strategy.long, when = long_signal)
        in_short_trade := false
        in_long_trade := true
    else
        strategy.close("short", when = shortCloseCondition)
        in_short_trade := false
        in_long_trade := false






Más.