Stratégie dynamique de percée des canaux

Auteur:ChaoZhang est là., Date: 2024-02-27 15:15:07 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indicateur Keltner Channel, combiné à des lignes moyennes mobiles, pour définir des prix d'achat et de vente dynamiques de rupture afin d'obtenir des opérations de rupture à faible achat-vente élevée.

Principe de stratégie

  1. Calculer la médiane du canal: utiliser la moyenne mobile exponentielle pour calculer la médiane du prix du canal
  2. Calculer la bande passante du canal: utiliser la moyenne mobile de la volatilité réelle, de la volatilité réelle moyenne ou de l'amplitude des prix pour calculer la bande passante du canal
  3. Relèche supérieure et inférieure du canal: médiane ± N fois largeur de bande du canal
  4. Commande d'entrée: Lorsque le prix touche le rail supérieur, définissez le prix d'achat de percée et attendez la percée; lorsque le prix touche le rail inférieur, définissez le prix de vente de percée et attendez la percée
  5. Ordre de sortie: Stop loss lorsque le prix tombe à la médiane après l'achat ou lorsque le prix le plus élevé dépasse le prix d'entrée; Stop loss lorsque le prix rebondit à la médiane après la vente ou lorsque le prix le plus bas est inférieur au prix d'entrée

Analyse des avantages

  1. L'utilisation de canaux dynamiques permet de saisir rapidement les changements dans les tendances du marché
  2. L'utilisation de la médiane permet de juger de la direction des tendances des prix
  3. N fois le réglage de la bande passante rend la plage de canaux raisonnable pour éviter les ajustements de position fréquents
  4. L'utilisation de mécanismes de percée est conforme à la théorie de la tendance et suit la tendance
  5. La mise en place de conditions d'arrêt des pertes contrôle strictement les risques

Analyse des risques

  1. Le choix de la méthode de calcul de la ligne médiane aura une incidence sur l'effet d'appariement de la plage de canaux et des prix.
  2. Les multiples N trop grands ou trop petits affecteront le taux de rendement de la stratégie
  3. Les achats et les ventes de rupture ont tendance à former de faux signaux et doivent être strictement arrêtés.

Directions d'optimisation

  1. Essayez différentes méthodes de calcul de la ligne médiane pour trouver les paramètres optimaux
  2. Testez différentes valeurs de N pour trouver le multiplicateur optimal
  3. Augmentez l'amplitude de rupture pour éviter les faux signaux
  4. Optimiser la logique de stop loss pour contrôler strictement les pertes uniques

Résumé

La stratégie globale utilise des méthodes scientifiques et raisonnables pour juger des tendances et des directions des prix à travers des indicateurs de canal dynamiques, définit des paramètres raisonnables pour capturer les signaux de percée, atteint des prix bas-achat-haut-vente et obtient des rendements excédentaires.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
     : na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
     : na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (src < ma or high >= bprice )
cancelScond = crossScond and (src > ma or low <= sprice )
if (cancelBcond)
	strategy.cancel("KltChLE")
if (crossUpper)
	strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
	strategy.cancel("KltChSE")
if (crossLower)
	strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

Plus de