Les ressources ont été chargées... Je charge...

Stratégie de capture de tendance quantitative avancée avec filtre de plage dynamique

Auteur:ChaoZhang est là., Date: 2024-12-17 14h31 et 11h
Les étiquettes:Le taux d'intérêt- Je vous en prie.RFVOLSMAHA

img

Résumé

Cette stratégie est un système de trading quantitatif avancé qui combine des moyennes mobiles avec un filtre de gamme dynamique. Elle identifie les tendances du marché en analysant la relation entre les mouvements de prix et le volume des transactions, tout en utilisant un filtre de gamme pour éliminer les faux signaux et améliorer la précision des transactions.

Principes de stratégie

La logique de base de la stratégie repose sur les calculs clés suivants:

  1. Analyse de la liquidité: Évalue la liquidité du marché en calculant le rapport entre le volume et le mouvement des prix et fixe des limites de liquidité dynamiques.
  2. Confirmation de la tendance: utilise des moyennes mobiles exponentielles (EMA) à 50 et 100 périodes pour confirmer la direction de la tendance.
  3. Filtrage de gamme: utilise une période d'échantillonnage de 50 périodes et un multiplicateur de gamme 3x pour construire des gammes de négociation dynamiques.
  4. Génération de signal: Génère des signaux de trading lorsque le prix franchit le filtre de gamme et que les indicateurs EMA montrent des tendances cohérentes.

Les avantages de la stratégie

  1. Une forte adaptabilité: la stratégie peut ajuster dynamiquement les paramètres en fonction des conditions du marché, en s'adaptant à différents environnements de marché.
  2. Signaux fiables: réduit efficacement les faux signaux en combinant plusieurs indicateurs techniques et filtres.
  3. Gestion complète des risques: intégre le calcul automatique des positions stop-loss pour un contrôle efficace des risques.
  4. Fonctionnalité complète de backtesting: comprend des paramètres de backtesting détaillés pour l'optimisation de la stratégie.

Risques stratégiques

  1. Sensibilité des paramètres: plusieurs paramètres nécessitent un réglage fin et sont sujets à une optimisation excessive.
  2. Impact de glissement: peut faire face à un risque de glissement important sur des marchés très volatils.
  3. Adaptabilité au marché: peut générer de fréquents faux signaux sur différents marchés.
  4. Gestion du capital: la méthode d'allocation du capital fixe peut ne pas convenir à toutes les conditions du marché.

Directions d'optimisation de la stratégie

  1. Adaptation des paramètres: Mettre en place des mécanismes d'adaptation des paramètres pour un réglage automatique des paramètres en fonction des conditions du marché.
  2. Reconnaissance de l'état du marché: ajouter des modules d'identification de l'état du marché pour appliquer différentes stratégies de négociation dans des conditions de marché différentes.
  3. Optimisation de la gestion des capitaux: mettre en œuvre une dimensionnement dynamique des positions en fonction de la volatilité du marché.
  4. Amélioration du filtre de signal: ajouter plus d'indicateurs techniques pour filtrer les faux signaux.

Résumé

La stratégie construit un système de trading quantitatif complet en combinant l'analyse de la liquidité, le suivi des tendances et le filtrage de la fourchette. Ses forces résident dans sa capacité à s'adapter aux changements du marché et à fournir des signaux de trading fiables, tout en nécessitant une attention à l'optimisation des paramètres et à la gestion des risques.


/*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!")

Relationnée

Plus de