Stratégie de suivi des tendances croisées à moyennes mobiles multiples et de filtrage de la volatilité

MA EMA SMA WMA VWMA SMMA RMA
Date de création: 2024-07-29 13:37:09 Dernière modification: 2024-07-29 13:37:09
Copier: 0 Nombre de clics: 636
1
Suivre
1617
Abonnés

Stratégie de suivi des tendances croisées à moyennes mobiles multiples et de filtrage de la volatilité

Aperçu

La stratégie est un système de trading de suivi de tendance basé sur plusieurs croisements de moyennes mobiles et filtres de volatilité. Elle utilise trois moyennes mobiles de différentes périodes pour identifier les tendances du marché et utilise une quatrième moyenne mobile comme référence pour les jugements de bull et de bear. La stratégie introduit également des indicateurs de volatilité comme condition de filtrage des transactions afin d’éviter de négocier dans des environnements à faible volatilité.

Principe de stratégie

  1. Sélection des moyennes mobiles: la stratégie utilise les trois principales moyennes mobiles (à court, moyen et long terme) pour juger de la tendance. L’utilisateur peut choisir parmi six moyennes mobiles prédéfinies, chacune pouvant être configurée séparément avec des paramètres, y compris la période de calcul, la source de données et le type (comme SMA, EMA, etc.).

  2. Les tendances sont les suivantes:

    • Tendance à plusieurs têtes: lorsque la moyenne à court terme est supérieure à la moyenne à long terme et que la moyenne à moyen terme traverse la moyenne à long terme vers le haut.
    • Tendance à la hausse: lorsque la moyenne à court terme est inférieure à la moyenne à long terme et que la moyenne à moyen terme traverse la moyenne à long terme vers le bas.
  3. Le jugement de bull/bear: on peut choisir d’utiliser la quatrième moyenne mobile comme ligne de démarcation du bull/bear. On ne peut faire plus que lorsque le prix est au-dessus de cette ligne; à l’inverse, on ne peut faire moins que lorsque le prix est au-dessus.

  4. Filtrage de la volatilité: utilisation d’un indicateur de volatilité basé sur les prix les plus élevés et les plus bas. La stratégie envoie un signal de transaction uniquement lorsque la volatilité dépasse le seuil défini par l’utilisateur.

  5. Logistique d’entrée:

    • Entrée multiple: pour ouvrir une position en position multiple, les conditions de volatilité sont remplies et le prix est supérieur à la moyenne à long terme.
    • Entrée à vide: ouvrir une position à vide lorsque la tendance à vide est confirmée, les conditions de volatilité sont remplies et le prix est inférieur à la moyenne à long terme.
  6. La logique de sortie:

    • Placement partiel: Lorsque la tendance est inversée (la moyenne intermédiaire et la moyenne à long terme se croisent à nouveau), une partie de la position est levée.
    • Toutes les positions à plat: Lorsque le prix traverse la ligne de délimitation du bull/bear, il est nécessaire de faire le plein de toutes les positions en sens inverse.
  7. Stop loss: utilisation d’un stop loss à pourcentage fixe, avec un ratio de stop loss personnalisable par l’utilisateur.

  8. Gestion des positions: pour chaque ouverture de position, un pourcentage fixe des droits et intérêts du compte peut être personnalisé.

Avantages stratégiques

  1. L’analyse multidimensionnelle des tendances: grâce à l’utilisation de plusieurs moyennes mobiles, la stratégie est capable de capturer plus complètement les tendances du marché et de réduire les faux signaux.

  2. Configuration flexible des paramètres: les utilisateurs peuvent adapter les paramètres, y compris le type de ligne moyenne, la période et la source de données, en fonction des caractéristiques des différents marchés et types de transactions.

  3. Filtrage des fluctuations: En introduisant des indicateurs de fluctuations, la stratégie permet d’éviter les transactions dans des environnements à faible volatilité et d’améliorer la qualité du signal.

  4. Adaptation au marché haussier et baissier: les mécanismes de jugement au marché haussier et baissier en option permettent aux stratégies de mieux s’adapter aux différents environnements de marché et de réduire les échanges défavorables.

  5. Gestion dynamique des positions: une méthode de gestion des positions basée sur les intérêts des comptes qui permet d’ajuster automatiquement la taille des transactions en fonction de la taille des comptes.

  6. Contrôle des risques à plusieurs niveaux: plusieurs mécanismes de contrôle des risques, tels que le filtrage de la volatilité, la confirmation de la tendance, la clôture partielle et le stop-loss fixe.

  7. Le trading bidirectionnel: il permet de faire des prises et des prises, et de trouver des opportunités de trading dans différents environnements de marché.

  8. Aide visuelle: la stratégie trace les étiquettes des moyennes mobiles et des signaux de négociation sur le graphique pour faciliter l’analyse et le retour visuel.

