Cette stratégie utilise plusieurs indicateurs tels que les bandes de Bollinger, les canaux KC et les couleurs des bougies pour déterminer les compressions et les relâches du marché, et combine les jugements de tendance des établissements basés sur des moyennes mobiles pour effectuer des transactions lorsque des renversements de tendance se produisent.
Calculez les bandes de Bollinger. Le rail du milieu des bandes de Bollinger est la moyenne mobile simple des prix de clôture de N jours, le rail supérieur est le rail du milieu + M fois la volatilité de la plage réelle de N jours du canal KC, et le rail inférieur est le rail du milieu - M fois la volatilité de la plage réelle de N jours du canal KC.
Calculez le canal KC. Le rail du milieu du canal KC est la moyenne mobile simple des prix de clôture de N jours, le rail supérieur est le rail du milieu + M fois la volatilité de la vraie plage de N jours, et le rail inférieur est le rail du milieu - M fois la volatilité de la vraie plage de N jours.
Lorsque le rail supérieur de la bande de Bollinger est au-dessous du rail supérieur du canal KC et que le rail inférieur de la bande de Bollinger est au-dessus du rail inférieur du canal KC, il s'agit d'un pressage. Lorsque le rail supérieur de la bande de Bollinger est au-dessus du rail supérieur du canal KC et que le rail inférieur de la bande de Bollinger est au-dessous du KC, le rail inférieur du canal est relâché.
Calculer l'évolution de l'établissement. Prendre comme entrée la moyenne des prix de clôture de N jours des prix les plus élevés et les plus bas de N jours, calculer la régression linéaire de N jours, et sa valeur supérieure à 0 indique une tendance à la hausse de l'établissement et inférieure à 0 indique une tendance à la baisse de l'établissement.
La combinaison de bandes de Bollinger, de canaux KC et de chandeliers pour juger des tendances du marché évite les faux signaux.
Utiliser l'établissement pour déterminer la tendance principale et éviter de négocier contre la tendance.
Lorsque le prix touche la ligne de stop loss, la position est automatiquement fermée pour arrêter la perte.
Le jugement de l'évolution de l'établissement est en retard, ce qui peut manquer les points d'inversion de tendance.
Des événements soudains provoquent des mouvements énormes qui ne peuvent être arrêtés, avec des risques de pertes considérables.
Méthodes d'optimisation: ajuster les paramètres de la bande de Bollinger et du canal KC, utiliser l'ADX et d'autres indicateurs pour aider à juger; mettre à jour le cycle de la moyenne mobile de l'établissement dans le temps pour réduire le décalage; ajouter une zone tampon lors de la définition de la ligne de stop-loss.
Combiner plus d'indicateurs techniques pour améliorer la précision des signaux d'ouverture de positions. tels que KDJ, MACD, etc.
Optimiser les paramètres de cycle de la moyenne mobile de l'établissement afin de mieux tenir compte des nouvelles tendances.
Ajoutez des indicateurs de volume de négociation pour éviter les fausses ruptures, tels que l'indicateur de marée énergétique, l'accumulation/distribution, etc.
Les jugements sur plusieurs délais distinguent les signaux à moyen et à long terme des signaux à court terme.
Paramètres d'optimisation de l'IA, recherche exhaustive et combinaison optimale de paramètres recherchés.
/*backtest start: 2024-01-17 00:00:00 end: 2024-01-24 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2017 //@version=2 strategy(shorttitle = "Squeeze str 1.1", title="Noro's Squeeze Momentum Strategy v1.1", 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") lev = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage") 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 mode2 = input(true, defval = true, title = "Mode 2") 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(2018, defval = 2018, 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) //Body body = abs(close - open) abody = sma(body, 10) / 3 //Indicator bcol = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon)) scol = noSqz ? blue : sqzOn ? black : gray plot(val, color=bcol, style=histogram, linewidth=4) plot(0, color=scol, style=cross, linewidth=2) //Signals bar = close > open ? 1 : close < open ? -1 : 0 up1 = trend == 1 and (bar == -1 or usecolor == false) and (body > abody or usebody == false) and mode2 == false dn1 = trend == -1 and (bar == 1 or usecolor == false) and (body > abody or usebody == false) and mode2 == false up2 = trend == 1 and val < val[1] and mode2 dn2 = trend == -1 and val > val[1] and mode2 exit = (strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price) and mode2 //Trading lot = strategy.position_size == 0 ? strategy.equity / close * lev : lot[1] if up1 or up2 strategy.entry("Long", strategy.long, needlong == false ? 0 : lot) if dn1 or dn2 strategy.entry("Short", strategy.short, needshort == false ? 0 : lot) if exit strategy.close_all()