
La stratégie est un système de négociation de rupture soigneusement conçu, combinant la gestion des arrêts de perte adaptative ATR (Average True Range) et le filtrage directionnel ADX (Average Directional Index). La stratégie entre dans la négociation après la confirmation de la rupture des hauts / bas des cycles N, tout en se référant au filtre de tendance RMA (Rolling Moving Average) à long terme pour assurer la cohérence avec la tendance principale. Le système utilise une logique de stop-loss en deux étapes: un stop-loss initial fixe ATR et un suivi dynamique des pertes après la réalisation de la marge bénéficiaire.
Les principes centraux de la stratégie sont basés sur un système de jugement intégré qui combine la confirmation de tendance et le filtrage de l’intensité de la direction avec la résistance historique de soutien de la rupture du prix:
Signal de rupture généré: Utilisation du cycle N (défaut 96) de hauts/bas comme point de référence de rupture, déclenchement d’un signal à plusieurs têtes lorsque la clôture du cours dépasse le haut du cours précédent et est en tendance haussière; déclenchement d’un signal à tête nue lorsque la clôture du cours dépasse le bas du cours précédent et est en tendance baissière.
Filtrage des tendances: utilise la moyenne RMA à plus longue période (default 960) comme base de jugement de tendance, le prix est considéré comme une tendance à la hausse au-dessus de la RMA et le prix est considéré comme une tendance à la baisse en dessous de la RMA, en veillant à ce que la direction de la transaction soit conforme à la tendance principale.
Filtrage de l’intensité dans la direction ADX: en calculant l’intensité directionnelle du marché actuel (indicateur ADX) et en exigeant que l’ADX soit supérieur au seuil défini (défaut 12) et en phase ascendante, filtrer l’ambiguïté de la direction pour compiler l’environnement du marché
Le mécanisme de stop-loss en deux étapes:
Retrait du dispositif de freinage: après l’activation de l’arrêt de traçage, enregistrer le plus haut/le plus bas de la position de tête multiple et déclencher l’arrêt de l’effet de levier lorsque la retraite du prix du point extrême dépasse le multiplicateur ATR défini (default 13 fois la position de tête multiple et 4 fois la position de tête vide).
Gestion des risques adaptéeL’ATR, en tant qu’indicateur de volatilité, est capable d’ajuster automatiquement la distance d’arrêt en fonction des fluctuations réelles du marché, évitant ainsi le problème d’un arrêt à points fixes trop large ou trop étroit dans différentes conditions de marché.
Contrôle des risques à plusieurs niveauxLa stratégie utilise une double logique de stop-loss combinant un stop-loss initial et un stop-loss de suivi, qui garantit à la fois la maîtrise du risque initial et la possibilité de bloquer les bénéfices après l’expansion des bénéfices et de donner à la tendance suffisamment d’espace pour se développer. Cette structure de stop-loss est particulièrement adaptée pour capturer les grandes tendances.
Filtre de confirmation de directionFiltrez l’indicateur par l’ADX, en demandant que le marché ait suffisamment de direction et que la direction s’intensifie[1]), ce qui permet d’éviter les transactions fréquentes sur les marchés de consolidation sans tendance évidente et de réduire les pertes causées par les fausses percées.
Garantir la cohérence des tendances: Utilisation de la moyenne RMA à long terme comme filtre de tendance, assurant la négociation uniquement dans la direction de la tendance dominante, évitant les opérations de contre-courant, améliorant la réussite des transactions et l’efficacité des fonds.
Système d’arrêt intelligentLa fonction de rétrogradation permet de verrouiller les bénéfices en cas de rétrogradation après une forte fluctuation des prix et d’éviter un retour excessif des bénéfices, particulièrement adapté à la capture d’une expansion soudaine des taux de volatilité.
Surveillance visuelle: La stratégie identifie clairement sur le graphique le prix d’entrée, les différentes lignes de stop-loss, les niveaux de rupture et les couleurs de fond de la tendance, permettant aux traders de surveiller visuellement l’état de fonctionnement de la stratégie et les prix critiques.
Risque de fausse percée: Malgré l’utilisation de filtres ADX et de confirmation de tendance, les marchés peuvent toujours être confrontés à des fausses ruptures, en particulier lors de communiqués de presse importants ou de changements brusques de liquidité. La solution consiste à augmenter le seuil ADX de manière appropriée ou à ajouter des exigences de confirmation de rupture, telles que la nécessité de maintenir plusieurs lignes K persistantes au-dessus / en dessous du niveau de rupture après la rupture.
Paramètre SensibilitéLes performances stratégiques sont sensibles aux paramètres de réglage, en particulier le choix des cycles ATR, des multiplicateurs et des cycles de rupture. Les paramètres optimaux peuvent varier considérablement selon les conditions du marché. Il est recommandé de vérifier la stabilité des paramètres dans différents environnements de marché en effectuant des retraits historiques et d’envisager la mise en œuvre d’un mécanisme d’ajustement des paramètres adaptatifs.
Suivre le retard de rupture: lors d’une forte reprise de la tendance, le suivi des arrêts de perte peut ne pas suivre en temps opportun les variations de prix, ce qui entraîne la rétrocession d’une partie des bénéfices déjà réalisés. Il est possible d’envisager d’ajuster dynamiquement le multiplicateur ATR dans un environnement hautement volatile ou de combiner un revirement de tendance potentiel avec un indicateur de dynamique à court terme.
Le filtrage des tendances à long terme est en retard: L’utilisation d’une moyenne RMA à long terme comme filtre de tendance peut entraîner des signaux manqués ou produire des signaux erronés près des points de basculement de la tendance. La solution consiste à introduire une confirmation de tendance à plusieurs périodes ou à combiner des indicateurs de tendance à court et moyen terme plus sensibles comme jugement auxiliaire.
Le gouvernement a décidé d’annuler la suspension.: dans une tendance forte, le mécanisme d’arrêt de rétraction peut entraîner une sortie prématurée de la tendance qui continuera à se développer. Vous pouvez envisager d’ajuster la valeur de la barre de rétraction en fonction de la dynamique de l’intensité de la tendance, ou de vous adapter à l’ajustement du multiplicateur de rétraction en cas de variation de la volatilité.
Système de paramètres adaptés: construction d’un mécanisme d’ajustement des paramètres d’adaptation basé sur la volatilité du marché et la force de la tendance, permettant l’optimisation automatique du multiplicateur ATR, du seuil ADX et du multiplicateur de rétraction en fonction de l’environnement de marché actuel. Par exemple, réduire le multiplicateur ATR dans un environnement à faible volatilité et augmenter le multiplicateur ATR dans un environnement à forte volatilité; augmenter le multiplicateur de rétraction dans une tendance forte et réduire le multiplicateur de rétraction dans une tendance faible.
Confirmation de plusieurs périodesL’introduction d’analyses multi-temporelles, qui exigent que la direction de la tendance des périodes plus élevées soit conforme à la direction des transactions, et l’intégration des points de résistance de soutien des périodes plus élevées dans la référence de décision, améliorent la fiabilité des signaux de rupture.
Optimisation de l’entrée intelligente: mise en place d’un mécanisme d’entrée par lots, entrée partielle après le déclenchement du signal de percée initial, mise en place de la position après la confirmation de la percée, réduction du risque de fausse percée tout en garantissant la présence d’une véritable percée.
Détection d’arrêt de fluctuationDéveloppement d’un système de freinage intelligent basé sur les variations de la volatilité, en mettant en place des conditions plus strictes de retrait de freinage après une augmentation soudaine de la volatilité, en donnant une plus grande marge de réajustement aux prix lorsque la volatilité est stable, ce qui rend les décisions de freinage plus conformes à la réalité du marché.
Le renforcement de l’apprentissage automatique: Introduction d’algorithmes d’apprentissage automatique pour analyser les modèles de rupture historiques, identifier les combinaisons de caractéristiques de rupture à haut taux de réussite et, en conséquence, ajuster dynamiquement les paramètres de stratégie ou configurer un système de notation de qualité de la rupture, en prioriser les transactions de signaux de rupture de haute qualité.
Optimisation des coûts de transactionOptimiser les moments d’entrée et les types d’ordres en fonction des caractéristiques de liquidité et de la structure des coûts de transaction des différents types de transactions, par exemple en utilisant des ordres à prix limités au lieu des ordres à prix du marché dans des environnements à faible liquidité ou en utilisant des ordres à prix limités de suivi dans des environnements à forte volatilité.
Intégration des indicateurs émotionnels: en combinant des indicateurs d’émotion du marché (comme l’indice de volatilité, l’indice de largeur du marché, etc.) comme référence de décision auxiliaire, ajuster les paramètres de la stratégie dans un environnement émotionnel extrême ou suspendre la négociation pour éviter de subir des pertes inutiles dans un environnement de marché irrationnel.
Le système de filtrage de direction ADX est un système de négociation intégré qui combine plusieurs concepts fondamentaux de l’analyse technique. Il capture le point de départ de la tendance par le biais de la négociation de rupture, améliore la qualité du signal en utilisant le filtrage de la tendance et la confirmation de l’intensité de la direction, et permet une gestion complète des fonds grâce à une gestion des risques adaptative et à un mécanisme de stop-loss à plusieurs niveaux.
Le plus grand avantage de la stratégie réside dans son adaptabilité aux différents environnements de marché et son cadre de gestion des risques. L’ajustement dynamique des risques réalisé par l’indicateur ATR permet à la stratégie de maintenir un niveau d’exposition au risque relativement cohérent dans différents environnements de volatilité, tandis que le mécanisme de stop-loss et de retrait d’arrêt en deux étapes offre une solution équilibrée qui préserve les fonds et maximise les bénéfices.
Bien que certaines stratégies présentent des risques en termes de sensibilité aux paramètres et de retard de stop-loss, ces risques peuvent être efficacement maîtrisés par des orientations d’optimisation recommandées, en particulier la confirmation d’un système de paramètres adaptatif et d’un cadre temporel multiple. L’introduction ultérieure d’apprentissage automatique et d’analyse des indicateurs émotionnels devrait améliorer considérablement la robustesse et le potentiel de rendement à long terme des stratégies.
Pour les traders quantifiés, cette stratégie fournit un cadre solide qui peut être adapté et élargi de manière flexible en fonction des préférences de risque personnelles et des perspectives du marché, un système de négociation à la fois théorique et pratique.
/*backtest
start: 2024-07-08 00:00:00
end: 2025-07-04 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy('YTPBTC1HATRSSADX',
overlay=true,
initial_capital=10000,
commission_value=0.1,
default_qty_value=100,
default_qty_type=strategy.percent_of_equity,
margin_long=10,
margin_short=10,
pyramiding=1)
// ==================== 输入参数 ====================
atr_length = input.int(48, 'ATR周期', minval=1, step=12)
atr_mult_1 = input.float(1.0, 'ATR初始止损乘数', minval=0.1, step=0.1)
atr_mult_2 = input.float(9.0, 'ATR追踪止损乘数', minval=0.1)
// 追踪激活倍数
profit_atr_mult = input.float(3.0, 'ATR追踪激活倍数', minval=0.5, step=0.5)
// 固定回撤止盈设置
long_pullback_atr = input.float(13, '多头回撤止盈倍数', minval=0, step=1)
short_pullback_atr = input.float(4, '空头回撤止盈倍数', minval=0, step=1)
breakout_period = input.int(96, title='突破周期', minval=1, step=24)
rma_length = input.int(500, 'RMA趋势过滤周期', minval=1, step=96)
// ADX设置
enable_adx_filter = input.bool(true, '启用ADX过滤')
adx_length = atr_length//input.int(48, 'ADX周期', minval=1, step=12)
adx_threshold = input.float(12, "ADX阈值", minval=1)
use_breakeven = true // 启动追踪时是否先保本止损
// ==================== ATR计算 ====================
atr_value = ta.atr(atr_length)
// ==================== ADX指标计算 ====================
// 真实波幅计算
tr = math.max(math.max(high - low, math.abs(high - nz(close[1]))),
math.abs(low - nz(close[1])))
// 方向性移动计算
dm_plus = high - nz(high[1]) > nz(low[1]) - low ? math.max(high - nz(high[1]), 0) : 0
dm_minus = nz(low[1]) - low > high - nz(high[1]) ? math.max(nz(low[1]) - low, 0) : 0
// ADX计算
var float sm_tr = na
var float sm_dm_plus = na
var float sm_dm_minus = na
sm_tr := nz(sm_tr[1]) - nz(sm_tr[1]) / adx_length + tr
sm_dm_plus := nz(sm_dm_plus[1]) - nz(sm_dm_plus[1]) / adx_length + dm_plus
sm_dm_minus := nz(sm_dm_minus[1]) - nz(sm_dm_minus[1]) / adx_length + dm_minus
di_plus = sm_dm_plus / sm_tr * 100
di_minus = sm_dm_minus / sm_tr * 100
dx = math.abs(di_plus - di_minus) / (di_plus + di_minus) * 100
adx = ta.sma(dx, adx_length)
// ==================== 趋势过滤 ====================
rma_trend = ta.rma(close, rma_length)
plot(rma_trend, title='RMA趋势线', color=color.black, linewidth=2)
trend_long = close > rma_trend
trend_short = close < rma_trend
// ==================== 突破信号 ====================
// 获取过去N根K线的最高高点和最低低点(避免未来数据)
highest_high = ta.highest(high, breakout_period)[1]
lowest_low = ta.lowest(low, breakout_period)[1]
// 入场条件 - 修改ADX条件,要求ADX上升
adx_condition = not enable_adx_filter or (adx >= adx_threshold and adx > adx[1])
long_condition = close > highest_high and trend_long and strategy.position_size == 0 and adx_condition
short_condition = close < lowest_low and trend_short and strategy.position_size == 0 and adx_condition
// ==================== 入场执行 ====================
if long_condition
strategy.entry('Long', strategy.long)
if short_condition
strategy.entry('Short', strategy.short)
// ==================== ATR止损系统 ====================
// 止损状态变量
var float long_stop_initial = na // 第一段初始止损
var float long_stop_trail = na // 第二段追踪止损
var bool long_trail_active = false
var float short_stop_initial = na // 第一段初始止损
var float short_stop_trail = na // 第二段追踪止损
var bool short_trail_active = false
// 回撤止盈变量
var float long_highest = na // 多头最高价记录
var float short_lowest = na // 空头最低价记录
// ==================== 多头止损计算 ====================
if strategy.position_size > 0
// 新开多头仓位
if strategy.position_size[1] <= 0
long_stop_initial := strategy.position_avg_price - atr_value * atr_mult_1
long_stop_trail := na
long_trail_active := false
long_highest := na // 重置最高价记录
else
// 计算当前浮动盈亏
float current_profit = close - strategy.position_avg_price
// 检查是否激活追踪止损
if not long_trail_active and current_profit >= atr_value * profit_atr_mult
long_trail_active := true
long_highest := high // 开始记录最高价
// 保本处理
if use_breakeven
long_stop_trail := strategy.position_avg_price
else
long_stop_trail := close - atr_value * atr_mult_2
// 更新追踪止损和最高价记录
if long_trail_active
// 更新最高价记录
long_highest := math.max(long_highest, high)
// 传统追踪止损更新
float new_stop = close - atr_value * atr_mult_2
long_stop_trail := math.max(long_stop_trail, new_stop)
// ==================== 空头止损计算 ====================
if strategy.position_size < 0
// 新开空头仓位
if strategy.position_size[1] >= 0
short_stop_initial := strategy.position_avg_price + atr_value * atr_mult_1
short_stop_trail := na
short_trail_active := false
short_lowest := na // 重置最低价记录
else
// 计算当前浮动盈亏
float current_profit = strategy.position_avg_price - close
// 检查是否激活追踪止损
if not short_trail_active and current_profit >= atr_value * profit_atr_mult
short_trail_active := true
short_lowest := low // 开始记录最低价
// 保本处理
if use_breakeven
short_stop_trail := strategy.position_avg_price
else
short_stop_trail := close + atr_value * atr_mult_2
// 更新追踪止损和最低价记录
if short_trail_active
// 更新最低价记录
short_lowest := math.min(short_lowest, low)
// 传统追踪止损更新
float new_stop = close + atr_value * atr_mult_2
short_stop_trail := math.min(short_stop_trail, new_stop)
// ==================== 止损执行 ====================
// 第一段止损:收盘价止损(未激活追踪时)
if strategy.position_size > 0 and not long_trail_active
// 检查收盘价是否触及初始止损线
if close <= long_stop_initial
strategy.close('Long', comment='初始止损')
if strategy.position_size < 0 and not short_trail_active
// 检查收盘价是否触及初始止损线
if close >= short_stop_initial
strategy.close('Short', comment='初始止损')
// 第二段止损:实时止损(激活追踪后)
if strategy.position_size > 0 and long_trail_active
strategy.exit('Long Trail Stop', from_entry='Long', stop=long_stop_trail)
if strategy.position_size < 0 and short_trail_active
strategy.exit('Short Trail Stop', from_entry='Short', stop=short_stop_trail)
// 动态回撤止盈检查
if strategy.position_size > 0 and long_trail_active and not na(long_highest)
// 计算从最高点回撤幅度
pullback_amount = long_highest - close
pullback_threshold = atr_value * long_pullback_atr
if pullback_amount >= pullback_threshold
strategy.close('Long', comment='回撤止盈')
if strategy.position_size < 0 and short_trail_active and not na(short_lowest)
// 计算从最低点反弹幅度
pullback_amount = close - short_lowest
pullback_threshold = atr_value * short_pullback_atr
if pullback_amount >= pullback_threshold
strategy.close('Short', comment='回撤止盈')
// ==================== 变量重置 ====================
if strategy.position_size[1] != 0 and strategy.position_size == 0
long_stop_initial := na
long_stop_trail := na
long_trail_active := false
short_stop_initial := na
short_stop_trail := na
short_trail_active := false
// 重置回撤止盈变量
long_highest := na
short_lowest := na
// ==================== 图表绘制 ====================
plot(strategy.position_avg_price, color=color.new(color.yellow, 44), title="入场均价", linewidth=1)
plot(long_stop_initial, color=color.new(color.blue, 44), title='多头初始止损线', linewidth=1)
plot(short_stop_initial, color=color.new(color.blue, 44), title='空头初始止损线', linewidth=1)
plot(long_stop_trail, color=color.new(color.fuchsia, 44), title='多头追踪止损线', linewidth=1)
plot(short_stop_trail, color=color.new(color.fuchsia, 44), title='空头追踪止损线', linewidth=1)
// 最高/最低价记录线
plot(long_highest, color=color.new(color.green, 70), title='多头最高价', linewidth=1, style=plot.style_stepline)
plot(short_lowest, color=color.new(color.red, 70), title='空头最低价', linewidth=1, style=plot.style_stepline)
// 绘制突破线
plot(highest_high, color=color.new(color.green, 70), title='突破上线')
plot(lowest_low, color=color.new(color.red, 70), title='突破下线')
// 背景颜色显示趋势
bgcolor(trend_long ? color.new(color.green, 95) : trend_short ? color.new(color.red, 95) : na, title="趋势背景")
// ==================== 信息显示 ====================
// 在图表上显示当前策略信息
base_rows = enable_adx_filter ? 3 : 2
var table info_table = table.new(position.top_right, 2, base_rows, bgcolor=color.white, border_width=1)
var int row_index = 0
row_index := 0 // 重置行索引
table.cell(info_table, 0, row_index, "ATR周期", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(atr_length), text_color=color.black, text_size=size.small)
row_index := row_index + 1
// 只在启用ADX时显示
if enable_adx_filter
table.cell(info_table, 0, row_index, "ADX", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(math.round(adx, 1)), text_color=color.black, text_size=size.small)
row_index := row_index + 1
table.cell(info_table, 0, row_index, "追踪倍数", text_color=color.black, text_size=size.small)
table.cell(info_table, 1, row_index, str.tostring(profit_atr_mult), text_color=color.black, text_size=size.small)