Risque stratégique

  1. L’arriéré: La moyenne mobile est essentiellement un indicateur de retard, ce qui peut entraîner un léger retard dans les heures d’entrée et de sortie, ce qui affecte la rentabilité.

  2. Les marchés de choc ne fonctionnent pas bien: dans les marchés de choc horizontaux, les stratégies peuvent souvent générer de faux signaux, entraînant des transactions excessives et des pertes.

  3. Sensibilité aux paramètres: la performance d’une stratégie est fortement dépendante de la configuration des paramètres, et différents marchés et périodes de temps peuvent exiger des combinaisons de paramètres différentes.

  4. Risque de retrait: la stratégie risque de ne pas être pleinement utilisée à temps, ce qui entraînerait un retrait plus important si la tendance était inversée.

  5. Une trop grande dépendance à l’égard des indicateurs techniques: les stratégies sont entièrement basées sur des indicateurs techniques et ignorent les facteurs fondamentaux, ce qui peut entraîner une mauvaise performance lors d’événements ou de nouvelles importantes.

  6. Risque de gestion des fonds: la méthode de gestion des positions à taux fixe peut entraîner une ouverture de risque excessive en cas de pertes consécutives.

  7. Réglages de stop loss: le stop loss à pourcentage fixe peut ne pas s’appliquer à tous les environnements de marché et peut entraîner un stop loss prématuré en période de forte volatilité.

Orientation de l’optimisation de la stratégie

  1. Paramètres d’adaptation: un mécanisme d’adaptation est introduit pour ajuster les paramètres des moyennes mobiles et les seuils de volatilité en fonction de la dynamique du marché.

  2. L’analyse de plusieurs périodes: une combinaison d’informations sur des périodes plus longues et plus courtes permet d’améliorer la précision des jugements de tendances.

  3. Optimisation des indicateurs de volatilité: envisagez d’utiliser des indicateurs de volatilité plus complexes tels que l’ATR ou la bande passante de Bollinger pour évaluer plus précisément la situation du marché.

  4. L’introduction d’indicateurs de dynamique: en combinaison avec des indicateurs de dynamique tels que le RSI ou le MACD, optimiser les temps d’entrée et de sortie.

  5. Amélioration du mécanisme de stop loss: mise en place d’un stop loss suivi ou d’un stop loss dynamique basé sur l’ATR pour mieux s’adapter aux fluctuations du marché.

  6. Intégration des indicateurs de l’humeur du marché: introduction d’indicateurs de l’humeur du marché tels que VIX, stratégies d’optimisation de la performance dans différents environnements de marché.

  7. Optimisation de la gestion des positions: réalisation d’une gestion dynamique des positions basée sur la volatilité ou les pertes actuelles, afin de mieux contrôler les risques.

  8. Ajouter un filtre de base: prendre en compte les facteurs de base tels que la publication de données économiques importantes ou les résultats financiers d’une entreprise et éviter de négocier pendant les périodes à haut risque.

  9. Optimisation de l’apprentissage automatique: optimisation des combinaisons de paramètres et des règles de décision à l’aide d’algorithmes d’apprentissage automatique pour améliorer l’adaptabilité des stratégies.

  10. Retour et test avant: un retour plus complet et des tests avant sur différents marchés et périodes afin de vérifier la solidité de la stratégie.

Résumer

La stratégie de suivi de tendance croisée multi-homogène et de filtrage des taux d’oscillation est un système de négociation complet et flexible qui combine plusieurs moyennes mobiles, indicateurs de taux d’oscillation et principes de suivi des tendances. Grâce à une analyse de tendance multidimensionnelle et à un contrôle rigoureux des risques, la stratégie a le potentiel de capturer des tendances persistantes dans divers environnements de marché. Cependant, les utilisateurs doivent prêter attention aux problèmes d’optimisation des paramètres et d’adaptabilité du marché et envisager d’introduire des indicateurs techniques plus avancés et des techniques de gestion des risques pour améliorer encore la performance de la stratégie.

Code source de la stratégie
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)