Stratégie multi-périodes adaptative Momentum gaussien channel

ATR RSI HLC3 TR
Date de création: 2025-02-08 14:49:15 Dernière modification: 2025-02-08 14:49:15
Copier: 1 Nombre de clics: 360
1
Suivre
1617
Abonnés

Stratégie multi-périodes adaptative Momentum gaussien channel

Aperçu

La stratégie est un système de négociation dynamique basé sur les canaux Gauss et les indices RSI aléatoires, combinant un filtrage saisonnier et une gestion de la volatilité. La stratégie identifie les tendances du marché en s’adaptant aux canaux Gauss, en utilisant le RSI aléatoire pour la confirmation de la dynamique et en exécutant des transactions dans des fenêtres saisonnières spécifiques. Le système intègre également une gestion de position basée sur l’ATR pour contrôler le seuil de risque de chaque transaction.

Principe de stratégie

Le cœur de la stratégie est la construction d’un canal de prix basé sur un filtre Gaussian à plusieurs pôles. Ce canal forme une trajectoire dynamique ascendante-abaissée en calculant la valeur de Gaussian du prix HLC3 et en combinant les résultats de l’oscillation avec l’amplitude de fluctuation réelle (TR). La génération d’un signal de transaction nécessite que les conditions suivantes soient remplies:

  1. Les prix ont dépassé la barre et les principales vagues ont tendance à monter
  2. L’indicateur RSI au hasard montre un état de survente
  3. L’heure actuelle dans la fenêtre saisonnière par défaut
  4. Taille de position basée sur le calcul ATR dynamique

Les signaux de plage sont déclenchés par la chute du cours vers le bas. L’ensemble du système utilise plusieurs mécanismes de filtrage pour améliorer la stabilité des transactions.

Avantages stratégiques

  1. Les filtres Gauss ont une excellente capacité de filtrage du bruit, captant efficacement les tendances réelles du marché
  2. La conception multipolar fournit des frontières de canal de prix plus précises
  3. L’intégration de la dynamique et de l’indicateur de tendance améliore la fiabilité du signal
  4. Le filtrage saisonnier aide à éviter les conditions défavorables du marché
  5. La gestion dynamique des positions assure la cohérence des risques
  6. Les paramètres du système peuvent être optimisés en fonction des différentes conditions du marché

Risque stratégique

  1. Les filtres Gauss sont compliqués et peuvent entraîner des retards d’exécution.
  2. Les conditions de filtrage multiples pourraient permettre de manquer des opportunités commerciales importantes
  3. Le système est sensible aux paramètres et nécessite une optimisation soignée
  4. Les paramètres fixes de la fenêtre saisonnière peuvent ne pas s’adapter aux changements de l’environnement du marché
  5. Les contrôles de position basés sur l’ATR peuvent être trop conservateurs pendant les périodes de forte volatilité

Orientation de l’optimisation de la stratégie

  1. L’introduction d’une fenêtre saisonnière qui s’adapte et qui modifie dynamiquement les heures de négociation en fonction des conditions du marché
  2. Optimiser l’efficacité de calcul des filtres Gaussian et réduire les délais d’exécution
  3. Adhésion à un mécanisme de régulation de la volatilité du marché, permettant d’ajuster les conditions de filtrage en fonction des différentes conditions du marché
  4. Développer un système de gestion des positions plus flexible, équilibrant les risques et les gains
  5. Augmentation de l’analyse multi-châtres et amélioration de la fiabilité du signal

Résumer

Il s’agit d’un système de suivi des tendances bien construit qui améliore la stabilité des transactions grâce à des filtres à plusieurs niveaux et à un mécanisme de gestion des risques. Bien qu’il y ait un certain espace d’optimisation, la conception globale est conforme aux exigences des transactions modernes quantitatives. La clé du succès de la stratégie réside dans l’ajustement précis des paramètres et leur adaptation à l’environnement du marché.

Code source de la stratégie
/*backtest
start: 2024-02-08 00:00:00
end: 2025-02-06 08:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"DIA_USDT"}]
*/

//@version=6
strategy("Demo GPT - Gold Gaussian Strategy", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1)

// ====== INPUTS ======
// Gaussian Channel
lengthGC = input.int(144, "Gaussian Period", minval=20)
poles = input.int(4, "Poles", minval=1, maxval=9)
multiplier = input.float(1.414, "Volatility Multiplier", minval=1)

// Stochastic RSI
smoothK = input.int(3, "Stoch K", minval=1)
lengthRSI = input.int(14, "RSI Length", minval=1)
lengthStoch = input.int(14, "Stoch Length", minval=1)
overbought = input.int(80, "Overbought Level", minval=50)

// Seasonal Filter (corrected)
startMonth = input.int(9, "Start Month (1-12)", minval=1, maxval=12)
endMonth = input.int(2, "End Month (1-12)", minval=1, maxval=12)

// Volatility Management
atrLength = input.int(22, "ATR Length", minval=5)
riskPercent = input.float(0.5, "Risk per Trade (%)", minval=0.1, step=0.1)

