Stratégie de compression de la dynamique à moyenne mobile double

Auteur:ChaoZhang est là., Date: 2023-12-25 17h01 et 28h
Les étiquettes:

img

Résumé

Cette stratégie combine trois indicateurs techniques différents et génère des signaux de négociation en utilisant un double système de moyenne mobile, avec des filtres supplémentaires basés sur la couleur et le corps des chandeliers, pour construire une stratégie de négociation à court terme relativement stable et efficace.

La logique de la stratégie

La stratégie utilise des bandes de Bollinger et des canaux KC en combinaison pour identifier les phases de compression et d'expansion sur le marché. Plus précisément, lorsque les bandes de Bollinger sont à l'intérieur du canal KC, cela est considéré comme une compression; lorsque les bandes de Bollinger traversent le canal KC, cela est considéré comme une expansion. La compression représente une volatilité accrue et un éventuel renversement de tendance, et la régression linéaire est utilisée comme indicateur principal de signal de trading à ce moment-là.

Si l'histogramme de régression linéaire est positif (représentant une tendance à la hausse) et que la barre est un chandelier rouge (représentant une fermeture inférieure), en même temps que le corps du chandelier est plus grand que 1/3 du corps moyen des 30 derniers chandeliers, un tel signal de combinaison va long.

La stratégie fournit également une visualisation de l'arrière-plan de compression et d'expansion pour aider à juger de la phase du marché.

Analyse des avantages

  • L'utilisation de plusieurs indicateurs pour la combinaison peut filtrer efficacement les faux signaux
  • La compression représente des points de retournement potentiels et améliore les performances de la stratégie
  • Le filtre du corps évite d'être induit en erreur par de petites vagues de fausses éruptions
  • Facile à obtenir de meilleurs résultats grâce à l'optimisation des paramètres

Analyse des risques

  • La régression linéaire peut facilement émettre de mauvais signaux, ce qui peut entraîner des pertes
  • L'effet des bandes de Bollinger et des canaux KC pour juger de la compression n'est pas idéal
  • Les critères de filtrage sont trop sévères, et il manque peut-être de meilleurs points d'entrée.
  • Les retraits peuvent être plus importants, doivent supporter une certaine tolérance

Les risques peuvent être réduits en ajustant les paramètres des indicateurs, en optimisant les critères de filtrage, etc.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Essayez différentes combinaisons de paramètres et longueurs pour trouver les paramètres optimaux
  2. Augmenter ou diminuer les conditions de filtration pour trouver le niveau de filtration optimal
  3. Utiliser des méthodes d'apprentissage automatique pour trouver automatiquement les paramètres optimaux
  4. Effets des essais sur des variétés spécifiques et ajustement des paramètres en fonction des variétés
  5. Ajouter une stratégie de stop loss pour contrôler une seule perte

Conclusion

Cette stratégie combine plusieurs indicateurs, tout en identifiant les opportunités de compression, elle augmente les conditions de filtrage pour former une stratégie à court terme relativement robuste et efficace.


/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2017

//@version=2
strategy(shorttitle = "Squeeze str 1.0", title="Noro's Squeeze Momentum Strategy v1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = true
usecolor = input(true, defval = true, title = "Use color of candle")
usebody = input(true, defval = true, title = "Use EMA Body")
needbg = input(false, defval = false, title = "Show trend background")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray 

trend = val > 0 ? 1 : val < 0 ? -1 : 0

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//EMA Body
body = abs(close - open)
emabody = ema(body, 30) / 3

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up = trend == 1 and (bar == -1 or usecolor == false) and (body > emabody or usebody == false)
dn = trend == -1 and (bar == 1 or usecolor == false) and (body > emabody or usebody == false)

if up
    strategy.entry("Long", strategy.long)

if dn
    strategy.entry("Short", strategy.short)

Plus de