La idea principal de esta estrategia es implementar una estrategia de tendencia que sea lo más precisa posible. Juzga la posibilidad de continuidad de la tendencia lineal actual calculando la
La estrategia calcula el ajuste lineal de los precios de cierre N pasados utilizando la regresión lineal ordinaria, obteniendo la pendiente k y la desviación estándar σ de la desviación de los precios de cierre.
Cuando la confianza en la tendencia exceda el umbral de entrada larga, vaya largo; cuando baje al umbral de salida larga, cierre largo. De manera similar, cuando la confianza en la tendencia esté por debajo del umbral de entrada corta, vaya corto; cuando exceda el umbral de salida corta, cierre corto.
De esta manera puede filtrar las señales de los movimientos salvajes de precios que no siguen una tendencia lineal clara.
La estrategia combina métodos de seguimiento de tendencias y regresión lineal en estadísticas, que pueden evitar seguir fluctuaciones de precios a corto plazo y solo seguir tendencias a largo plazo, obteniendo así una menor frecuencia de negociación y una mayor tasa de ganancia.
La estrategia tiene un gran espacio de ajuste de parámetros y puede adaptarse a diferentes productos y plazos ajustando los parámetros, logrando una buena generalización.
La estrategia tiene el riesgo de quedar atrapada. Generará grandes pérdidas cuando se produzca una inversión significativa de la tendencia. Además, la configuración inadecuada de los parámetros también puede conducir a un sobrecomercio o perder buenas oportunidades comerciales.
El riesgo de caída puede ser controlado mediante un stop loss, pero la elección de los parámetros debe evaluarse cuidadosamente para evitar el exceso de ajuste.
La estrategia se puede optimizar aún más en los siguientes aspectos:
Añadir la lógica stop loss/take profit para bloquear las ganancias y controlar los riesgos
Añadir módulo de optimización adaptativa para el ajuste de parámetros dinámicos
Añadir un modelo de aprendizaje automático para determinar los puntos de inversión de tendencia y mejorar aún más la tasa de ganancia
Prueba de adaptabilidad en diferentes productos y plazos para mejorar la generalización
En general, se trata de una estrategia de seguimiento de tendencias a largo plazo con control de riesgos. Combina métodos de seguimiento de tendencias y regresión lineal para filtrar las señales comerciales de ruido. A través del ajuste de parámetros, puede adaptarse bien a diferentes productos y plazos, y es una estrategia efectiva que merece una investigación y mejora en profundidad.
/*backtest start: 2022-11-15 00:00:00 end: 2023-11-21 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/ // © carefulCamel61097 // ################################################################################################ // "This is a trend following strategy that performed very well on the past 5 years" // "Intended to be used on BTC-USDT, 4hr timeframe" // "A factor 2 Leverage can be added by changing Order Size to 200% of equity" // "Higher leverage is not recommended due to big drawdowns" // "Also seems to work on 1D timeframe, although ideal parameters may be different" // "Also seems to work on ETH-USDT and some other altcoins, although ideal parameters are different" // ################################################################################################ //@version=5 strategy("Trend Following based on Trend Confidence", overlay=false ) // Inputs source = input(close) since = input(timestamp('2000-01-01'), title='Start trading interval') till = input(timestamp('2030-01-01'), title='End trading interval') length = input(30, title='Length') longs_on = input.bool(true, title='Longs') shorts_on = input.bool(true, title='Shorts') // Parameters for best performance 2018 - 2022 // long_entry = input.float(0.26, step=0.01, title='Long entry threshold') // long_exit = input.float(-0.10, step=0.01, title='Long exit threshold') // short_entry = input.float(-0.24, step=0.01, title='Short entry threshold') // short_exit = input.float(-0.04, step=0.01, title='Short exit threshold') long_entry = input.float(0.25, step=0.01, title='Long entry threshold') long_exit = input.float(-0.10, step=0.01, title='Long exit threshold') short_entry = input.float(-0.25, step=0.01, title='Short entry threshold') short_exit = input.float(-0.05, step=0.01, title='Short exit threshold') stop_loss = input.float(10, step=1, title='Stop loss (percentage)') / 100 // Trend Confidence linreg = ta.linreg(source, length, 0) linreg_p = ta.linreg(source, length, 0+1) x = bar_index slope = linreg - linreg_p intercept = linreg - x*slope deviationSum = 0.0 for i = 0 to length-1 deviationSum := deviationSum + math.pow(source[i]-(slope*(x-i)+intercept), 2) deviation = math.sqrt(deviationSum/(length)) slope_perc = slope / source[0] deviation_perc = deviation / source[0] trend_confidence = slope_perc / deviation_perc // Strategy in_interval = true sl_long = strategy.position_avg_price * (1 - stop_loss) sl_short = strategy.position_avg_price * (1 + stop_loss) if in_interval and longs_on and ta.crossover(trend_confidence, long_entry) strategy.entry("TC Long Entry", strategy.long) strategy.exit("TC Long Exit", stop=sl_long) if in_interval and longs_on and ta.crossunder(trend_confidence, long_exit) strategy.close("TC Long Entry") if in_interval and shorts_on and ta.crossunder(trend_confidence, short_entry) strategy.entry("TC Short Entry", strategy.short) strategy.exit("TC Short Exit", stop=sl_short) if in_interval and shorts_on and ta.crossover(trend_confidence, short_exit) strategy.close("TC Short Entry") // Plots plot(trend_confidence, "Trend Confidence", color.rgb(255, 255, 255)) plot(long_entry, "", color.rgb(0, 255, 0), linewidth=1) plot(long_exit, "", color.rgb(255, 0, 0), linewidth=1) plot(short_entry, "", color=bar_index % 10 == 0 ? color.rgb(0, 255, 0) : #00000000, linewidth=1) plot(short_exit, "", color=bar_index % 10 == 0 ? color.rgb(255, 0, 0) : #00000000, linewidth=1)