// ====== GAUSSIAN CHANNEL ======
f_filt9x(alpha, source, iterations) =>
    float f = 0.0
    float x = 1 - alpha
    int m2 = iterations == 9 ? 36 : iterations == 8 ? 28 : iterations == 7 ? 21 : 
           iterations == 6 ? 15 : iterations == 5 ? 10 : iterations == 4 ? 6 : 
           iterations == 3 ? 3 : iterations == 2 ? 1 : 0
    
    int m3 = iterations == 9 ? 84 : iterations == 8 ? 56 : iterations == 7 ? 35 : 
           iterations == 6 ? 20 : iterations == 5 ? 10 : iterations == 4 ? 4 : 
           iterations == 3 ? 1 : 0
    
    int m4 = iterations == 9 ? 126 : iterations == 8 ? 70 : iterations == 7 ? 35 : 
           iterations == 6 ? 15 : iterations == 5 ? 5 : iterations == 4 ? 1 : 0
    
    int m5 = iterations == 9 ? 126 : iterations == 8 ? 56 : iterations == 7 ? 21 : 
           iterations == 6 ? 6 : iterations == 5 ? 1 : 0
    
    int m6 = iterations == 9 ? 84 : iterations == 8 ? 28 : iterations == 7 ? 7 : 
           iterations == 6 ? 1 : 0
    
    int m7 = iterations == 9 ? 36 : iterations == 8 ? 8 : iterations == 7 ? 1 : 0
    
    int m8 = iterations == 9 ? 9 : iterations == 8 ? 1 : 0
    int m9 = iterations == 9 ? 1 : 0
    
    f := math.pow(alpha, iterations) * nz(source) +
      iterations * x * nz(f[1]) -
      (iterations >= 2 ? m2 * math.pow(x, 2) * nz(f[2]) : 0) +
      (iterations >= 3 ? m3 * math.pow(x, 3) * nz(f[3]) : 0) -
      (iterations >= 4 ? m4 * math.pow(x, 4) * nz(f[4]) : 0) +
      (iterations >= 5 ? m5 * math.pow(x, 5) * nz(f[5]) : 0) -
      (iterations >= 6 ? m6 * math.pow(x, 6) * nz(f[6]) : 0) +
      (iterations >= 7 ? m7 * math.pow(x, 7) * nz(f[7]) : 0) -
      (iterations >= 8 ? m8 * math.pow(x, 8) * nz(f[8]) : 0) +
      (iterations == 9 ? m9 * math.pow(x, 9) * nz(f[9]) : 0)
    f

f_pole(alpha, source, iterations) =>
    float fn = na
    float f1 = f_filt9x(alpha, source, 1)
    float f2 = iterations >= 2 ? f_filt9x(alpha, source, 2) : na
    float f3 = iterations >= 3 ? f_filt9x(alpha, source, 3) : na
    float f4 = iterations >= 4 ? f_filt9x(alpha, source, 4) : na
    float f5 = iterations >= 5 ? f_filt9x(alpha, source, 5) : na
    float f6 = iterations >= 6 ? f_filt9x(alpha, source, 6) : na
    float f7 = iterations >= 7 ? f_filt9x(alpha, source, 7) : na
    float f8 = iterations >= 8 ? f_filt9x(alpha, source, 8) : na
    float f9 = iterations == 9 ? f_filt9x(alpha, source, 9) : na
    
    fn := iterations == 1 ? f1 : 
         iterations == 2 ? f2 : 
         iterations == 3 ? f3 : 
         iterations == 4 ? f4 : 
         iterations == 5 ? f5 : 
         iterations == 6 ? f6 : 
         iterations == 7 ? f7 : 
         iterations == 8 ? f8 : 
         iterations == 9 ? f9 : na
    [fn, f1]

beta = (1 - math.cos(4 * math.asin(1) / lengthGC)) / (math.pow(1.414, 2 / poles) - 1)
alpha = -beta + math.sqrt(math.pow(beta, 2) + 2 * beta)
lag = int((lengthGC - 1) / (2 * poles))

srcAdjusted = hlc3 + (hlc3 - hlc3[lag])
[mainFilter, filt1] = f_pole(alpha, srcAdjusted, poles)
[trFilter, tr1] = f_pole(alpha, ta.tr(true), poles)

upperBand = mainFilter + trFilter * multiplier
lowerBand = mainFilter - trFilter * multiplier

// ====== STOCHASTIC RSI ======
rsiValue = ta.rsi(close, lengthRSI)
k = ta.sma(ta.stoch(rsiValue, rsiValue, rsiValue, lengthStoch), smoothK)
stochSignal = k >= overbought

// ====== SEASONAL FILTER (FIXED) ======
currentMonth = month(time)
inSeason = (currentMonth >= startMonth and currentMonth <= 12) or 
         (currentMonth >= 1 and currentMonth <= endMonth)

// ====== VOLATILITY MANAGEMENT ======
atr = ta.atr(atrLength)
positionSize = math.min((strategy.equity * riskPercent/100) / atr, strategy.equity * 0.5 / close)

// ====== TRADING LOGIC ======
trendUp = mainFilter > mainFilter[1]
priceAbove = close > upperBand
longCondition = trendUp and priceAbove and stochSignal and inSeason

exitCondition = ta.crossunder(close, lowerBand)

// ====== EXECUTION ======
if longCondition
    strategy.entry("Long", strategy.long, qty=positionSize)
    
if exitCondition
    strategy.close("Long")

// ====== VISUALIZATION ======
plot(upperBand, "Upper Band", color=color.new(#00FF00, 0))
plot(lowerBand, "Lower Band", color=color.new(#FF0000, 0))
bgcolor(inSeason ? color.new(color.blue, 90) : na, title="Season Filter")