Stratégie de suivi de tendance basée sur l'indicateur de momentum de compression


Date de création: 2023-11-13 17:46:01 Dernière modification: 2023-11-13 17:46:01
Copier: 0 Nombre de clics: 883
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance basée sur l’indicateur de momentum de compression

Aperçu

La stratégie est basée sur l’indicateur de dynamique de compression de LazyBear, combiné avec les canaux de Bryn et Keltner, pour identifier les formes de compression et d’expansion formées par les canaux de rupture des prix, pour déterminer la direction de la tendance potentielle du prix des actions et pour décider de la direction de la position en utilisant le suivi de la tendance. L’avantage de la stratégie est que la capacité de l’indicateur de dynamique à identifier les tendances potentielles est pleinement exploitée et qu’un filtre conditionnel est mis en place pour contrôler la qualité du signal de négociation.

Principe de stratégie

  1. Calculer la moyenne, la plus haute et la plus basse des bandes de Brin. La moyenne est la moyenne mobile simple du prix de clôture de n jours. La plus haute et la plus basse des bandes sont les valeurs de clôture de n jours plus ou moins m fois la différence standard.

  2. Calculer la moyenne, la ligne supérieure et la ligne inférieure des canaux de Keltner. La moyenne est la moyenne mobile simple du prix de clôture de n jours, la ligne supérieure et inférieure est la moyenne mobile simple de l’amplitude réelle de n jours plus ou moins m fois la moyenne.

  3. La forme de compression et d’expansion consiste à déterminer si le prix a traversé la trajectoire ascendante et descendante de la ceinture de Brin et du canal de Keltner. La forme de compression consiste à voir le prix descendre par le haut et la forme d’expansion à voir le prix monter par le bas.

  4. Calculer la valeur de la courbe de régression linéaire, comme indicateur de dynamique. Lorsque la ligne de dynamique est traversée par 0, c’est un signal d’achat, et lorsque la ligne est traversée par 0, c’est un signal de vente.

  5. Le signal de transaction final est déterminé par la combinaison de plusieurs conditions, telles que la forme de compression et d’expansion, la direction de l’indicateur de dynamique et le filtre de valeur moyenne. Un signal de transaction sera généré uniquement si toutes les conditions sont remplies, afin d’éviter des transactions erronées.

Avantages stratégiques

  1. Le double filtrage de la bande de Bryn et du canal Keltner est utilisé pour identifier les formes de compression et d’expansion de haute qualité.

  2. L’indicateur de dynamique est capable de saisir en temps opportun la reprise de la tendance des prix et de se compléter avec l’indicateur de canal.

  3. L’accès à l’avance permet d’améliorer les chances de gagner de l’argent

  4. Les investisseurs doivent utiliser des critères multiples afin d’éviter d’ouvrir fréquemment des positions en cas de choc.

  5. Les paramètres des indicateurs techniques peuvent être personnalisés pour s’adapter à différentes variétés et combinaisons de paramètres.

  6. On peut définir des périodes de réévaluation pour optimiser les tests sur une période donnée.

Risque stratégique

  1. Les stratégies de suivi des tendances sont sujettes à des pertes lorsque la tendance est inversée.

  2. Une mauvaise configuration des paramètres peut entraîner une fréquence de transaction trop élevée ou une mauvaise qualité du signal.

  3. Les tests de données historiques ne garantissent pas la stabilité des retours futurs.

  4. Le gouvernement n’a pas été en mesure de faire face aux chocs sur le marché et aux fortes fluctuations des prix.

  5. La fenêtre de temps de détection n’est pas correctement réglée, ce qui peut entraîner une suradaptation.

Orientation de l’optimisation de la stratégie

  1. Optimiser les paramètres de la ceinture de Brin et du canal de Keltner pour trouver la combinaison optimale.

  2. Le test de l’ajout d’un stop mobile pour contrôler la perte maximale d’une seule transaction.

  3. Essayez d’optimiser encore plus la combinaison de certains paramètres de variété et de cycle.

  4. L’étude a été réalisée sur la base d’un modèle d’apprentissage automatique.

  5. Tester les différentes stratégies d’entrée et de gestion des positions.

  6. Il a étudié comment reconnaître les signaux d’inversion de tendance et arrêter les pertes en temps opportun.

Résumer

La stratégie intègre plusieurs indicateurs techniques pour déterminer la direction de la tendance des prix et effectuer le suivi de la tendance, avec une forte adaptabilité. Par la personnalisation des paramètres et le filtrage de plusieurs conditions, la fréquence des transactions peut être efficacement contrôlée et la qualité du signal améliorée.

Code source de la stratégie
/*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()