Cette stratégie intègre le signal de réversion moyenne de la ligne de base, le filtre de volatilité ATR et le filtre de tendance HMA pour générer des signaux de trading robustes pour les stratégies de trading quantitatives.
La stratégie utilise une moyenne mobile de 37 périodes comme référence. Lorsque le prix se déplace vers le haut de cette référence, il génère un signal d'achat, et lorsqu'il se déplace vers le bas, il génère un signal de vente. Pour éviter de faux signaux, la stratégie exige que le prix dépasse la volatilité de 2xATR après avoir pénétré la référence pour confirmer la validité des signaux.
Pour la prise de profit, la stratégie prend en charge l'utilisation d'un ou de plusieurs niveaux de prise de profit (deux ou trois).
Comparée aux stratégies de rupture de moyenne mobile simples, cette stratégie ajoute le filtre de volatilité ATR qui supprime beaucoup de signaux invalides. Cela s'aligne très bien avec les techniques de rupture de modèle visuel, conduisant ainsi à des taux de gain plus élevés.
Le risque majeur est que le filtre de volatilité ATR peut supprimer certains signaux valides, ce qui entraîne l'échec de l'ouverture des positions en temps opportun. En outre, le jugement de tendance HMA n'est pas très significatif parfois lorsque le prix a juste un retracement à court terme, pas un renversement. Cela peut entraîner un stop loss inutile. Pour réduire les risques, nous pouvons abaisser le paramètre du filtre de volatilité ATR pour permettre plus de signaux. Nous pouvons également ajuster le paramètre de période HMA pour utiliser le HMA à plus long terme pour juger des tendances majeures, en évitant les interférences des fluctuations à court terme.
La stratégie peut être optimisée dans les aspects suivants:
Tester plus de combinaisons de paramètres pour trouver l'ensemble optimal de valeurs, par exemple la période de référence, la période ATR, le coefficient de volatilité, etc.
Ajouter plus de filtres ou d'oscillateurs pour juger des conditions du marché afin d'améliorer la robustesse du modèle.
Optimiser les paramètres des mécanismes de prise de profit, tester davantage de niveaux de prix et de systèmes d'allocation.
Incorporer des modèles d'apprentissage automatique pour générer des signaux de trading plus efficaces.
Cette stratégie intègre un double signal de référence de moyenne mobile, un filtre de volatilité ATR et un filtre de biais de tendance HMA dans un système de trading quantitatif très pratique.
/*backtest start: 2023-01-10 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © sevencampbell //@version=5 strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true) // --- User Inputs --- // Baseline Inputs baselineLength = input.int(title="Baseline Length", defval=20) baseline = ta.sma(close, baselineLength) // PBCQ Inputs pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true) pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3) // Volatility Inputs atrLength = input.int(title="ATR Length", defval=14) multiplier = input.float(title="Volatility Multiplier", defval=2.0) rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0) qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5) // Take Profit Inputs takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit") // HMA Inputs hmaLength = input.int(title="HMA Length", defval=50) // --- Calculations --- // ATR atr = ta.atr(atrLength) // Range Calculation rangeHigh = baseline + rangeMultiplier * atr rangeLow = baseline - rangeMultiplier * atr rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na bgcolor(rangeColor, transp=90) // Qualifier Calculation qualifier = qualifierMultiplier * atr // Dot Calculation isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength) isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength) colorDot = isLong ? color.green : isShort ? color.red : na plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3) // --- Strategy Logic --- // PBCQ pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline // Entry Logic longCondition = isLong and pbcqValid shortCondition = isShort and pbcqValid if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Logic if (takeProfitType == "1 Take Profit") strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow) strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh) else if (takeProfitType == "2 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh) strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2) strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow) else if (takeProfitType == "3 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75) strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)