Basé sur une stratégie de rupture de canal dynamique


Date de création: 2024-02-27 15:15:07 Dernière modification: 2024-02-27 15:15:07
Copier: 0 Nombre de clics: 567
1
Suivre
1617
Abonnés

Basé sur une stratégie de rupture de canal dynamique

Aperçu

Cette stratégie utilise l’indicateur de canal de Keltner, combiné à une moyenne mobile, pour définir des prix d’achat et de vente dynamiques, permettant des opérations de rupture basses et hautes. La stratégie identifie automatiquement les opportunités d’achat et de vente dans le canal.

Principe de stratégie

  1. Calculer le milieu de la chaîne: calculer le milieu de la chaîne de prix en utilisant l’indice des moyennes mobiles
  2. Calculer la bande passante du canal: calculer la bande passante du canal en utilisant l’amplitude réelle ou la moyenne de l’amplitude réelle ou de la fluctuation des prix
  3. En orbite et en orbite basse: bande passante ± N fois la bande passante moyenne
  4. ordre d’entrée: lorsque le prix touche la ligne supérieure, réglez le prix d’achat de rupture et attendez la rupture; lorsque le prix touche la ligne inférieure, réglez le prix de vente de rupture et attendez la rupture
  5. ordre de sortie: stop loss lorsque l’achat revient à la voie médiane ou lorsque le prix le plus élevé dépasse le prix d’entrée; stop loss lorsque la vente rebondit à la voie médiane ou lorsque le prix le plus bas est inférieur au prix d’entrée

Analyse des avantages

  1. Utiliser des canaux dynamiques pour capturer rapidement les changements de tendance du marché
  2. L’utilisation de la voie médiane pour déterminer la direction des prix
  3. N fois le réglage de la bande passante pour une portée raisonnable et pour éviter les ajustements de position fréquents
  4. La théorie de la tendance est basée sur le rythme de l’évolution et sur les mécanismes de rupture.
  5. Régler les conditions de stop-loss et contrôler les risques

Analyse des risques

  1. Le choix de la méthode de calcul de l’orbite intermédiaire affecte la portée du canal et l’effet de correspondance des prix.
  2. Le fait d’avoir un nombre N trop grand ou trop petit affecte la rentabilité de la stratégie.
  3. Les signaux de rupture sont souvent faux et doivent être sévèrement bloqués.

Direction d’optimisation

  1. Essayez différentes méthodes de calcul de l’orbite pour trouver le paramètre optimal
  2. Tester différentes valeurs de N pour trouver le multiplicateur optimal
  3. Pour éviter de faux signaux, augmenter la fréquence de la percée
  4. Optimisation de la logique de stop loss et contrôle strict des pertes individuelles

Résumer

Cette stratégie utilise généralement la science et la logique pour déterminer le mouvement et la direction des prix à l’aide d’indicateurs de canaux dynamiques, pour définir des paramètres raisonnables pour capturer les signaux de rupture, pour réaliser des achats bas et des ventes élevées, et pour obtenir des gains supplémentaires. En même temps, l’optimisation continue des risques de la stratégie permet de fonctionner de manière stable sur plusieurs marchés.

Code source de la stratégie
/*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")