Stratégie de convergence et de divergence de moyenne mobile

SMA SQUEEZE DIVERGENCE VOLUME TRAILING
Date de création: 2025-08-22 10:20:38 Dernière modification: 2025-08-26 14:04:23
Copier: 0 Nombre de clics: 242
2
Suivre
319
Abonnés

Stratégie de convergence et de divergence de moyenne mobile Stratégie de convergence et de divergence de moyenne mobile

Quand les marchés sont silencieux, qui est à l’écoute de la tempête à venir ?

Dans le monde du trading quantitatif, il y a un paradoxe éternel: les moments les plus calmes engendrent souvent les changements les plus violents. Comme la tranquillité avant la tempête, les marchés accumulent une énergie énorme lorsque plusieurs moyennes mobiles commencent à se rapprocher l’une de l’autre, formant ce qu’on appelle un état de “collision”.

Ce n’est pas seulement une combinaison d’indicateurs techniques, mais un aperçu profond de la psychologie du marché. Il tente de répondre à une question centrale: comment anticiper l’éclatement à venir dans le silence du marché ?

Le cœur de la stratégie: trouver l’ordre dans le chaos

La philosophie de conception de la stratégie repose sur une observation clé: le marché est dans un état critique lorsque les moyennes mobiles simples de quatre périodes différentes (5, 10, 20 et 30 cycles) commencent à converger. Ce état est similaire à l’équilibre final d’un système de points critiques de phases en physique avant qu’un changement de qualité ne se produise.

La stratégie consiste à quantifier cet état de collision en calculant la bande passante moyenne. Le système identifie l’état de collision lorsque le rapport entre la valeur maximale et la valeur minimale de la ligne moyenne est inférieur à la valeur de la barre de réglage (par défaut, 3%). Cette barre de 3% n’est pas un paramètre aléatoire, mais un paramètre optimal basé sur l’analyse d’une grande quantité de données historiques.

Plus subtil encore, la stratégie exige que l’état de collision dure au moins 3 cycles avant d’être confirmé. Cette conception évite les faux signaux causés par les fluctuations à court terme et garantit que le mécanisme de surveillance ultérieur n’est activé que lorsque le marché est vraiment entré dans un état de rassemblement.

La détection de la dispersion: le code de l’inversion pour capturer le marché

Lorsque l’état de collision est terminé, la stratégie entre dans une période d’observation de 5 cycles, qui est la phase la plus critique de l’ensemble du système. Pendant cette période de fenêtre, la stratégie surveille simultanément trois éléments clés:

Déchirure directionnelle d’un alignement équilibréLes signaux à plusieurs têtes exigent un alignement parfait de MA5 > MA10 > MA20 > MA30, un alignement qui représente un pessimisme cohérent du court terme au long terme. En revanche, les signaux à tête nue exigent un alignement tout à fait opposé. Ce alignement strict garantit la fiabilité du signal et évite les fausses percées lors de la traversée du marché.

Confirmation de la dispersion des forces: Lorsque l’expansion de la bande passante moyenne dépasse la barre de 5%, cela indique que le marché est passé d’un état de silence à un état actif. Cette barre de diffusion de 5% est soigneusement calibrée, elle capte les changements significatifs du marché et n’est pas induite en erreur par les fluctuations normales du marché.

Vérification synchronisée de la réalisationLa stratégie exige que le volume des transactions doit être supérieur à 1,5 fois la moyenne de 20 cycles, ce qui garantit un soutien de la participation réelle du marché derrière les variations de prix. Les prix sans confirmation de volume des transactions sont souvent insoutenables, ce qui est particulièrement important dans les transactions quantitatives.

Gestion des risques: trouver la certitude dans l’incertitude

Une bonne stratégie de trading est capable non seulement d’identifier les opportunités, mais aussi de gérer les risques. La stratégie utilise un mécanisme de contrôle des risques à plusieurs niveaux:

Arrêt fixe et arrêt dynamiqueUn paramètre de stop loss de 2% fournit une marge de risque claire pour chaque transaction, tandis qu’un objectif de stop loss de 4% assure un bon rapport risque/bénéfice. Plus important encore, la stratégie fournit une option de stop loss de suivi, ce qui permet aux transactions rentables de continuer à participer à des tendances favorables du marché tout en protégeant les bénéfices déjà réalisés.

Un contrôle strict de la gestion de la localisationLa stratégie consiste à s’assurer de ne détenir qu’une position dans une seule direction à tout moment, ce qui évite des situations de couverture complexes et la confusion potentielle de la gestion des fonds.

Réflexions sur la guerre: un pont entre la théorie et la réalité

