La volatilité de l'ATR et la stratégie d'inversion de la moyenne des tendances de HMA

Auteur:ChaoZhang est là., Date: 2024-01-17 16h37 et 23h
Les étiquettes:

img

Résumé

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 logique de la stratégie

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).

Analyse des avantages

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.

Risques et solutions

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.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. 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.

  2. Ajouter plus de filtres ou d'oscillateurs pour juger des conditions du marché afin d'améliorer la robustesse du modèle.

  3. Optimiser les paramètres des mécanismes de prise de profit, tester davantage de niveaux de prix et de systèmes d'allocation.

  4. Incorporer des modèles d'apprentissage automatique pour générer des signaux de trading plus efficaces.

Conclusion

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)


Plus de