Stratégie de négociation à dynamique récursive

Auteur:ChaoZhang est là., Date: 2024-01-31 16h56 et 31h
Les étiquettes:

img

Résumé

Cette stratégie est une stratégie de suivi des tendances et de rupture basée sur l'indicateur des bandes récursives développé par alexgrover.

La logique de la stratégie

Calcul de l'indicateur des bandes récursives

L'indicateur des bandes récursives se compose d'une bande supérieure, d'une bande inférieure et d'une ligne médiane.

Bande supérieure = Max ((Bande supérieure de la barre précédente, prix de clôture + nVolatilité) Marge inférieure = Min(Marge inférieure de la barre précédente, prix de clôture - nVolatilité Ligne médiane = (bande supérieure + bande inférieure)/2

Ici, n est un coefficient de mise à l'échelle, et la volatilité peut être choisie entre ATR, écart type, plage moyenne vraie ou une méthode RFV spéciale.

Règles de négociation

La stratégie vérifie d'abord si la bande inférieure et la bande supérieure évoluent dans la même direction afin d'éviter de fausses ruptures.

Lorsque le prix dépasse la bande inférieure, allez long. Lorsque le prix dépasse la bande supérieure, allez court.

En outre, une logique de stop loss est mise en œuvre.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Calcul efficace des indicateurs en utilisant un cadre récursif, en évitant les calculs répétés
  2. Adaptation flexible des paramètres pour s'adapter aux différents régimes du marché
  3. Combinaison de tendance et de rupture, évitement des fausses ruptures
  4. Les filtres d'état de moment assurent la qualité du signal

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Des paramètres mal réglés peuvent entraîner une survente ou une mauvaise qualité du signal
  2. Peut faire face à des pertes importantes en cas de changement de tendance majeur
  3. Un contrôle insuffisant du glissement lors de mouvements extrêmes peut amplifier les pertes

Ces risques peuvent être gérés par l'optimisation des paramètres, la mise en œuvre d'un stop loss, l'augmentation du seuil de glissement, etc.

Directions d'optimisation

Quelques orientations pour optimiser davantage la stratégie:

  1. Incorporer des indicateurs sur plusieurs délais pour la robustesse
  2. Ajouter un module d'apprentissage automatique pour optimiser les paramètres adaptatifs
  3. Effectuer une analyse quantitative de la corrélation pour trouver des combinaisons optimales de paramètres
  4. Utiliser l'apprentissage en profondeur pour prédire les tendances des prix et améliorer la précision du signal

Conclusion

En résumé, il s'agit d'une stratégie de suivi des tendances très pratique et efficace. Elle combine le cadre récursif pour l'efficacité de calcul, utilise le support/résistance de la tendance pour déterminer les principales tendances, ajoute des conditions de momentum pour filtrer les fausses ruptures et assurer la qualité du signal. Avec un réglage approprié des paramètres et un contrôle des risques, elle peut obtenir de bons résultats. Elle mérite une recherche et une optimisation supplémentaires pour s'adapter à des régimes de marché plus complexes.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
    method == a ? b : c
v(x) =>
    f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2

// Colors
beColor = #675F76
buColor = #a472ff

// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))

// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
    if b[i] > b[i+1]
        longc:=longc+1
    if a[i] < a[i+1]
        shortc:=shortc+1
bhdLong = if bandDirectionCheck
    longc==lookback
else
    true
bhdShort = if bandDirectionCheck
    shortc==lookback
else
    true

// Strategy
if b>=low and bhdLong
    strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
    strategy.entry(id='Short',direction=strategy.short)

// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
    //strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
    //strategy.exit(id="Long",limit=close)

Plus de