
Cette stratégie est une stratégie de trading quantifiée qui combine un signal de rupture de double équilibre avec un filtre de volatilité ATR et un écart de tendance HMA. La stratégie utilise deux cycles différents pour construire un signal de négociation équilibré, combiné à un filtre ATR de volatilité pour filtrer une partie du signal invalide, et utilise le HMA pour juger de la direction de la tendance et éviter les opérations de contre-courant.
La stratégie utilise une moyenne de 37 cycles de long comme moyenne de référence, générant un signal d’achat lorsque le prix se déplace vers le haut en dessous de cette moyenne, générant un signal de vente lorsque le prix se déplace vers le bas. Pour filtrer les signaux d’erreur, la stratégie définit que le prix se déplace dans la même direction après une rupture de la moyenne de référence.
Dans le mode gain, la stratégie prend en charge le choix d’utiliser un seul stop ou deux ou trois stops à des prix différents. Dans le mode perte, la stratégie utilise le stop directement au-dessus et en dessous de la ligne d’orbite comme un stop long et court.
Comparée à la stratégie de rupture de ligne uniforme, cette stratégie ajoute un filtre ATR volatile lors de la génération de signaux, qui peut filtrer la plupart des signaux inefficaces, ce qui est en parfaite harmonie avec la stratégie de forme de ligne K visuelle, et permet donc de gagner un taux de victoire plus élevé. Dans le même temps, l’augmentation de l’HMA détermine l’écart de tendance et évite la construction de positions de revers, ce qui réduit considérablement les pertes inutiles.
Le plus grand risque de cette stratégie est que le filtrage ATR sur la volatilité peut éliminer une partie du signal efficace, ce qui empêche la stratégie de se positionner à temps. De plus, l’efficacité de la HMA pour juger de la grande tendance n’est pas évidente, et parfois les prix ne sont que des ajustements à court terme plutôt que des retournements de grande tendance, ce qui peut entraîner des pertes inutiles. Afin de réduire les risques ci-dessus, il est possible de réduire de manière appropriée les paramètres du filtrage ATR sur la volatilité, d’élargir la plage de volatilité et de générer plus de signaux de forme K via des instructions de validation.
Cette stratégie peut être optimisée dans les directions suivantes:
Tester plus de combinaisons de paramètres pour trouver la combinaison optimale. Paramètres réglables tels que la longueur de la moyenne de référence, le cycle ATR, le coefficient de filtration fluctuant, etc.
L’ajout de plus de filtres ou d’oscillateurs permettant de juger de l’état du marché améliore encore la robustesse de la stratégie.
Optimiser les paramètres de la méthode de profit. Tester davantage les paramètres de points d’arrêt pour différents niveaux de quantité et de prix.
Les modèles d’apprentissage automatique sont utilisés pour générer des signaux de trading plus efficaces.
Cette stratégie intègre les signaux de rupture du noyau de la double ligne de parité, les signaux d’inefficacité du filtrage de la volatilité ATR et utilise l’HMA pour déterminer le décalage de la grande tendance afin d’éviter la construction de positions de contrepartie. C’est une stratégie de trading quantitative 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)