Estrategia de tendencia instantánea de Ehlers

El autor:¿ Qué pasa?, Fecha: 2023-12-20 16:51:05
Las etiquetas:

img

Resumen general

La estrategia de línea de tendencia instantánea de Ehlers fue propuesta por John Ehlers en su libro Análisis cibernético para acciones y futuros. Utiliza indicadores técnicos para identificar tendencias en tiempo real de acciones/futures y posiciones abiertas cuando las tendencias se invierten.

Estrategia lógica

El núcleo de esta estrategia es el cálculo de la línea de tendencia instantánea (IT).

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

donde src es el precio, a es un factor de suavización, por defecto a 0.07. Esta fórmula es un filtro de segundo orden que puede suavizar el precio y generar tendencias.

Otro indicador clave es la línea de retraso, calculada por:

lag = 2.0 * it - nz(it[2])

Cuando el precio cruza por encima de la línea de retraso, indica una ruptura al alza, ir largo.

Además, la estrategia establece órdenes de stop loss para controlar los riesgos.

Análisis de ventajas

Las ventajas de esta estrategia incluyen:

  1. Línea de TI filtra eficazmente el ruido y mejora la calidad de la señal
  2. El filtro de segundo orden proporciona más flexibilidad de ajuste y robustez
  3. La línea de retraso evita cambios innecesarios dentro de las tendencias
  4. Los riesgos de pérdidas de parada incorporados se controlan a niveles predefinidos
  5. Estructura de código limpia, fácil de entender y modificar

Análisis de riesgos

También hay algunos riesgos con esta estrategia:

  1. El ajuste incorrecto de los parámetros de la línea IT/lag puede generar señales falsas.
  2. Configuración incorrecta de pérdida de parada podría dar lugar a una parada prematura o pérdida de gran tamaño
  3. La alta frecuencia de negociación conduce a comisiones acumuladas
  4. Los tiempos de retención prolongados aumentan el riesgo de aumento de pérdidas

Estos riesgos pueden mitigarse mediante:

  1. Aplicación del aprendizaje automático para la optimización de parámetros
  2. Establecimiento de niveles de pérdida de parada adaptativos
  3. Reducción del tamaño de las posiciones para reducir las frecuencias de negociación
  4. Las pérdidas de detención de periodos de retención

Direcciones de optimización

Esta estrategia puede optimizarse aún más en los siguientes aspectos:

  1. Impactos de ensayo de diferentes parámetros del filtro para determinar el óptimo
  2. Intenta combinar otros indicadores para filtrar las señales
  3. Mejorar la lógica de entrada para aumentar el tamaño durante las etapas de aceleración de la tendencia
  4. Configurar un stop loss adaptativo basado en la volatilidad del mercado
  5. Realizar análisis de series temporales sobre sesiones y frecuencias de negociación

Conclusión

En general, la estrategia Ehlers Instantaneous Trendline utiliza indicadores técnicos para identificar tendencias en tiempo real en acciones/futures y posiciones abiertas cuando las tendencias se invierten. Tiene las ventajas de un filtro de ruido efectivo, alta sintonizabilidad de parámetros, lógica clara de generación de señal y control de riesgos incorporado. Con una optimización adicional en la selección de parámetros, filtro de señal, dimensionamiento de posición y sintonización de stop loss, esta estrategia puede lograr un rendimiento aún mejor. La estructura de código clara también hace que sea fácil de entender y modificar.


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Más.