L'idée principale de cette stratégie est de mettre en œuvre une stratégie de suivi de tendance qui soit aussi précise que possible. Elle juge la possibilité de continuité de la tendance linéaire actuelle en calculant la "confiance" d'un certain nombre de prix de clôture passés. La stratégie suppose qu'une fois que la confiance dépasse un certain niveau, la tendance linéaire en cours est plus susceptible de se poursuivre.
La stratégie calcule l'ajustement linéaire des prix de clôture N passés en utilisant la régression linéaire ordinaire, en obtenant la pente k et l'écart type σ de l'écart par rapport aux prix de clôture.
Lorsque la confiance en la tendance dépasse le seuil d'entrée longue, passez long; lorsqu'elle tombe au seuil de sortie longue, fermez long. De même, lorsque la confiance en la tendance est inférieure au seuil d'entrée courte, passez court; lorsqu'elle dépasse le seuil de sortie courte, fermez court.
De cette façon, il peut filtrer les signaux des mouvements de prix sauvages qui ne suivent pas une tendance linéaire claire.
La stratégie combine les méthodes de suivi de tendance et de régression linéaire en statistique, qui peuvent éviter de suivre les fluctuations de prix à court terme et ne suivre que les tendances à long terme, obtenant ainsi une fréquence de négociation plus faible et un taux de gain plus élevé.
La stratégie dispose d'un grand espace de réglage des paramètres et peut être adaptée à différents produits et délais en ajustant les paramètres, ce qui permet une bonne généralisabilité.
La stratégie présente le risque d'être piégée. Elle générera de grosses pertes en cas d'inversion de tendance significative. De plus, des paramètres mal réglés peuvent également conduire à un suréchange ou à des opportunités de trading manquantes.
Le risque de baisse peut être contrôlé par un arrêt-perte, mais le choix des paramètres doit être soigneusement évalué pour éviter un surajustement.
La stratégie peut être encore optimisée dans les aspects suivants:
Ajouter une logique stop loss/take profit pour verrouiller les bénéfices et contrôler les risques
Ajouter le module d'optimisation adaptative pour le réglage des paramètres dynamiques
Ajouter un modèle d'apprentissage automatique pour déterminer les points d'inversion de tendance et améliorer encore le taux de victoire
Test d'adaptabilité sur différents produits et délais afin d'améliorer la généralisation
En général, il s'agit d'une stratégie de suivi de tendance à long terme avec contrôle des risques. Il combine les méthodes de suivi de tendance et de régression linéaire pour filtrer les signaux de négociation du bruit. Grâce au réglage des paramètres, il peut bien s'adapter à différents produits et délais, et est une stratégie efficace qui mérite une recherche et une amélioration approfondies.
/*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)