
La stratégie de rupture dynamique auto-adaptative est une stratégie de trading quantitative avancée qui utilise l’indicateur de rupture dynamique auto-adaptative et l’identification de la forme du graphique. La stratégie s’adapte à la fluctuation du marché en ajustant dynamiquement le cycle de la dynamique et en combinant des conditions de filtrage multiples pour identifier des opportunités de rupture de tendance à forte probabilité. Le cœur de la stratégie est de capturer les changements de la dynamique du marché tout en utilisant la forme de l’absorption comme signal d’entrée pour améliorer la précision et la rentabilité des transactions.
Modification du cycle dynamique:
Calcul de la force et de la douceur:
Les tendances sont les suivantes:
La reconnaissance des formes de dévoration:
Le signal de transaction est généré:
Gestion des opérations:
Il est très adaptable:
Le mécanisme de confirmation multiple:
L’heure exacte de l’entrée:
Une bonne gestion des risques:
Flexibilité et personnalisation:
Le risque de fausse intrusion:
Le problème du retard:
Les limites du mécanisme de retrait fixe:
Une dépendance excessive à une seule période:
Sensitivité des paramètres:
L’intégration de plusieurs périodes:
La perte d’arrêt dynamique:
Analyse du profil de volume:
L’optimisation de l’apprentissage machine:
Les indicateurs émotionnels sont intégrés:
Une analyse de la pertinence:
La stratégie de rupture de tendance dynamique auto-adaptative est un système de négociation avancé combinant des méthodes d’analyse technique et de quantification. En ajustant dynamiquement le cycle de la dynamique, en identifiant les formes d’absorption et en associant des conditions de filtrage multiples, la stratégie est capable de capturer des occasions de rupture de tendance à haute probabilité de manière adaptative dans différents environnements de marché. Bien que certains risques inhérents, tels que les fausses ruptures et la sensibilité aux paramètres, existent, la stratégie a le potentiel d’améliorer encore sa stabilité et sa rentabilité grâce aux directions d’optimisation proposées, telles que l’analyse des cadres temporels multiples, la gestion des risques dynamiques et l’application de l’apprentissage automatique.
/*backtest
start: 2024-06-28 00:00:00
end: 2024-07-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ironperol
//@version=5
strategy("Adaptive Momentum Strategy", overlay=true, margin_long=100, margin_short=100)
// Input parameters for customization
src = input.source(close, title="Source")
min_length = input.int(10, minval=1, title="Minimum Length")
max_length = input.int(40, minval=1, title="Maximum Length")
ema_smoothing = input.bool(true, title="EMA Smoothing")
ema_length = input.int(7, title="EMA Length")
percent = input.float(2, title="Percent of Change", minval=0, maxval=100) / 100.0
// Separate body size filters for current and previous candles
min_body_size_current = input.float(0.5, title="Minimum Body Size for Current Candle (as a fraction of previous body size)", minval=0)
min_body_size_previous = input.float(0.5, title="Minimum Body Size for Previous Candle (as a fraction of average body size of last 5 candles)", minval=0)
close_bars = input.int(3, title="Number of Bars to Hold Position", minval=1) // User-defined input for holding period
//######################## Calculations ##########################
// Initialize dynamic length variable
startingLen = (min_length + max_length) / 2.0
var float dynamicLen = na
if na(dynamicLen)
dynamicLen := startingLen
high_Volatility = ta.atr(7) > ta.atr(14)
if high_Volatility
dynamicLen := math.max(min_length, dynamicLen * (1 - percent))
else
dynamicLen := math.min(max_length, dynamicLen * (1 + percent))
momentum = ta.mom(src, int(dynamicLen))
value = ema_smoothing ? ta.ema(momentum, ema_length) : momentum
// Calculate slope as the difference between current and previous value
slope = value - value[1]
// Calculate body sizes
currentBodySize = math.abs(close - open)
previousBodySize = math.abs(close[1] - open[1])
// Calculate average body size of the last 5 candles
avgBodySizeLast5 = math.avg(math.abs(close[1] - open[1]), math.abs(close[2] - open[2]), math.abs(close[3] - open[3]), math.abs(close[4] - open[4]), math.abs(close[5] - open[5]))
//######################## Long Signal Condition ##########################
// Function to determine if the candle is a bullish engulfing
isBullishEngulfing() =>
currentOpen = open
currentClose = close
previousOpen = open[1]
previousClose = close[1]
isBullish = currentClose >= currentOpen
wasBearish = previousClose <= previousOpen
engulfing = currentOpen <= previousClose and currentClose >= previousOpen
bodySizeCheckCurrent = currentBodySize >= min_body_size_current * previousBodySize
bodySizeCheckPrevious = previousBodySize >= min_body_size_previous * avgBodySizeLast5
isBullish and wasBearish and engulfing and bodySizeCheckCurrent and bodySizeCheckPrevious
// Long signal condition
longCondition = isBullishEngulfing() and slope > 0
// Plotting long signals on chart
plotshape(series=longCondition, location=location.belowbar, color=color.green, style=shape.labelup, text="Long", title="Long Condition")
// Alerts for long condition
if (longCondition)
alert("Long condition met", alert.freq_once_per_bar_close)
//######################## Short Signal Condition ##########################
// Function to determine if the candle is a bearish engulfing
isBearishEngulfing() =>
currentOpen = open
currentClose = close
previousOpen = open[1]
previousClose = close[1]
isBearish = currentClose <= currentOpen
wasBullish = previousClose >= previousOpen
engulfing = currentOpen >= previousClose and currentClose <= previousOpen
bodySizeCheckCurrent = currentBodySize >= min_body_size_current * previousBodySize
bodySizeCheckPrevious = previousBodySize >= min_body_size_previous * avgBodySizeLast5
isBearish and wasBullish and engulfing and bodySizeCheckCurrent and bodySizeCheckPrevious
// Short signal condition
shortCondition = isBearishEngulfing() and slope < 0
// Plotting short signals on chart
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, text="Short", title="Short Condition")
// Alerts for short condition
if (shortCondition)
alert("Short condition met", alert.freq_once_per_bar_close)
//######################## Trading Logic ##########################
// Track the bar number when the position was opened
var int longEntryBar = na
var int shortEntryBar = na
// Enter long trade on the next candle after a long signal
if (longCondition and na(longEntryBar))
strategy.entry("Long", strategy.long)
longEntryBar := bar_index + 1
// Enter short trade on the next candle after a short signal
if (shortCondition and na(shortEntryBar))
strategy.entry("Short", strategy.short)
shortEntryBar := bar_index + 1
// Close long trades `close_bars` candles after entry
if (not na(longEntryBar) and bar_index - longEntryBar >= close_bars)
strategy.close("Long")
longEntryBar := na
// Close short trades `close_bars` candles after entry
if (not na(shortEntryBar) and bar_index - shortEntryBar >= close_bars)
strategy.close("Short")
shortEntryBar := na