Stratégie avancée de capture de tendance quantitative combinée à un filtre de plage dynamique

EMA MA RF VOL SMA HA
Date de création: 2024-12-17 14:31:11 Dernière modification: 2024-12-17 14:31:11
Copier: 4 Nombre de clics: 420
1
Suivre
1617
Abonnés

Stratégie avancée de capture de tendance quantitative combinée à un filtre de plage dynamique

Aperçu

La stratégie est un système de trading quantitatif avancé qui combine des moyennes mobiles et des filtres à gamme dynamique. Il identifie les tendances du marché principalement en analysant la relation entre les variations de prix et le volume des transactions, tout en utilisant des filtres à gamme pour filtrer les faux signaux et améliorer l’exactitude des transactions. La stratégie utilise des méthodes de calcul personnalisées pour déterminer les frontières de la liquidité du marché et combine des moyennes mobiles rapides et lentes pour confirmer la direction de la tendance.

Principe de stratégie

La logique centrale de la stratégie est basée sur les calculs clés suivants:

  1. Analyse de la liquidité: évaluation de la liquidité du marché en calculant le rapport entre le volume d’opérations et les variations de prix, et définition de limites de liquidité dynamiques.
  2. Confirmation de tendance: utilisez une moyenne mobile indicielle (EMA) de 50 cycles et de 100 cycles pour confirmer la direction de la tendance.
  3. Filtrage de la portée: construire une zone de négociation dynamique avec un cycle d’échantillonnage de 50 cycles et un multiplicateur de portée de 3 fois.
  4. Génération de signal: génération d’un signal de transaction lorsque le prix franchit le filtre de la fourchette et que l’indicateur EMA montre une tendance cohérente

Avantages stratégiques

  1. Adaptabilité: la stratégie est capable d’ajuster dynamiquement les paramètres en fonction des conditions du marché et de s’adapter à différents environnements de marché.
  2. La fiabilité du signal: la combinaison de plusieurs indicateurs techniques et de filtres permet de réduire efficacement les faux signaux.
  3. Gestion des risques: le calcul automatique des positions de stop-loss est intégré, ce qui permet de contrôler efficacement les risques.
  4. Fonctionnalité de rétroaction complète: contient des paramètres de rétroaction détaillés pour faciliter l’optimisation de la stratégie.

Risque stratégique

  1. Sensitivité des paramètres: les paramètres de la stratégie nécessitent un ajustement minutieux et peuvent être sur-optimisés.
  2. Effets de dérapage: Dans les marchés à forte volatilité, le risque de dérapage peut être plus élevé.
  3. Adaptabilité du marché: les faux signaux peuvent être fréquents dans les marchés à découvert.
  4. Gestion des fonds: l’allocation des fonds fixes peut ne pas être adaptée à toutes les conditions du marché.

Orientation de l’optimisation de la stratégie

  1. Adaptation des paramètres: Un mécanisme d’adaptation des paramètres peut être introduit, permettant aux paramètres de s’ajuster automatiquement en fonction de la situation du marché.
  2. Identification de l’état du marché: ajout d’un module permettant de juger de l’état du marché et d’adopter différentes stratégies de négociation dans différentes conditions de marché.
  3. Optimisation de la gestion des fonds: introduction de la gestion dynamique des positions, adaptant la taille des transactions en fonction de la volatilité du marché.
  4. Amélioration du filtrage des signaux: des indicateurs techniques supplémentaires peuvent être ajoutés pour filtrer les faux signaux.

Résumer

Cette stratégie, combinant l’analyse de la liquidité, le suivi des tendances et les filtres de portée, permet de construire un système de trading quantitatif complet. Son avantage réside dans sa capacité à s’adapter aux changements du marché et à fournir des signaux de trading fiables, mais elle nécessite également une attention particulière à l’optimisation des paramètres et à la gestion des risques. Grâce à l’optimisation et à l’amélioration continues, la stratégie devrait maintenir une performance stable dans différents environnements de marché.

Code source de la stratégie
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper)*m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0))
shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")