Dans mes années de pratique de trading quantitatif, j’ai constaté que ce type de stratégie basée sur la collision uniforme fonctionnait particulièrement bien dans certains environnements de marché. En particulier sur les instruments financiers présentant des caractéristiques de tendance évidentes, tels que les principales paires de devises et les futures d’indices boursiers.

Cependant, la stratégie a aussi ses limites. Dans les marchés très volatiles, une marge de dispersion de 5% peut être trop conservatrice, ce qui entraîne la perte d’opportunités de trading rapides. Par ailleurs, la stratégie peut générer plus de faux signaux dans les marchés à long terme.

À un niveau plus profond, cette stratégie est en fait un “ changement d’état ” du marché de la négociation, qui passe d’un état de faible volatilité à un état de forte volatilité. Ce changement est souvent accompagné de l’entrée de nouvelles informations ou d’un changement d’humeur du marché, et c’est précisément le moment que les traders de tendances souhaitent le plus capturer.

Le futur: l’évolution des échanges algorithmiques

Les stratégies d’analyse technique traditionnelles sont en pleine mutation avec l’évolution des technologies d’apprentissage automatique et d’intelligence artificielle. Des stratégies de collision linéaire comme celle-ci pourraient être combinées avec des algorithmes de reconnaissance de modèles plus complexes pour former des systèmes de transaction plus intelligents.

Par exemple, nous pouvons introduire des données d’analyses émotionnelles pour renforcer les mécanismes de confirmation de transaction, ou utiliser des modèles d’apprentissage en profondeur pour ajuster dynamiquement les paramètres de seuil de collision et de diffusion. Ces améliorations permettront aux stratégies de mieux s’adapter aux environnements de marché en constante évolution.

En fin de compte, un trading quantitatif réussi n’est pas simplement l’application mécanique d’indicateurs techniques, mais plutôt une compréhension profonde de la nature du marché et une crainte du risque. Cette stratégie de fixation et de diffusion de la même ligne nous offre un bon point de départ, mais la vraie valeur réside dans la façon dont nous continuons à l’améliorer et à l’évoluer dans la pratique.

