
La stratégie utilise les moyennes mobiles indicielles des périodes de temps rapides et lentes (EMA) pour calculer les plages de fluctuation des prix et créer des frontières entre les zones de tendance grâce à un algorithme de filtrage de gamme unique. Lorsque les prix franchissent ces frontières, le système génère automatiquement des signaux d’achat ou de vente pour aider les traders à capturer les points de rupture de la tendance et à inverser le bruit du marché. La stratégie fournit également une fonctionnalité de visualisation graphique intuitive permettant aux traders d’identifier clairement la direction de la tendance, l’intensité et les opportunités de négociation potentielles.
Le principe central de la stratégie est de construire un filtre de tendance dynamique en calculant la plage de fluctuation des prix. Les étapes de mise en œuvre sont les suivantes:
Calcul de la double portée: La stratégie utilise deux périodes de temps ((rapide et lente) pour calculer la gamme de fluctuation des prix. Tout d’abord, le changement absolu des prix est calculé, puis l’indice de la moyenne mobile ((EMA) est appliqué pour un traitement lisse, et enfin la taille de la gamme est ajustée par un multiplicateur personnalisé.
Utilisation du filtre de portéePar le passé:apply_range_filterLa fonction applique la plage de raffinement calculée par la fonction au prix, qui assure que le nouveau prix filtré ne s’écarte pas trop du prix filtré précédent, réduisant ainsi le faux signal.
Identifier les tendances: Stratégie de suivi des hausses ou des baisses successives des prix du filtre pour quantifier l’intensité et la continuité des tendances.
Construction de la frontière entre les zones: La stratégie calcule les limites supérieures et inférieures en fonction des prix filtrés et de la plage de glissement moyenne. Ces limites s’ajustent en fonction de la dynamique du comportement des prix historiques, formant un filtre de gamme de tendance.
Génération du signalLes signaux d’entrée et de sortie sont directement utilisés pour exécuter les décisions d’entrée et de sortie de la stratégie de trading.
Du point de vue de la mise en œuvre du code, la stratégie utilise une logique conditionnelle en plusieurs couches pour déterminer la valeur du filtre de gamme de tendance, ce qui permet au filtre de s’adapter aux différentes conditions du marché et d’améliorer la fiabilité du signal. Le filtre de gamme de tendance est essentiellement un support et une résistance dynamiques auto-adaptés, capable d’ajuster automatiquement sa sensibilité en fonction de la volatilité du marché.
L’analyse approfondie de la mise en œuvre du code de cette stratégie peut être résumée comme les avantages notables suivants:
Une grande capacité d’adaptation: la stratégie est calculée sur une gamme de deux périodes de temps: rapide et lente, ce qui permet au filtre de s’adapter automatiquement aux changements de volatilité dans différentes conditions de marché. Cette propriété d’adaptation permet à la stratégie de maintenir une performance relativement stable dans différents environnements de marché.
Filtrage du bruitLa stratégie permet de réduire l’influence du bruit du marché sur les décisions de négociation et de réduire la fréquence des faux signaux, grâce à un mécanisme de calcul de la plage lisse et de filtrage des conditions.
La mesure de l’intensité de la tendance: La stratégie fournit aux traders un indicateur quantitatif de la force d’une tendance en suivant la montée ou la baisse de la fréquence de la hausse ou de la baisse de la valeur du filtre. Elle aide à évaluer la fiabilité de la tendance actuelle.
Intuition visuelleLa stratégie consiste à marquer les signaux d’achat et de vente sur le graphique et à remplir de couleurs les différentes zones de tendance, ce qui améliore considérablement l’efficacité de la reconnaissance visuelle des opportunités de trading.
Ajustabilité des paramètres: La stratégie fournit plusieurs paramètres d’entrée ajustables (tels que les cycles rapides / lents, les multiplicateurs de portée, etc.), permettant aux traders d’optimiser la performance de la stratégie en fonction des différentes variétés de transactions et des différentes périodes de temps.
La conception de code structuréLa stratégie consiste à adopter une conception modulaire, enveloppant la logique de calcul centrale par des fonctions personnalisées, afin de rendre le code plus facile à comprendre et à maintenir, tout en facilitant l’extension et l’optimisation ultérieures.
Bien que cette stratégie présente de nombreux avantages, elle comporte des risques et des limites potentiels:
Paramètre Sensibilité: la performance de la stratégie dépend fortement de la sélection des paramètres d’entrée. Des cycles de temps différents et des réglages de multiplicateurs peuvent entraîner des résultats de transactions complètement différents. Les traders doivent effectuer un retour d’expérience et une optimisation suffisants pour trouver la meilleure combinaison de paramètres adaptée à un marché particulier.
Risque de retard: Comme la stratégie utilise les EMA pour un traitement lisse, il est inévitable d’introduire une certaine latence, en particulier lorsque le marché fluctue fortement ou se retourne rapidement, ce qui peut entraîner des retards dans les signaux d’entrée ou de sortie.
Risque de fausse percée: Dans les marchés à correction de zone ou à faible volatilité, les prix peuvent fréquemment traverser les filtres de tendance, générant de multiples faux signaux, entraînant des transactions fréquentes et des coûts de transaction accrus.
Manque de mécanisme de prévention: La mise en œuvre de la stratégie actuelle ne comporte pas de mécanisme de stop loss explicite, ce qui pourrait entraîner des pertes plus importantes en cas de revers soudain de la tendance. Il est recommandé aux traders de compléter les mesures de gestion des risques appropriées.
Une seule source de signal: la stratégie repose uniquement sur le croisement des filtres de la fourchette de prix et de tendance pour générer des signaux, et le manque de vérification auxiliaire d’autres indicateurs de confirmation peut conduire à une fiabilité insuffisante du signal.
Pour réduire ces risques, les traders peuvent envisager d’ajouter des conditions de filtrage supplémentaires, telles que la confirmation de signaux en combinaison avec d’autres indicateurs techniques (comme le RSI, le MACD, etc.), tout en appliquant une gestion stricte des fonds et une stratégie de stop-loss.
L’analyse approfondie de la mise en œuvre du code permet de proposer les orientations d’optimisation suivantes:
Mécanisme de confirmation multipleL’introduction d’indicateurs ou de conditions techniques supplémentaires pour la confirmation du signal, par exemple en combinaison avec le volume des transactions, les indicateurs de dynamique ou l’analyse de la structure du marché, améliore la fiabilité du signal. Cela permet de réduire les faux signaux et d’exécuter des transactions uniquement si plusieurs conditions sont remplies simultanément.
Ajustement des paramètres dynamiques: Mise en œuvre d’un mécanisme d’optimisation automatique des paramètres permettant à la stratégie d’ajuster automatiquement les cycles rapides/lents et les valeurs de multiplication en fonction de l’évolution des conditions du marché. Par exemple, il est possible de multiplier la plage d’ajustement dynamique en fonction d’indicateurs de volatilité du marché (comme l’ATR).
Améliorer la gestion des risquesL’ajout de mécanismes de stop loss et de profit-loss, tels qu’un stop loss dynamique basé sur un réglage ATR, ou l’utilisation d’un croisement inverse d’un filtre de gamme de tendance comme signal de sortie. Une bonne gestion des risques peut considérablement améliorer le rapport risque-rendement d’une stratégie.
Filtre par temps• Augmenter le filtrage des fenêtres de temps de négociation, éviter les périodes de forte volatilité telles que les ouvertures et fermetures des marchés ou la publication de données économiques importantes, et réduire les faux signaux causés par des fluctuations anormales.
Filtrage de la force de la tendanceUtilisez le compteur de tendance haussière/baisse déjà calculé, définissez la limite minimale d’intensité de la tendance, générez des signaux de négociation uniquement lorsque la tendance est suffisamment forte, évitez les transactions excessives dans des tendances faibles ou des marchés de consolidation.
Optimisation du machine learningConsidérer l’introduction d’algorithmes d’apprentissage automatique pour optimiser la sélection de paramètres ou améliorer la précision de la reconnaissance du signal grâce à des modèles de formation de données historiques. Par exemple, la fiabilité du signal peut être prévue à l’aide de forêts aléatoires ou de machines à vecteurs de support.
La mise en œuvre de ces orientations d’optimisation peut considérablement améliorer la stabilité et la rentabilité de la stratégie, lui permettant de rester performant dans différents environnements de marché.
La stratégie de négociation de quantification de filtrage de la zone de tendance dynamique de haut niveau est un système de suivi de la tendance basé sur la gamme dynamique des prix, qui construit un mécanisme de reconnaissance de la tendance flexible par le calcul de la gamme d’adaptation des doubles périodes de temps. Le principal avantage de la stratégie réside dans sa forte adaptabilité et sa capacité de filtrage du bruit, capable d’identifier efficacement les changements de tendance et de générer des signaux de négociation dans différentes conditions de marché.
La stratégie établit des frontières dynamiques entre les zones de tendance en calculant des gammes lisses de cycles de temps rapides et lents, combinées à un algorithme de filtrage de gamme unique. Lorsque les prix se croisent avec ces frontières, le système génère automatiquement un signal d’achat ou de vente pour aider les traders à capturer les points de basculement de la tendance.
Bien que cette stratégie présente de nombreux avantages, elle est également confrontée à des risques tels que la sensibilité des paramètres, le retard et les fausses percées. Des mesures d’optimisation telles que l’introduction de mécanismes de confirmation multiples, l’ajustement dynamique des paramètres et la gestion renforcée des risques peuvent améliorer encore la stabilité et la rentabilité de la stratégie.
Dans l’ensemble, il s’agit d’une stratégie de trading quantitatif bien conçue et bien mise en œuvre, adaptée aux traders expérimentés qui l’appliquent aux transactions réelles après un retour d’expérience suffisant et une optimisation des paramètres. Il s’agit d’un choix de stratégie à considérer pour les traders qui cherchent à suivre les tendances et à s’adapter dynamiquement aux changements du marché.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-06-12 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("L3 Twin Range Filter Pro Strategy", overlay=true)
// 输入参数
price_source = input(defval=close, title='Price Source')
show_trade_signals = input(title='Show Buy/Sell Signals ?', defval=true)
fast_period = input.int(defval=9, minval=1, title='Fast period')
fast_range_multiplier = input.float(defval=1.6, minval=0.1, title='Fast range multiplier')
slow_period = input.int(defval=34, minval=1, title='Slow period')
slow_range_multiplier = input.float(defval=2, minval=0.1, title='Slow range multiplier')
// 自定义函数
calculate_smooth_range(price, period, multiplier) =>
window_period = period * 2 - 1
average_range = ta.ema(math.abs(price - price[1]), period)
smooth_range = ta.ema(average_range, window_period) * multiplier
smooth_range
apply_range_filter(price, range_value) =>
range_filtered_price = price
range_filtered_price := price > nz(range_filtered_price[1]) ? price - range_value < nz(range_filtered_price[1]) ? nz(range_filtered_price[1]) : price - range_value : price + range_value > nz(range_filtered_price[1]) ? nz(range_filtered_price[1]) : price + range_value
range_filtered_price
// 计算过程
fast_smooth_range = calculate_smooth_range(price_source, fast_period, fast_range_multiplier)
slow_smooth_range = calculate_smooth_range(price_source, slow_period, slow_range_multiplier)
average_smooth_range = (fast_smooth_range + slow_smooth_range) / 2
filtered_price = apply_range_filter(price_source, average_smooth_range)
upward_trend = 0.0
upward_trend := filtered_price > filtered_price[1] ? nz(upward_trend[1]) + 1 : filtered_price < filtered_price[1] ? 0 : nz(upward_trend[1])
downward_trend = 0.0
downward_trend := filtered_price < filtered_price[1] ? nz(downward_trend[1]) + 1 : filtered_price > filtered_price[1] ? 0 : nz(downward_trend[1])
upper_range_boundary = filtered_price + average_smooth_range
lower_range_boundary = filtered_price - average_smooth_range
upper_bound = 0.0
upper_bound := upper_range_boundary < nz(upper_bound[1]) or close[1] > nz(upper_bound[1]) ? upper_range_boundary : nz(upper_bound[1])
lower_bound = 0.0
lower_bound := lower_range_boundary > nz(lower_bound[1]) or close[1] < nz(lower_bound[1]) ? lower_range_boundary : nz(lower_bound[1])
trend_range_filter = 0.0
trend_range_filter := nz(trend_range_filter[1]) == upper_bound[1] and close <= upper_bound ? upper_bound : nz(trend_range_filter[1]) == upper_bound[1] and close >= upper_bound ? lower_bound : nz(trend_range_filter[1]) == lower_bound[1] and close >= lower_bound ? lower_bound : nz(trend_range_filter[1]) == lower_bound[1] and close <= lower_bound ? upper_bound : upper_bound
// 定义交易信号
buy_signal = ta.crossover(close, trend_range_filter)
sell_signal = ta.crossunder(close, trend_range_filter)
// 执行交易
if (buy_signal)
strategy.entry("Buy", strategy.long)
if (sell_signal)
strategy.entry("Sell", strategy.short)
// 绘制标签
if (show_trade_signals and buy_signal)
label.new(bar_index, trend_range_filter, "BUY", color=color.new(color.green, 0), style=label.style_label_up)
if (show_trade_signals and sell_signal)
label.new(bar_index, trend_range_filter, "SELL", color=color.new(color.red, 0), style=label.style_label_down)
// 绘制图表元素
trend_range_filter_plot = plot(trend_range_filter, color=close > trend_range_filter ? color.new(color.lime, 10) : close < trend_range_filter ? color.new(color.red, 10) : na, title="Trend Range Filter")
price_plot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
up_trend_color = close > trend_range_filter ? color.new(color.lime, 80) : na
down_trend_color = close < trend_range_filter ? color.new(color.red, 80) : na
fill(price_plot, trend_range_filter_plot, title='UpTrend Highlighter', color=up_trend_color, transp=90)
fill(price_plot, trend_range_filter_plot, title='DownTrend Highlighter', color=down_trend_color, transp=90)