Stratégie de suivi de la tendance à la rupture de l'élan

Auteur:ChaoZhang est là., Date: 2023-11-13 17:46:01 Je vous en prie.
Les étiquettes:

img

Résumé

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.

La logique de la stratégie

  1. 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.

  2. 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.

  3. 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.

  4. Calculer la valeur de la courbe de régression linéaire comme indicateur de momentum.

  5. 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.

Les avantages de la stratégie

  1. 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é.

  2. L'indicateur de dynamique peut capturer en temps opportun les renversements de tendance des prix, complétant les indicateurs de canal.

  3. Permettez une entrée précoce pour augmenter les opportunités de profit.

  4. Adopter des jugements à conditions multiples pour éviter les sur-trades lors des marchés variés.

  5. Les paramètres de l'indicateur technique sont personnalisables et s'adaptent à différents produits et combinaisons de paramètres.

  6. Les délais de test arrière peuvent être définis pour optimiser sur des périodes spécifiques.

Risques liés à la stratégie

  1. Les stratégies qui suivent la tendance sont sujettes aux pertes lorsque la tendance s'inverse.

  2. Des paramètres mal réglés peuvent entraîner une survente ou une mauvaise qualité du signal.

  3. Le recours aux données historiques ne peut garantir des rendements stables à l'avenir.

  4. Incapable de gérer les turbulences du marché et les fluctuations drastiques des prix causées par les événements du cygne noir.

  5. Des réglages incorrects de la fenêtre de temps de backtest peuvent entraîner un surajustement.

Directions d'optimisation

  1. Optimiser les paramètres des bandes de Bollinger et des canaux de Keltner pour trouver la meilleure combinaison.

  2. Testez l'ajout d'un stop loss pour contrôler la perte maximale par transaction.

  3. Essayez d'optimiser davantage les produits spécifiques et les combinaisons période/paramètre.

  4. Explorez l'intégration de modèles d'apprentissage automatique pour déterminer les renversements de tendance.

  5. Testez différentes stratégies de séquençage des entrées et de dimensionnement de la position.

  6. Faites des recherches sur la façon d'identifier les signaux d'inversion de tendance et de sortir à temps.

Résumé

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()
        



Plus de