Il s'agit d'une stratégie de trading quantitative développée sur la base de l'indicateur Momentum Squeeze de LazyBear.
L'indicateur de base de cette stratégie est l'indicateur Momentum Squeeze de LazyBear. Cet indicateur détermine si les bandes de Bollinger sont
Plus précisément, la stratégie calcule d'abord les bandes de Bollinger de 21 périodes, avec une largeur de 2 écarts types du prix. En même temps, elle calcule les canaux de Keltner de 20 périodes, avec une largeur de 1,5 fois l'amplitude du prix. Lorsque les bandes de Bollinger sont
Pour les sorties, lorsque la couleur de l'indicateur de momentum change en gris, cela signifie que l'état de compression est terminé et que la tendance peut s'inverser.
En évaluant la relation globale entre ces indicateurs, l'exactitude des décisions de négociation peut être améliorée et la probabilité de transactions erronées réduite.
La stratégie d'épuisement de l'élan peut capturer les points clés où le marché est susceptible d'éclater. Ces points sont souvent des points d'inflexion où le marché rend des jugements directionnels importants. Si jugé correctement, le mouvement ultérieur du marché sera relativement long, de sorte que l'espace de profit potentiel de la stratégie est grand.
Comparé à la négociation de rupture aléatoire, le point d'entrée sélectionné par cette stratégie est au point de serrage entre les bandes de Bollinger et les canaux de Keltner.
Les paramètres de cycle et les paramètres de bande passante des bandes de Bollinger et des canaux de Keltner ont un grand impact sur les résultats de négociation.
Il y a toujours un risque que le prix puisse revenir après avoir franchi le point sélectionné par cette stratégie, provoquant une perte.
Lorsque l'état de compression se termine, cette stratégie fermera toutes les positions. Cependant, parfois, la tendance des prix peut encore se poursuivre, ce qui pose le risque d'une sortie prématurée. La logique de sortie doit être optimisée.
Grâce à des essais de données de backtesting, de meilleurs paramètres de cycle et de bande passante peuvent être trouvés pour améliorer les performances de la stratégie.
Mettez des arrêts en mouvement ou en oscillation pour réduire rapidement les pertes lorsque les prix s'inversent.
Lorsque la stratégie sort des positions, certaines conditions de rentrée peuvent être fixées pour une rentrée sur le marché si la tendance se poursuit.
Essayez d'intégrer davantage d'indicateurs de différents types, tels que d'autres indicateurs de volatilité, de volume, etc., afin d'établir une stratégie composite d'intégration des indicateurs, afin d'améliorer la précision des décisions.
La stratégie intègre les bandes de Bollinger, les canaux de Keltner et les indicateurs de dynamique. En jugeant les relations entre ces indicateurs, elle entre à des points de rupture à taux de réussite élevé. Il existe des espaces d'optimisation dans de nombreux aspects tels que l'optimisation des paramètres, les stratégies de stop loss, les conditions de réentrée et l'intégration d'indicateurs composites pour améliorer davantage les performances de la stratégie.
/*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=4 //All credits to LazyBear. All I did was turn it into a strategy! strategy(title = "SQZMOM STRAT", overlay=false) // --- GENERAL INPUTS --- FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12) FromYear = input(defval = 2020, title = "From Year", minval = 2012) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToYear = input(defval = 9999, title = "To Year", minval = 2017) FromDay = 1 ToDay = 1 start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision) trade_leverage = input(1, title = "Trade - Leverage", step = 0.25) trade_risk = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100) tradeType = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"]) // --- SQZMOM CODE length = input(21, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(20, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool) // 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 = color.gray if (val > 0 and val > nz(val[1])) bcolor := color.green if (val < 0 and val < nz(val[1])) bcolor := color.red scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray plot(val, color=bcolor, style=plot.style_histogram, linewidth=4) plot(0, color=scolor, style=plot.style_cross, linewidth=2) // --- VWMA CODE --- useVWMA = input(false, title = "Use VWMA to selectively long/short?", type = input.bool) lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1) useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?") nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA) medianSrc=close calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares) m=calc_evwma(medianSrc, lengthVWMA, nbfs) // ---STRATEGY--- if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false)) longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (longCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("LONG", strategy.long, qty = contracts, when = window()) if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false)) shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1) if (shortCondition) contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4) strategy.entry("SHORT", strategy.short, qty = contracts, when = window()) if (bcolor == color.gray) strategy.close("LONG") strategy.close("SHORT")