Cette stratégie est basée sur l'indicateur Squeeze Momentum de LazyBear, combinant les bandes de Bollinger et les canaux de Keltner pour identifier les écarts de prix de la compression et de l'expansion du canal afin de déterminer la direction potentielle de la tendance des prix, et adopte une approche de suivi de tendance pour décider de la direction d'entrée.
Calculez la bande moyenne, la bande supérieure et la bande inférieure des bandes de Bollinger. La bande moyenne est la moyenne mobile simple de n jours du prix de clôture, les bandes supérieures et inférieures sont la bande moyenne plus/moins m fois l'écart type de n jours du prix de clôture.
Calculez la ligne moyenne, la ligne supérieure et la ligne inférieure des canaux de Keltner. La ligne moyenne est la moyenne mobile simple de n jours du prix de clôture, les lignes supérieures et inférieures sont la ligne moyenne plus/moins m fois la moyenne mobile simple de n jours de la plage réelle.
Déterminez si le prix traverse la bande supérieure ou inférieure des bandes de Bollinger et des canaux de Keltner pour former des modèles de compression et d'expansion.
Calculer la valeur de la courbe de régression linéaire comme indicateur de momentum.
Combinez les modèles de compression/expansion, la direction du momentum, le filtrage moyen et d'autres conditions pour déterminer les signaux de trading finaux.
Utilisation d'une double filtration des bandes de Bollinger et des canaux de Keltner pour identifier les modèles de compression et d'expansion de qualité.
L'indicateur de dynamique peut capturer en temps opportun les renversements de tendance des prix, complétant les indicateurs de canal.
Permettez une entrée précoce pour augmenter les opportunités de profit.
Adopter des jugements à conditions multiples pour éviter les sur-trades lors des marchés variés.
Les paramètres de l'indicateur technique sont personnalisables et s'adaptent à différents produits et combinaisons de paramètres.
Les délais de test arrière peuvent être définis pour optimiser sur des périodes spécifiques.
Les stratégies qui suivent la tendance sont sujettes aux pertes lorsque la tendance s'inverse.
Des paramètres mal réglés peuvent entraîner une survente ou une mauvaise qualité du signal.
Le recours aux données historiques ne peut garantir des rendements stables à l'avenir.
Incapable de gérer les turbulences du marché et les fluctuations drastiques des prix causées par les événements du cygne noir.
Des réglages incorrects de la fenêtre de temps de backtest peuvent entraîner un surajustement.
Optimiser les paramètres des bandes de Bollinger et des canaux de Keltner pour trouver la meilleure combinaison.
Testez l'ajout d'un stop loss pour contrôler la perte maximale par transaction.
Essayez d'optimiser davantage les produits spécifiques et les combinaisons période/paramètre.
Explorez l'intégration de modèles d'apprentissage automatique pour déterminer les renversements de tendance.
Testez différentes stratégies de séquençage des entrées et de dimensionnement de la position.
Faites des recherches sur la façon d'identifier les signaux d'inversion de tendance et de sortir à temps.
Cette stratégie intègre plusieurs indicateurs techniques pour juger de la direction de la tendance des prix et suivre la tendance, ayant une adaptabilité relativement forte.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //Strategy based on LazyBear Squeeze Momentum Indicator //I added some custom feature and filters // // @author LazyBear // List of all my indicators: // https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing // v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears] // strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD) length = input(14, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(16, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=bool) //FILTERS useExtremeOrders = input(false, title="Early entry on momentum change", type=bool) useMomAverage = input(false, title="Filter for Momenutum value", type=bool) MomentumMin = input(20, title="Min for momentum") // Calculate BB src = close basis = sma(src, length) dev = mult * stdev(src, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(src, 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(src - 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 : aqua plot(val, color=bcolor, style=histogram, linewidth=4) plot(0, color=scolor, style=cross, linewidth=2) //LOGIC //momentum filter filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true //standard condition longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom exitLongCondition = bcolor==green and not useExtremeOrders shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom exitShortCondition = bcolor==maroon and not useExtremeOrders //early entry extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom exitExtLong = scolor==black or bcolor==red extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom exitExtShort = scolor==black or bcolor==lime //STRATEGY strategy.entry("SQ_Long", strategy.long, when = longCondition) strategy.close("SQ_Long",when = exitLongCondition ) strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong) strategy.close("SQ_Long_Ext",when = exitExtLong) //strategy.exit("exit Long", "SQ_Long", when = exitLongCondition) strategy.entry("SQ_Short", strategy.short, when = shortCondition) strategy.close("SQ_Short",when = exitShortCondition) strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort) strategy.close("SQ_Short_Ext",when = exitExtShort) //strategy.exit("exit Short", "SQ_Short", when = exitShortCondition) // // === Backtesting Dates === thanks to Trost // testPeriodSwitch = input(true, "Custom Backtesting Dates") // testStartYear = input(2018, "Backtest Start Year") // testStartMonth = input(1, "Backtest Start Month") // testStartDay = input(1, "Backtest Start Day") // testStartHour = input(0, "Backtest Start Hour") // testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0) // testStopYear = input(2018, "Backtest Stop Year") // testStopMonth = input(12, "Backtest Stop Month") // testStopDay = input(14, "Backtest Stop Day") // testStopHour = input(23, "Backtest Stop Hour") // testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0) // testPeriod() => // time >= testPeriodStart and time <= testPeriodStop ? true : false // isPeriod = testPeriodSwitch == true ? testPeriod() : true // // === /END // if not isPeriod // strategy.cancel_all() // strategy.close_all()