La stratégie est un système de suivi des tendances basé sur le croisement de multiples moyennes mobiles et le filtrage de la volatilité. Elle utilise trois moyennes mobiles de cycles différents pour identifier les tendances du marché et utilise la quatrième moyenne mobile comme référence pour juger des marchés haussiers. La stratégie introduit également des indicateurs de volatilité comme conditions de filtrage des transactions afin d'éviter de négocier dans un environnement à faible volatilité.
Sélection des moyennes mobiles: la stratégie utilise trois moyennes mobiles principales (courte, moyenne et longue durée) pour déterminer la tendance. Les utilisateurs peuvent choisir parmi six moyennes mobiles prédéfinies, dont chaque moyenne mobile peut être configurée séparément avec des paramètres, y compris le cycle de calcul, la source de données et le type (par exemple, SMA, EMA, etc.).
Les tendances sont:
Les décisions des marchés bœufs: il est possible d'utiliser la quatrième moyenne mobile comme ligne de démarcation des marchés bœufs. Lorsque le prix est au-dessus de cette ligne, il est seulement permis de faire plus; au contraire, il est seulement permis de faire moins.
Filtrage de la volatilité: l'utilisation d'un indicateur de volatilité basé sur les prix les plus élevés et les prix les plus bas. La stratégie ne signale des transactions que lorsque la volatilité dépasse le seuil défini par l'utilisateur.
Logique d'entrée:
Logique de sortie:
Stop-loss: l'utilisateur peut personnaliser le taux de stop-loss en utilisant des pourcentages fixes.
Gestion des positions: un pourcentage fixe des intérêts utilisés par les utilisateurs à chaque fois qu'ils ouvrent une position.
Analyse des tendances multidimensionnelles: En utilisant plusieurs moyennes mobiles, la stratégie permet de capturer plus complètement les tendances du marché et de réduire les faux signaux.
Configuration de paramètres flexible: les utilisateurs peuvent adapter leurs paramètres, y compris le type uniforme, la période et la source de données, en fonction des caractéristiques des différents marchés et variétés de transactions.
Filtrage de la volatilité: la stratégie permet d'éviter de négocier dans un environnement à faible volatilité et d'améliorer la qualité du signal en introduisant des indicateurs de volatilité.
Adaptation du marché bœuf-beurre: les mécanismes de jugement optionnels du marché bœuf-beurre permettent aux stratégies de mieux s'adapter aux différents environnements du marché et de réduire les transactions contraires.
Gestion dynamique des positions: une méthode de gestion des positions basée sur les droits d'acquisition d'un compte qui permet d'ajuster automatiquement la taille des transactions en fonction des changements de taille du compte.
Contrôle des risques à plusieurs niveaux: il existe plusieurs mécanismes de contrôle des risques, tels que le filtrage des fluctuations, la confirmation des tendances, la levée partielle et les arrêts fixes.
Traitements bidirectionnels: soutien au plus-plus et au plus-faible, capacité à rechercher des opportunités dans divers environnements de marché.
Aide à la visualisation: la stratégie trace sur le graphique les différentes moyennes mobiles et les étiquettes de signaux de trading pour une analyse et une réévaluation intuitives.
La latence: les moyennes mobiles sont des indicateurs en retard par nature, ce qui peut entraîner un léger retard dans les temps d'entrée et de sortie, ce qui affecte la rentabilité.
Les marchés turbulents ne fonctionnent pas bien: dans les marchés turbulents, les stratégies peuvent souvent produire de faux signaux, entraînant une survente et des pertes.
Sensibilité aux paramètres: la performance des stratégies dépend fortement du paramètre de configuration, et différentes combinaisons de paramètres peuvent être nécessaires dans différents marchés et délais.
Risque de retrait: les stratégies peuvent ne pas être pleinement mises en œuvre en temps opportun lors d'un retournement de tendance, ce qui entraîne un retrait plus important.
Extrême dépendance à l'égard des indicateurs techniques: les stratégies basées uniquement sur des indicateurs techniques, qui ignorent les facteurs fondamentaux, peuvent mal fonctionner lors d'une nouvelle ou d'un événement majeur.
Risque de gestion des fonds: une méthode de gestion des positions à taux fixe peut entraîner un risque trop élevé en cas de pertes consécutives.
Les paramètres de stop-loss: les stop-loss à pourcentage fixe peuvent ne pas s'appliquer à tous les environnements du marché et peuvent entraîner un stop-loss prématuré en période de forte volatilité.
Paramètres d'adaptation: Introduction de mécanismes d'adaptation pour ajuster dynamiquement les paramètres de la moyenne mobile et les seuils de volatilité en fonction des conditions du marché.
L'analyse multi-temps: combiner des informations sur des périodes plus longues et plus courtes pour améliorer l'exactitude des jugements de tendance.
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 les conditions du marché.
Introduction d'indicateurs de dynamisme: combiné avec des indicateurs de dynamisme tels que RSI ou MACD, optimiser les temps d'entrée et de sortie.
Amélioration du mécanisme de stop-loss: réalisation d'un stop-loss de suivi ou d'un stop-loss dynamique basé sur l'ATR pour mieux s'adapter aux fluctuations du marché.
Intégration des indicateurs d'émotion du marché: l'introduction d'indicateurs d'émotion du marché tels que VIX, optimisation des stratégies dans différents environnements du marché.
Optimiser la gestion des positions: optimiser la gestion des positions dynamiques basées sur la volatilité ou les gains et les pertes actuels pour mieux contrôler les risques.
Ajoutez un filtre de base: considérez les facteurs de base tels que la publication de données économiques importantes ou les résultats de l'entreprise, et évitez de négocier pendant les périodes à haut risque.
Optimisation de l'apprentissage automatique: l'utilisation d'algorithmes d'apprentissage automatique pour optimiser les combinaisons de paramètres et les règles de décision afin d'améliorer l'adaptabilité des stratégies.
Retrospective et test avant-coureur: un retrospectif plus complet et des tests avant-coureur dans différents marchés et périodes pour vérifier la robustesse de la stratégie.
La stratégie de suivi des tendances et de filtrage des fluctuations multilignes est un système de trading complet et flexible qui combine plusieurs moyennes mobiles, indicateurs de volatilité et principes de suivi des tendances. Grâce à une analyse multidimensionnelle des tendances et à un contrôle strict des risques, la stratégie a le potentiel de capturer les tendances persistantes dans une variété d'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 les performances 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)