
La stratégie de suivi de la tendance à l’extrême inversion KDJ est un système de trading quantitatif qui combine la dynamique de l’inversion et la notion de suivi de la tendance. Son cœur réside dans la capture du premier signal de revers après que l’indicateur J se trouve dans la zone d’extrémité (de 0 à 100) et dans le filtrage de la direction de la tendance par la ligne de parité EMA676 pour s’assurer que la direction de la transaction est conforme à la tendance dominante. Le système utilise des conditions d’entrée précises, une gestion de position flexible et un mécanisme de contrôle du risque strict pour rechercher des opportunités de trading à haute probabilité dans un marché en mouvement.
La logique de base de cette stratégie est basée sur les caractéristiques de la valeur J de l’indicateur KDJ et est combinée à un filtrage de tendance pour une entrée précise. Les principes spécifiques sont les suivants:
Identification des valeurs extrêmes de J: la stratégie surveille si la valeur de J atteint une plage de valeurs extrêmes prédéfinies (la limite supérieure par défaut est de 100 et la limite inférieure de 0), ces zones de valeurs extrêmes représentent généralement un marché surbouché ou survendu.
Confirmation du mode de changement continu: la stratégie exige que la valeur de J atteigne une extrémité, après quoi il doit y avoir une variation unidirectionnelle de 3 lignes K successives ((augmentation ou baisse continue)) ce qui permet de confirmer un mouvement fort de l’indicateur.
Capture du signal de retour: Lorsque la valeur J a effectué un mouvement unidirectionnel de 3 lignes K consécutives, la stratégie surveille le changement de direction inverse qui se produit pour la première fois, c’est-à-dire que la valeur J est passée de la hausse à la baisse consécutive ou du point de basculement de la baisse à la hausse consécutive.
Filtrage de la tendance: la stratégie utilise la moyenne EMA676 comme critère de jugement de tendance, et ne considère un signal plus que lorsque le prix est au-dessus de la moyenne, et un signal plus que lorsque le prix est au-dessous de la moyenne, pour s’assurer que la direction de la transaction est en accord avec la tendance globale.
Arrêt et arrêt dynamiqueLa stratégie utilise le stop loss en pourcentage basé sur le prix d’entrée, avec un stop loss par défaut de 3% et un stop loss de 2.2%, pour une structure de négociation avec un ratio de risque/revenu supérieur à 1.
Gestion intelligente des entrepôts: Le système fournit un nombre de contrats fixe et deux méthodes de calcul de position basées sur le pourcentage de risque, ce qui permet d’ajuster la taille de la position en fonction de la dynamique de la marge de risque de chaque transaction, optimisant l’efficacité de l’utilisation des fonds.
Après une analyse approfondie du code, la stratégie présente les avantages suivants:
Un déclencheur de signal précis: En exigeant que la valeur de J atteigne non seulement la valeur maximale, mais qu’elle subisse également un mouvement unidirectionnel de 3 lignes K consécutives, puis qu’elle capte la première inversion, cette condition composée améliore considérablement la fiabilité du signal et réduit les fausses percées.
Une combinaison parfaite de tendances et de retournementsLa stratégie est une combinaison subtile de deux stratégies de trading: le suivi de la tendance (filtrage dans la direction de l’EMA676) et le trading inversé (rebours à la valeur de la valeur de J), qui respectent la direction de la tendance générale tout en capturant des occasions de rebond à forte probabilité dans la tendance.
Gestion des risques adaptée: Le code implémente un calcul de position dynamique basé sur le pourcentage de risque, ce qui permet de maintenir un seuil de risque constant pour chaque transaction et de maintenir un contrôle du risque stable, quelle que soit la volatilité du marché.
Une réponse visuelle claireLa stratégie consiste à tracer les signaux d’entrée, les points de déclenchement de stop-loss et les lignes de prix clés sur un graphique, permettant au trader de comprendre intuitivement la logique d’exécution et le résultat de chaque transaction.
Configuration flexible des paramètresLe système fournit de nombreux paramètres réglables, y compris le cycle de calcul de KDJ, la longueur de l’EMA, les paramètres de limite, le taux de stop loss, etc., ce qui permet à la stratégie de s’adapter à différents environnements de marché et types de transactions.
Mécanisme de préavis: Le code a conçu des conditions d’alerte précoce pour le déclenchement de signaux rapprochés, comme la valeur J qui se rapproche de la zone de limite ou le signal d’entrée qui est sur le point de se former, afin d’informer les traders à l’avance de se préparer et d’améliorer l’efficacité des opérations.
Malgré cette stratégie bien conçue, les risques potentiels sont les suivants:
Le blocage des pertes dans des situations extrêmesLa solution consiste à introduire des mécanismes d’arrêt hors-jeu ou à envisager d’utiliser des fonds de plafond en conditions de jeu.
Risque de décalage moyen: L’EMA676 présente un retard significatif en tant que moyenne à long terme et peut donner une orientation erronée au début d’un revirement de tendance. Il est recommandé de combiner l’analyse à plusieurs cycles ou d’ajouter des indicateurs de confirmation de tendance à court terme pour optimiser la qualité du signal.
Paramètres optimisés pour les surmesures: Les paramètres actuels (par exemple, cycle de KDJ 60, réglage de la valeur maximale 100⁄0) peuvent être obtenus sur la base d’optimisations de données historiques, il existe un risque de suradaptation. Il est recommandé de vérifier la solidité des paramètres par des tests de présupposition et de différents cycles.
Déviation de calcul de la valeur J: la stratégie utilise la fonction bcwsma personnalisée pour calculer les valeurs de KDJ. Il peut y avoir des différences avec les calculs de KDJ standard sur différentes plates-formes, ce qui entraîne des incohérences entre la rétroaction et le signal du disque. La cohérence des méthodes de calcul doit être confirmée avant le disque.
Risques liés à la faible liquidité des marchés: dans les marchés où le volume de transactions est faible, le point de stop-loss peut être plus important, ce qui affecte la performance réelle de la stratégie. Il est recommandé d’appliquer la stratégie sur les marchés à forte liquidité ou les variétés de transactions traditionnelles.
La fréquence du signal est instable: Les signaux basés sur l’inversion des extrêmes peuvent varier considérablement en fréquence dans différents environnements de marché, ce qui entraîne une instabilité de l’efficacité de l’utilisation des fonds. L’ajout de signaux de négociation auxiliaires ou de mécanismes de confirmation de plusieurs périodes peut être envisagé pour lisser la fréquence des transactions.
Les orientations d’optimisation suivantes peuvent être envisagées en fonction des caractéristiques existantes de la stratégie:
Définition des extrémités dynamiques: les stratégies actuelles utilisent des limites inférieures et supérieures de valeurs extrêmes fixes (> 100 et 0), et il est possible d’envisager d’ajuster dynamiquement la plage de valeurs extrêmes en fonction de la volatilité historique pour s’adapter à différents environnements de volatilité, par exemple en réduisant la plage de valeurs extrêmes de manière appropriée pendant les périodes de basse volatilité et en élargissant la plage de valeurs extrêmes pendant les périodes de haute volatilité.
Confirmation de plusieurs périodes: introduire des signaux de confirmation de cadres temporels de niveau plus élevé, par exemple en demandant que les valeurs J de niveau de lumière du jour soient également dans la zone de limite, ou en confirmant la cohérence du signal à des périodes de 3 minutes et 15 minutes, pour améliorer la qualité du signal.
Système d’arrêt intelligent: implémenter des stratégies de stop-loss dynamiques, telles que le calcul de stop-loss par tranches de plafonnement ou sur la base de l’ATR, ou l’utilisation d’un stop-loss de suivi après que le profit a atteint un certain niveau, pour maximiser le profit de la capture de tendance.
Filtrage de l’environnement du marché: augmenter les conditions de filtrage de la volatilité, suspendre les transactions dans des conditions de marché trop ou très basses, ou ajuster la taille des positions pour éviter de négocier dans des conditions de marché qui ne conviennent pas à la stratégie.
Classification de l’intensité du signalIl est possible d’ajuster la taille de la position en fonction de l’intensité du signal. Les signaux forts augmentent la position et les signaux faibles diminuent la position.
Optimisation du machine learning: introduire des algorithmes d’apprentissage automatique pour optimiser automatiquement les combinaisons de paramètres, ou extraire les caractéristiques des signaux historiques, créer des modèles prédictifs pour évaluer la probabilité de succès de chaque signal, améliorer l’adaptabilité et la robustesse des stratégies.
La stratégie de suivi de tendance à l’extrême est un système de trading quantitatif, structuré et logiquement clair, qui maîtrise les risques tout en conservant un taux de victoire élevé en capturant les inversions de tendance à l’extrême des indicateurs techniques et en les combinant avec des filtres de tendance. Le principal avantage de la stratégie réside dans la précision de son mécanisme de déclenchement des signaux et l’intégrité de la gestion des risques, adaptés aux environnements de marché où les tendances à moyen et long terme sont claires mais volatiles.
Du point de vue de l’implémentation, la structure du code de la stratégie est claire, la logique de calcul est rigoureuse, elle contient des fonctions de gestion de transactions complètes, et elle est mise en œuvre en détail, de la génération de signaux, du calcul des positions à l’exécution de stop-loss. La stabilité et l’adaptabilité de la stratégie sont susceptibles d’être encore améliorées grâce aux orientations d’optimisation proposées dans le présent article, en particulier l’ajustement des paramètres dynamiques et la confirmation de signaux multidimensionnels.
Pour les traders, l’application de cette stratégie devrait tenir compte de l’applicabilité des paramètres de validation dans différentes conditions de marché et ajuster les paramètres de stop loss et de position en fonction des préférences de risque personnelles. Il est également recommandé de combiner l’analyse fondamentale et l’analyse technique à des délais plus élevés pour améliorer la globalité et l’exactitude des décisions de négociation.
//@version=6
strategy("J值极值趋势跟随策略", overlay = true,
default_qty_type = strategy.percent_of_equity, default_qty_value = 10, // 降低每笔交易的仓位大小
initial_capital = 10000,
margin_long = 20, margin_short = 20) // 设置合理的保证金要求
// === 策略说明:J值极值趋势跟随策略 ===
// 主图:显示J值连续下降后反弹的买点和连续上升后回调的卖点
// 副图:显示J线走势、中轴线、极值区域
// 方向过滤:676均线,价格在上方只做多,下方只做空
// 止盈止损:基于百分比波动,默认1%止盈1%止损
// === 输入参数 ===
lengthK = input.int(60, title = "K period")
lengthD = input.int(3, title = "D period")
smoothK = input.int(3, title = "Smooth K")
emaLength = input.int(576, title = "趋势EMA周期", inline="ema")
extremeHigh = input.float(100, title = "J值极值上限", minval = 80, maxval = 120)
extremeLow = input.float(0, title = "J值极值下限", minval = -20, maxval = 20)
// === 止盈止损参数(改为百分比) ===
takeProfitPercent = input.float(3, title = "止盈百分比", minval = 0.1, step = 0.1)
stopLossPercent = input.float(2.2, title = "止损百分比", minval = 0.1, step = 0.1)
// === 风险控制参数 ===
useFixedPositionSize = input.bool(true, title = "使用固定合约数量")
fixedPositionSize = input.float(1.0, title = "固定合约数量", minval = 0.1, step = 0.1)
riskPerTrade = input.float(1.0, title = "每笔交易风险百分比", minval = 0.1, maxval = 10, step = 0.1)
// === KDJ计算(使用与bitcoinwisdom一致的算法) ===
// 自定义加权移动平均函数(与bitcoinwisdom一致)
bcwsma(s, l, m) =>
var _bcwsma = 0.0
_bcwsma := (m*s + (l-m)*nz(_bcwsma[1])) / l
_bcwsma
highestHigh = ta.highest(high, lengthK)
lowestLow = ta.lowest(low, lengthK)
rsv = (close - lowestLow) / (highestHigh - lowestLow) * 100
K = bcwsma(rsv, smoothK, 1)
D = bcwsma(K, lengthD, 1)
J = 3 * K - 2 * D
// === 676均线方向判断 ===
ema676 = ta.ema(close, emaLength)
trendUp = close > ema676 // 价格在676均线上方
trendDown = close < ema676 // 价格在676均线下方
// === 检测J值连续下降和上升 ===
// 检测连续3根下降:J < J[1] < J[2] < J[3]
jContinuousDown = J < J[1] and J[1] < J[2] and J[2] < J[3]
// 检测连续3根上升:J > J[1] > J[2] > J[3]
jContinuousUp = J > J[1] and J[1] > J[2] and J[2] > J[3]
// === 检测反弹和回调(必须在极值区域内) ===
// 反弹:当前J值上升,且之前连续下降,且J值在极值下限以下
jBounce = J > J[1] and jContinuousDown[1] and J[1] <= extremeLow
// 回调:当前J值下降,且之前连续上升,且J值在极值上限以上
jPullback = J < J[1] and jContinuousUp[1] and J[1] >= extremeHigh
// === 开仓信号(带方向过滤) ===
// 买点:J值连续下降后反弹 + 价格在676均线上方
longEntry = jBounce and trendUp
// 卖点:J值连续上升后回调 + 价格在676均线下方
shortEntry = jPullback and trendDown
// === 记录开仓价格和止盈止损价格 ===
var float entryPrice = na
var float tpPrice = na
var float slPrice = na
// === 计算仓位大小 ===
// 基于风险百分比的仓位计算需要考虑止损百分比
positionSize = useFixedPositionSize ? fixedPositionSize : (strategy.equity * (riskPerTrade / 100)) / (close * stopLossPercent / 100)
// === 止盈止损信号变量 ===
var bool longTakeProfitHit = false
var bool longStopLossHit = false
var bool shortTakeProfitHit = false
var bool shortStopLossHit = false
// === 警报信号指示器 ===
// 多单入场信号将触发
longSignalComing = J <= extremeLow and jContinuousDown and trendUp
// 空单入场信号将触发
shortSignalComing = J >= extremeHigh and jContinuousUp and trendDown
// J值接近极值区域
jNearExtremeLow = J <= extremeLow + 5 and J > extremeLow
jNearExtremeHigh = J >= extremeHigh - 5 and J < extremeHigh
// === 策略执行 ===
if (longEntry and strategy.position_size == 0)
entryPrice := close
// 计算基于百分比的止盈止损价格
tpPrice := entryPrice * (1 + takeProfitPercent / 100)
slPrice := entryPrice * (1 - stopLossPercent / 100)
strategy.entry("多单", strategy.long, qty=positionSize)
// 重置止盈止损信号
longTakeProfitHit := false
longStopLossHit := false
if (shortEntry and strategy.position_size == 0)
entryPrice := close
// 计算基于百分比的止盈止损价格
tpPrice := entryPrice * (1 - takeProfitPercent / 100)
slPrice := entryPrice * (1 + stopLossPercent / 100)
strategy.entry("空单", strategy.short, qty=positionSize)
// 重置止盈止损信号
shortTakeProfitHit := false
shortStopLossHit := false
// === 手动检查止盈止损条件 ===
// 多单止盈止损
longTPHit = strategy.position_size > 0 and high >= tpPrice and not longTakeProfitHit
longSLHit = strategy.position_size > 0 and low <= slPrice and not longStopLossHit
if (longTPHit)
strategy.close("多单", comment="止盈")
longTakeProfitHit := true
if (longSLHit)
strategy.close("多单", comment="止损")
longStopLossHit := true
// 空单止盈止损
shortTPHit = strategy.position_size < 0 and low <= tpPrice and not shortTakeProfitHit
shortSLHit = strategy.position_size < 0 and high >= slPrice and not shortStopLossHit
if (shortTPHit)
strategy.close("空单", comment="止盈")
shortTakeProfitHit := true
if (shortSLHit)
strategy.close("空单", comment="止损")
shortStopLossHit := true
// === 在主图绘制676均线 ===
plot(ema676, title="676 EMA", color=color.blue, linewidth=2)
// === 在主图标注开仓信号 ===
plotshape(longEntry, title="多单入场", location=location.belowbar, color=color.lime, style=shape.triangleup, size=size.small, text="多单", force_overlay=true)
plotshape(shortEntry, title="空单入场", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="空单", force_overlay=true)
// === 添加止盈止损信号 ===
// 多单止盈信号
plotshape(longTPHit, title="多单止盈", location=location.abovebar,
color=color.green, style=shape.circle, size=size.normal, text="止盈", force_overlay=true)
// 多单止损信号
plotshape(longSLHit, title="多单止损", location=location.abovebar,
color=color.red, style=shape.xcross, size=size.normal, text="止损", force_overlay=true)
// 空单止盈信号
plotshape(shortTPHit, title="空单止盈", location=location.belowbar,
color=color.green, style=shape.circle, size=size.normal, text="止盈", force_overlay=true)
// 空单止损信号
plotshape(shortSLHit, title="空单止损", location=location.belowbar,
color=color.red, style=shape.xcross, size=size.normal, text="止损", force_overlay=true)
// === 绘制止盈止损线 ===
plot(strategy.position_size != 0 ? tpPrice : na, title="止盈", color=color.green, style=plot.style_line, linewidth=1)
plot(strategy.position_size != 0 ? slPrice : na, title="止损", color=color.red, style=plot.style_line, linewidth=1)
plot(strategy.position_size != 0 ? entryPrice : na, title="入场价", color=color.yellow, style=plot.style_line, linewidth=1)
// === 设置警报条件(使用常量字符串) ===
// 基础信号警报
alertcondition(longEntry, title="多单入场信号", message="J值极值策略: 多单入场信号触发")
alertcondition(shortEntry, title="空单入场信号", message="J值极值策略: 空单入场信号触发")
alertcondition(longTPHit, title="多单止盈触发", message="J值极值策略: 多单止盈触发")
alertcondition(longSLHit, title="多单止损触发", message="J值极值策略: 多单止损触发")
alertcondition(shortTPHit, title="空单止盈触发", message="J值极值策略: 空单止盈触发")
alertcondition(shortSLHit, title="空单止损触发", message="J值极值策略: 空单止损触发")
// === 添加交易详情标签 ===
if (longTPHit)
label.new(bar_index, high, text="多单止盈 +" + str.tostring(takeProfitPercent) + "%",
style=label.style_label_down, color=color.green, textcolor=color.white)
if (longSLHit)
label.new(bar_index, low, text="多单止损 -" + str.tostring(stopLossPercent) + "%",
style=label.style_label_up, color=color.red, textcolor=color.white)
if (shortTPHit)
label.new(bar_index, low, text="空单止盈 +" + str.tostring(takeProfitPercent) + "%",
style=label.style_label_up, color=color.green, textcolor=color.white)
if (shortSLHit)
label.new(bar_index, high, text="空单止损 -" + str.tostring(stopLossPercent) + "%",
style=label.style_label_down, color=color.red, textcolor=color.white)