La estrategia de línea de tendencia instantánea


Fecha de creación: 2023-12-20 16:51:05 Última modificación: 2023-12-20 16:51:05
Copiar: 0 Número de Visitas: 938
1
Seguir
1621
Seguidores

La estrategia de línea de tendencia instantánea

Descripción general

La estrategia de línea de tendencia instantánea de Ehlers fue propuesta por John Ehlers en su libro de análisis de control de acciones y futuros. La estrategia utiliza indicadores técnicos para identificar la tendencia instantánea de una acción o un futuro y abrir posiciones cuando la tendencia se invierte.

Principio de estrategia

El núcleo de la estrategia es calcular la línea de tendencia instantánea. La fórmula de cálculo de la línea de TI es la siguiente:

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 representa el precio y a es un factor de nivelación con un valor predeterminado de 0.07. La fórmula es un filtro de segundo nivel que puede nivelación de precios y generar tendencias.

El otro indicador clave es la línea de retraso (lag), cuya fórmula es:

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

La línea retrasa un ciclo de la línea IT. Cuando el precio sube por la línea retrasada, representa una reversión de la tendencia, haciendo más; cuando el precio baja por la línea retrasada, representa una reversión de la tendencia, haciendo vacío.

Además, la estrategia también establece un seguro de pérdidas para controlar el riesgo.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. Utiliza tendencias de identificación de líneas de TI para filtrar el ruido del mercado y mejorar la calidad de la señal
  2. Filtrador de segundo grado, optimizado para parámetros, con gran espacio y alta ajustabilidad
  3. La combinación de la línea de retraso genera señales de negociación para evitar la apertura repetida de posiciones cerradas en la tendencia
  4. Configuración de un solo control de riesgo de stop loss, con la posibilidad de predefinir el porcentaje de stop loss
  5. La estructura del código es clara, fácil de entender y modificar

Análisis de riesgos

La estrategia también tiene sus riesgos:

  1. La configuración incorrecta de los parámetros de la línea de TI y la línea de retraso puede generar una señal errónea
  2. La configuración incorrecta del punto de parada puede detenerse prematuramente o demasiado
  3. La frecuencia de las transacciones puede ser más alta, los costos de las transacciones afectan a las ganancias
  4. El exceso de tiempo de tenencia de posiciones centralizadas puede afectar a la rentabilidad

Estos riesgos pueden ser reducidos por:

  1. Parámetros de optimización de algoritmos de aprendizaje automático
  2. Ajuste el punto de parada de adaptación
  3. Ajuste adecuado de la cantidad de posiciones abiertas para reducir la frecuencia de las transacciones
  4. Establecimiento de pérdidas por período de tenencia

Dirección de optimización

La estrategia puede ser optimizada en las siguientes direcciones:

  1. Prueba de la influencia de los diferentes parámetros de filtro en los resultados para encontrar el parámetro óptimo
  2. Trata de filtrar las señales de comercio en combinación con otros indicadores para mejorar la calidad de la señal
  3. Optimización de la lógica de apertura de posiciones, aumentando las posiciones durante la aceleración de la tendencia
  4. Establecer una estrategia de stop loss adaptativa y ajustar el stop loss según la volatilidad del mercado
  5. Realizar análisis de secuencias de tiempo para determinar el impacto de la hora y el ciclo de las transacciones en los resultados

en conclusión

En general, la estrategia de línea de tendencia instantánea de Ells utiliza indicadores técnicos para identificar la tendencia en tiempo real de las acciones/futuros y abrir posiciones cuando la tendencia se invierte. Tiene ventajas como un filtro de ruido eficaz, alta ajustabilidad de parámetros, una lógica de generación de señales clara y un control de riesgo incorporado.

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