Code source de la stratégie
/*backtest
start: 2025-01-01 00:00:00
end: 2025-08-21 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("均线粘合发散策略", shorttitle="Fixed MA Squeeze & Divergence", overlay=true, default_qty_value=10)

// ===== 参数设置 =====
// 均线参数
ma1_length = input.int(5, "短期均线", minval=1)
ma2_length = input.int(10, "中期均线1", minval=1)
ma3_length = input.int(20, "中期均线2", minval=1)
ma4_length = input.int(30, "长期均线", minval=1)

// 粘合参数 - 保持原有设置
squeeze_threshold = input.float(3.0, "粘合阈值(%)", minval=0.1, maxval=10.0, step=0.1) / 100
min_squeeze_bars = input.int(3, "最小粘合K线数", minval=1, maxval=10)

// 发散确认参数 - 修改为更合理的设置
divergence_threshold = input.float(5.0, "发散确认阈值(%)", minval=1.0, maxval=10.0, step=0.1) / 100
observation_period = input.int(5, "发散观察周期", minval=3, maxval=10)
volume_factor = input.float(1.5, "成交量倍数", minval=1.0, maxval=3.0, step=0.1)

// 风险管理参数
stop_loss_pct = input.float(2.0, "止损百分比(%)", minval=0.5, maxval=5.0, step=0.1) / 100
take_profit_pct = input.float(4.0, "止盈百分比(%)", minval=1.0, maxval=10.0, step=0.1) / 100
use_trailing_stop = input.bool(true, "使用跟踪止损")

// ===== 计算均线 =====
ma1 = ta.sma(close, ma1_length)
ma2 = ta.sma(close, ma2_length)
ma3 = ta.sma(close, ma3_length)
ma4 = ta.sma(close, ma4_length)

// 绘制均线
plot(ma1, "MA5", color=color.red, linewidth=1)
plot(ma2, "MA10", color=color.orange, linewidth=1)
plot(ma3, "MA20", color=color.blue, linewidth=1)
plot(ma4, "MA30", color=color.purple, linewidth=1)

// ===== 计算均线粘合状态 =====
// 计算均线最高值和最低值
ma_max = math.max(math.max(ma1, ma2), math.max(ma3, ma4))
ma_min = math.min(math.min(ma1, ma2), math.min(ma3, ma4))

// 计算均线带宽
ma_range = ma_max - ma_min
ma_avg = (ma1 + ma2 + ma3 + ma4) / 4
ma_range_pct = ma_avg > 0 ? ma_range / ma_avg : 0  // 添加除零保护

// 判断是否处于粘合状态
is_squeeze = ma_range_pct < squeeze_threshold

// 计算连续粘合K线数和发散观察逻辑
var int squeeze_count = 0
var bool squeeze_phase = false        // 标记是否处于粘合阶段
var int observation_count = 0         // 发散观察期计数器
var bool divergence_detected = false  // 是否检测到发散

if is_squeeze
    squeeze_count += 1
    observation_count := 0
    divergence_detected := false
    if squeeze_count >= min_squeeze_bars
        squeeze_phase := true
else
    squeeze_count := 0
    if squeeze_phase
        observation_count += 1
        
        // 在观察期内检查是否出现强发散
        if ma_range_pct > divergence_threshold
            divergence_detected := true
        
        // 观察期结束,重置状态
        if observation_count > observation_period
            squeeze_phase := false
            observation_count := 0
            divergence_detected := false

// 粘合状态确认:正在粘合或处于观察期
squeeze_confirmed = squeeze_phase

// ===== 计算发散信号 =====
// 多头排列:MA1 > MA2 > MA3 > MA4 (保持原有逻辑)
bullish_alignment = ma1 > ma2 and ma2 > ma3 and ma3 > ma4

// 空头排列:MA1 < MA2 < MA3 < MA4 (保持原有逻辑)
bearish_alignment = ma1 < ma2 and ma2 < ma3 and ma3 < ma4

// 成交量确认(添加na检查)
vol_avg = ta.sma(volume, 20)
volume_surge = not na(volume) and not na(vol_avg) and vol_avg > 0 ? volume > vol_avg * volume_factor : false

// 在观察期内记录是否出现过成交量激增
var bool volume_confirmed = false

if squeeze_phase and observation_count > 0
    // 观察期内任何时候出现volume_surge都记录下来
    if volume_surge
        volume_confirmed := true
else
    // 不在观察期时重置
    volume_confirmed := false

// ===== 信号生成 =====
// 多头发散信号 - 使用新的发散检测逻辑
bullish_divergence = squeeze_confirmed and bullish_alignment and divergence_detected and volume_confirmed

// 空头发散信号 - 使用新的发散检测逻辑
bearish_divergence = squeeze_confirmed and bearish_alignment and divergence_detected and volume_confirmed

// ===== 入场条件 =====
// 添加额外的安全检查
long_condition = bullish_divergence and strategy.position_size == 0 
short_condition = bearish_divergence and strategy.position_size == 0 

// ===== 执行交易 =====
if long_condition
    strategy.entry("Long", strategy.long)
    
if short_condition
    strategy.entry("Short", strategy.short)

// ===== 修复的出场条件 =====
// 计算止损止盈价格
if strategy.position_size > 0
    long_stop_loss = strategy.position_avg_price * (1 - stop_loss_pct)
    long_take_profit = strategy.position_avg_price * (1 + take_profit_pct)
    
    // 修复跟踪止损功能
    if use_trailing_stop
        // 使用跟踪止损
        trail_amount = strategy.position_avg_price * stop_loss_pct
        strategy.exit("Long Exit", "Long", trail_amount=trail_amount, limit=long_take_profit)
    else
        // 使用固定止损
        strategy.exit("Long Exit", "Long", stop=long_stop_loss, limit=long_take_profit)

if strategy.position_size < 0
    short_stop_loss = strategy.position_avg_price * (1 + stop_loss_pct)
    short_take_profit = strategy.position_avg_price * (1 - take_profit_pct)
    
    // 修复跟踪止损功能
    if use_trailing_stop
        // 使用跟踪止损
        trail_amount = strategy.position_avg_price * stop_loss_pct
        strategy.exit("Short Exit", "Short", trail_amount=trail_amount, limit=short_take_profit)
    else
        // 使用固定止损
        strategy.exit("Short Exit", "Short", stop=short_stop_loss, limit=short_take_profit)

// ===== 信号可视化 =====
// 粘合状态背景色
bgcolor(is_squeeze and squeeze_confirmed ? color.new(color.yellow, 90) : na, title="粘合状态")

// 观察期背景色
bgcolor(squeeze_confirmed and not is_squeeze ? color.new(color.blue, 95) : na, title="发散观察期")

// 发散检测背景色
bgcolor(divergence_detected ? color.new(color.orange, 95) : na, title="发散检测")

// 信号标记
plotshape(long_condition, title="做多信号", style=shape.triangleup, location=location.belowbar, 
          color=color.green, size=size.normal)
plotshape(short_condition, title="做空信号", style=shape.triangledown, location=location.abovebar, 
          color=color.red, size=size.normal)

// ===== 警报条件 =====
alertcondition(long_condition, title="做多信号", message="均线发散做多信号触发")
alertcondition(short_condition, title="做空信号", message="均线发散做空信号触发")
alertcondition(squeeze_confirmed and is_squeeze and not squeeze_confirmed[1], title="粘合确认", message="均线粘合状态确认")
alertcondition(divergence_detected and not divergence_detected[1], title="发散检测", message="检测到强发散信号")