Estrategia de seguimiento de tendencias multitemporales basada en supertendencias

El autor:¿ Qué pasa?, fecha: 2024-02-21 11:05:17
Las etiquetas:

img

Resumen general

La idea central de esta estrategia es combinar múltiples marcos de tiempo para identificar las tendencias del mercado, utilizando el indicador Supertrend de marcos de tiempo más altos como filtro y generando señales de compra y venta de marcos de tiempo más bajos.

Estrategia lógica

La estrategia recupera los valores del indicador Supertrend de un marco de tiempo superior (por defecto 4x del marco de tiempo actual) llamando a la función de seguridad. El indicador Supertrend consta de dos líneas: la línea Supertrend y la línea de tendencia. La línea Supertrend por encima de la línea de tendencia es una señal alcista, mientras que por debajo es una señal bajista.

La dirección del indicador de Supertrend desde el marco de tiempo superior sirve como condición de filtro. Las señales de negociación solo se generan cuando las direcciones del Supertrend desde ambos marcos de tiempo se alinean. Eso significa que las señales solo se activan cuando ambos marcos de tiempo dan señales en la misma dirección.

Esto evita la interferencia del ruido del mercado en plazos más cortos y mejora la fiabilidad de la señal.

Ventajas

  • Filtra el ruido de los marcos de tiempo más bajos utilizando información sobre la estructura del mercado de los marcos más altos
  • Las señales más fiables resultantes de la combinación de análisis de múltiples marcos de tiempo
  • Parámetros de Supertrend personalizables para la optimización de la estrategia
  • Configuración integrada del intervalo de fechas para limitar el período de prueba posterior

Análisis de riesgos

  • Las señales de retraso de un marco de tiempo más largo pueden perder oportunidades a corto plazo
  • Inexactitudes en los juicios sobre la estructura del mercado en plazos más largos
  • Potenciales señales erróneas de la propia Supertrend
  • Las restricciones de la fecha de los ensayos posteriores pueden omitir datos importantes y afectar a la exactitud de los resultados

Soluciones:

  • Ajuste fino de las configuraciones de tiempo más alto para reducir el retraso de la señal
  • Añadir otros indicadores para confirmar juicios de plazos más largos
  • Optimizar los parámetros de Supertrend para mejorar la calidad de la señal
  • Extender progresivamente el período de tiempo de prueba posterior para probar la robustez

Direcciones de optimización

Esta estrategia puede mejorarse en varios ámbitos:

  1. Optimizar los parámetros de Supertrend para obtener la mejor combinación de parámetros
  2. Añadir otros indicadores para crear modelos multifactorial
  3. Prueba diferentes combinaciones de marcos de tiempo altos y bajos
  4. Incorporar mecanismos de stop loss para controlar los riesgos
  5. Utilice el aprendizaje automático para ajustar dinámicamente los parámetros

A través de la optimización de parámetros, la combinación de indicadores, la mejora de los paros de pérdida y la introducción de aprendizaje automático, se puede lograr una mejora significativa del rendimiento para esta estrategia de seguimiento de tendencias de marcos de tiempo múltiples.

Conclusión

Esta estrategia aprovecha hábilmente juicios de tendencia de marcos de tiempo más altos para guiar la ejecución de la negociación en marcos de tiempo más bajos. Tal diseño de marcos de tiempo múltiples puede filtrar eficazmente el ruido del mercado e identificar direcciones de tendencia más claras. Los ajustes de fecha incorporados también hacen que el backtesting sea más flexible. En general, esta es una estrategia de seguimiento de tendencias de marcos de tiempo múltiples bien diseñada que merece más investigación y aplicación.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Higher TF - Repainting", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

HTFMultiplier = input(4, minval=1, step=1)

SupertrendMult = input(1)
SupertrendPd = input(4, minval=4, step=4)

backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30)
backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"])

repaintOption = input(title="Repaint", defval="Yes", options=["Yes", "No - set lookahead false", "No - do not use security"])

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_getBackTestTimeFrom(backtestFrom, backtestBars)=>
    byDate = backtestFrom == "days"
    byMonth = backtestFrom == "months"
    byYear = backtestFrom == "years"
    
    date = dayofmonth(timenow)
    mth = month(timenow)
    yr = year(timenow)
    
    leapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,29)
    nonleapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,28)
    
    restMonths = array.new_int(10,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,30)
    array.set(leapYearDaysInMonth,2,31)
    array.set(leapYearDaysInMonth,3,30)
    array.set(leapYearDaysInMonth,4,31)
    array.set(leapYearDaysInMonth,5,31)
    array.set(leapYearDaysInMonth,6,30)
    array.set(leapYearDaysInMonth,7,31)
    array.set(leapYearDaysInMonth,8,30)
    array.set(leapYearDaysInMonth,9,31)
    
    array.concat(leapYearDaysInMonth,restMonths)
    array.concat(nonleapYearDaysInMonth,restMonths)
    isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0)
    numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2)
    if(byDate)
        mth := (date - backtestBars) < 0 ? mth - 1 : mth
        yr := mth < 1 ? yr - 1 : yr
        mth := mth < 1 ? 1 : mth
        date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1
    if(byMonth)
        date := 1
        yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12)
        mth := mth - (backtestBars%12) + 1
    if(byYear)
        date := 1
        mth := 1
        yr := yr - backtestBars
    [date, mth, yr]


repaint = repaintOption == "Yes"
useSecurityLookahead = repaintOption == "No - set lookahead false"

[SupertrendRepaint, DirRepaint] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = true, gaps=true)
[SupertrendNoLookahead, DirNoLookahead] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = false, gaps=false)

[SupertrendRegular, DirRegular] = supertrend(SupertrendMult, SupertrendPd)

[date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars)
inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0)

longCondition = repaint ? DirRepaint == -1 : useSecurityLookahead? DirNoLookahead == -1 : DirRegular == -1
shortCondition = repaint ? DirRepaint == 1 : useSecurityLookahead? DirNoLookahead == 1 : DirRegular == 1
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange)
strategy.entry("Sell", strategy.short, when=shortCondition and inDateRange)


Más.