Cette stratégie est un système de négociation basé sur plusieurs croisements de moyennes mobiles et le filtrage de la 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 la détermination du marché taureau/ours.
Sélection des moyennes mobiles: La stratégie utilise trois moyennes mobiles principales (à court terme, à moyen terme et à long terme) pour déterminer les tendances.
Détermination de la tendance:
Détermination du marché taureau/ours: une quatrième moyenne mobile facultative peut être utilisée comme ligne de partage pour les marchés taureau et baissier.
Filtre de volatilité: Un indicateur de volatilité basé sur les prix les plus élevés et les plus bas est utilisé.
Logique d'entrée:
Logique de sortie:
Stop Loss: utilise un pourcentage fixe de stop loss, qui peut être personnalisé par l'utilisateur.
Gestion des positions: utilise un pourcentage fixe du capital du compte pour chaque transaction, qui peut être personnalisé par l'utilisateur.
Analyse de tendance multidimensionnelle: en utilisant plusieurs moyennes mobiles, la stratégie peut capturer les tendances du marché de manière plus complète, réduisant les faux signaux.
Configuration flexible des paramètres: les utilisateurs peuvent ajuster divers paramètres de manière flexible en fonction des caractéristiques des différents marchés et instruments de négociation, y compris le type de MA, la période et la source de données.
Filtrage de la volatilité: en incorporant un indicateur de volatilité, la stratégie permet d'éviter les transactions dans des environnements à faible volatilité, améliorant ainsi la qualité du signal.
Adaptation du marché haussier/baissier: le mécanisme facultatif de détermination du marché haussier/baissier permet à la stratégie de mieux s'adapter aux différents environnements de marché, réduisant ainsi les transactions contraires à la tendance.
Gestion dynamique des positions: la méthode de gestion des positions fondée sur les capitaux propres ajuste automatiquement la taille des transactions au fur et à mesure que la taille du compte change.
Contrôle des risques à plusieurs niveaux: comprend plusieurs mécanismes de contrôle des risques tels que le filtrage de la volatilité, la confirmation de la tendance, la clôture partielle des positions et le stop loss fixe.
Commerce bidirectionnel: Prend en charge à la fois les positions longues et courtes, permettant des opportunités de trading dans diverses conditions de marché.
Aides visuelles: La stratégie trace différentes moyennes mobiles et étiquettes de signaux commerciaux sur le graphique, facilitant l'analyse intuitive et le backtesting.
Nature retardée: Les moyennes mobiles sont des indicateurs intrinsèquement retardés, ce qui peut entraîner un léger retard dans les délais d'entrée et de sortie, ce qui affecte la rentabilité.
Faibles performances sur les marchés variés: dans les marchés chaotiques, la stratégie peut générer de fréquents faux signaux, entraînant des surtrades et des pertes.
Sensibilité aux paramètres: la performance de la stratégie dépend fortement des paramètres définis et différents marchés et délais peuvent exiger différentes combinaisons de paramètres.
Risque de retrait: lors d'inversions de tendance, il est possible que la stratégie n'élimine pas complètement les positions en temps opportun, ce qui pourrait entraîner des retraitements importants.
Surcroît de dépendance à l'égard des indicateurs techniques: la stratégie est entièrement basée sur des indicateurs techniques, en ignorant les facteurs fondamentaux, ce qui peut entraîner de mauvaises performances lors d'actualités ou d'événements majeurs.
Risque de gestion de trésorerie: la méthode de dimensionnement des positions à pourcentage fixe peut entraîner une exposition excessive au risque lors de pertes consécutives.
L'établissement d'un stop loss: le stop loss à pourcentage fixe peut ne pas convenir à tous les environnements de marché et pourrait entraîner des sorties prématurées pendant les périodes de forte volatilité.
Paramètres d'adaptation: mettre en place des mécanismes d'adaptation permettant d'ajuster dynamiquement les paramètres des moyennes mobiles et les seuils de volatilité en fonction des conditions du marché.
Analyse sur plusieurs délais: intégrer des informations provenant de délais plus longs et plus courts pour améliorer la précision de la détermination des tendances.
Optimisation des indicateurs de volatilité: envisager l'utilisation d'indicateurs de volatilité plus sophistiqués tels que l'ATR ou la bande passante de Bollinger pour une évaluation plus précise des conditions du marché.
Intégration d'indicateurs de dynamique: Combinez des indicateurs de dynamique comme le RSI ou le MACD pour optimiser le timing d'entrée et de sortie.
Mecanisme amélioré de stop-loss: mettre en œuvre des stops de trailing ou des stops dynamiques basés sur l'ATR afin de mieux s'adapter à la volatilité du marché.
Intégration du sentiment du marché: intégrer des indicateurs de sentiment du marché comme le VIX pour optimiser les performances de la stratégie dans différents environnements de marché.
Optimisation de la gestion des positions: mettre en œuvre une dimensionnement dynamique des positions basée sur la volatilité ou les bénéfices/pertes courants pour un meilleur contrôle des risques.
Ajout de filtres fondamentaux: tenir compte de facteurs fondamentaux tels que les communiqués de données économiques importants ou les rapports de résultats des entreprises pour éviter de négocier pendant les périodes à haut risque.
Optimisation de l'apprentissage automatique: Utiliser des algorithmes d'apprentissage automatique pour optimiser les combinaisons de paramètres et les règles de décision, améliorant ainsi l'adaptabilité de la stratégie.
Tests antérieurs et prospectifs: réaliser des tests antérieurs et prospectifs plus complets sur différents marchés et périodes de temps afin de vérifier la robustesse de la stratégie.
La stratégie de suivi des tendances multi-mobiles avec filtre de volatilité 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 divers environnements de marché. Cependant, les utilisateurs doivent faire attention à l'optimisation des paramètres et aux problèmes d'adaptabilité du marché, et envisager d'introduire des indicateurs techniques plus avancés et des techniques de gestion des risques pour améliorer davantage 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)