Stratégie de suivi de tendance basée sur la moyenne mobile et la volatilité


Date de création: 2023-09-21 21:32:40 Dernière modification: 2023-09-21 21:32:40
Copier: 0 Nombre de clics: 658
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie utilise de multiples indicateurs tels que la ligne de moyenne, les bandes de Brin et la période de temps pour identifier le début et la fin de la tendance des prix et effectuer des opérations de suivi de la tendance. La stratégie est confirmée par plusieurs indicateurs et peut filtrer efficacement les fausses ruptures.

Principe de stratégie

La stratégie comprend les étapes clés suivantes:

  1. Calculer la moyenne rapide et la moyenne lente. La moyenne est calculée en utilisant le VWAP plutôt que le prix de clôture, ce qui reflète plus précisément le prix de transaction réel.

  2. Calculer la moyenne de la ligne de mesure et dessiner une bande de Brin à partir de cette moyenne. La bande de Brin permet de déterminer si la volatilité des prix s’est élargie et de signaler le début d’une tendance.

  3. L’introduction d’un indicateur de la période de temps (TSV) permettant de déterminer si le volume de transactions est en expansion et ainsi confirmer la tendance existante.

  4. Un signal d’achat est généré lorsque le prix est supérieur au cours de Brin et que le TSV est supérieur à 0 sur la ligne de moyenne rapide et une ligne de moyenne lente; au contraire, un signal de vente apparaît.

  5. Utilisez le retrait de la ligne de moyenne et la descente de Brin comme signaux de stop-loss.

Avantages stratégiques

  • Confirmation de plusieurs indicateurs permettant de filtrer efficacement les fausses percées et d’identifier le début de la tendance

  • La méthode de calcul de la ligne moyenne reflète plus précisément le prix réel de la transaction

  • Déterminer si une tendance existe en combinant les indicateurs de volatilité

  • L’augmentation du volume des transactions confirme la tendance à la hausse

  • Des normes de stop-loss et d’arrêt raisonnables permettent de contrôler les risques

  • Les paramètres sont configurables et peuvent être flexiblement ajustés à leur état optimal

Risque stratégique

  • La difficulté d’optimiser les paramètres pour un jugement composé de plusieurs indicateurs

  • Il y a un problème de retard sur les lignes de la moyenne et sur les bandes de Brin, ce qui pourrait entraîner des pertes insuffisantes en temps opportun

  • L’indicateur de la quantité de temps est sensible aux paramètres de réglage et doit être ajusté selon les marchés

  • Il y a une possibilité de plus de faux signaux dans les marchés de consolidation

  • Les bénéfices et les pertes réels sont inférieurs aux résultats de la revue, sans tenir compte de l’incidence des coûts de transaction.

Orientation de l’optimisation de la stratégie

  • Essayez d’optimiser automatiquement les combinaisons de paramètres en utilisant une méthode d’apprentissage automatique.

  • Mettre en place un arrêt mobile dynamique ou un arrêt suivi pour mieux verrouiller les bénéfices

  • Introduction d’un indicateur d’énergie du volume des transactions afin d’éviter les erreurs de transaction qui pourraient dévier du volume

  • Combiné avec la théorie des vagues, pour déterminer si une tendance est en cours dans les premières, moyennes ou dernières périodes, modifiez dynamiquement les paramètres de la stratégie

  • Prendre en compte l’impact sur les coûts réels de la transaction et définir des marges minimales pour contrôler l’efficacité des coûts

Résumer

La stratégie prend en compte de multiples indicateurs qui offrent une bonne capacité de reconnaissance de tendances et permettent de déterminer efficacement le début et la fin d’une tendance réelle. La stabilité de la stratégie peut être encore améliorée par l’optimisation des paramètres, l’optimisation des pertes et l’optimisation du filtre.

Code source de la stratégie
/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4

// Credits

// "Vwap with period" code which used in this strategy to calculate the leadLine was written by "neolao" active on https://tr.tradingview.com/u/neolao/
// "TSV" code which used in this strategy was written by "liw0" active on https://www.tradingview.com/u/liw0. The code is corrected by "vitelot" December 2018.

strategy("HYE Trend Hunter [Strategy]", overlay = true, initial_capital = 1000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, commission_value = 0.025, pyramiding = 0)
  
// Strategy inputs 

slowtenkansenPeriod = input(9, minval=1, title="Slow Tenkan Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
slowkijunsenPeriod = input(26, minval=1, title="Slow Kijun Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
fasttenkansenPeriod = input(5, minval=1, title="Fast Tenkan Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
fastkijunsenPeriod = input(13, minval=1, title="Fast Kijun Sen VWAP Line Length", group = "Tenkansen / Kijunsen")
BBlength = input(20, minval=1, title= "Bollinger Band Length", group = "Bollinger Bands")
BBmult = input(2.0, minval=0.001, maxval=50, title="Bollinger Band StdDev", group = "Bollinger Bands")
tsvlength  = input(13, minval=1, title="TSV Length", group = "Tıme Segmented Volume")
tsvemaperiod = input(7, minval=1, title="TSV Ema Length", group = "Tıme Segmented Volume")

// Make input options that configure backtest date range  
 
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group = "Backtest Range")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group = "Backtest Range")
startYear = input(title="Start Year", type=input.integer,
     defval=2000, minval=1800, maxval=2100, group = "Backtest Range")

endDate = input(title="End Date", type=input.integer, 
     defval=31, minval=1, maxval=31, group = "Backtest Range")
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12, group = "Backtest Range") 
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100, group = "Backtest Range")
     
inDateRange =  true

//Slow Tenkan Sen Calculation

typicalPriceTS = (high + low + close) / 3
typicalPriceVolumeTS = typicalPriceTS * volume
cumulativeTypicalPriceVolumeTS = sum(typicalPriceVolumeTS, slowtenkansenPeriod)
cumulativeVolumeTS = sum(volume, slowtenkansenPeriod)
slowtenkansenvwapValue = cumulativeTypicalPriceVolumeTS / cumulativeVolumeTS

//Slow Kijun Sen Calculation

typicalPriceKS = (high + low + close) / 3
typicalPriceVolumeKS = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKS = sum(typicalPriceVolumeKS, slowkijunsenPeriod)
cumulativeVolumeKS = sum(volume, slowkijunsenPeriod)
slowkijunsenvwapValue = cumulativeTypicalPriceVolumeKS / cumulativeVolumeKS

//Fast Tenkan Sen Calculation

typicalPriceTF = (high + low + close) / 3
typicalPriceVolumeTF = typicalPriceTF * volume
cumulativeTypicalPriceVolumeTF = sum(typicalPriceVolumeTF, fasttenkansenPeriod)
cumulativeVolumeTF = sum(volume, fasttenkansenPeriod)
fasttenkansenvwapValue = cumulativeTypicalPriceVolumeTF / cumulativeVolumeTF

//Fast Kijun Sen Calculation

typicalPriceKF = (high + low + close) / 3
typicalPriceVolumeKF = typicalPriceKS * volume
cumulativeTypicalPriceVolumeKF = sum(typicalPriceVolumeKF, fastkijunsenPeriod)
cumulativeVolumeKF = sum(volume, fastkijunsenPeriod)
fastkijunsenvwapValue = cumulativeTypicalPriceVolumeKF / cumulativeVolumeKF

//Slow LeadLine Calculation
 
lowesttenkansen_s = lowest(slowtenkansenvwapValue, slowtenkansenPeriod)
highesttenkansen_s = highest(slowtenkansenvwapValue, slowtenkansenPeriod)

lowestkijunsen_s = lowest(slowkijunsenvwapValue, slowkijunsenPeriod)
highestkijunsen_s = highest(slowkijunsenvwapValue, slowkijunsenPeriod)

slowtenkansen = avg(lowesttenkansen_s, highesttenkansen_s)
slowkijunsen = avg(lowestkijunsen_s, highestkijunsen_s)
slowleadLine = avg(slowtenkansen, slowkijunsen)

//Fast LeadLine Calculation
 
lowesttenkansen_f = lowest(fasttenkansenvwapValue, fasttenkansenPeriod)
highesttenkansen_f = highest(fasttenkansenvwapValue, fasttenkansenPeriod)

lowestkijunsen_f = lowest(fastkijunsenvwapValue, fastkijunsenPeriod)
highestkijunsen_f = highest(fastkijunsenvwapValue, fastkijunsenPeriod)

fasttenkansen = avg(lowesttenkansen_f, highesttenkansen_f)
fastkijunsen = avg(lowestkijunsen_f, highestkijunsen_f)
fastleadLine = avg(fasttenkansen, fastkijunsen)

// BBleadLine Calculation

BBleadLine = avg(fastleadLine, slowleadLine)

// Bollinger Band Calculation
 
basis = sma(BBleadLine, BBlength)
dev = BBmult * stdev(BBleadLine, BBlength)
upper = basis + dev
lower = basis - dev

// TSV Calculation

tsv = sum(close>close[1]?volume*(close-close[1]):close<close[1]?volume*(close-close[1]):0,tsvlength)
tsvema = ema(tsv, tsvemaperiod)

// Rules for Entry & Exit  

if(fastleadLine > fastleadLine[1] and slowleadLine > slowleadLine[1] and tsv > 0 and tsv > tsvema and close > upper and inDateRange)
    strategy.entry("BUY", strategy.long)
 
if(fastleadLine < fastleadLine[1] and slowleadLine < slowleadLine[1])
    strategy.close("BUY")

// Plots 

colorsettingS = input(title="Solid Color Slow Leadline", defval=false, type=input.bool)
plot(slowleadLine, title = "Slow LeadLine", color = colorsettingS ? color.aqua : slowleadLine > slowleadLine[1] ? color.green : color.red, linewidth=3)

colorsettingF = input(title="Solid Color Fast Leadline", defval=false, type=input.bool)
plot(fastleadLine, title = "Fast LeadLine", color = colorsettingF ? color.orange : fastleadLine > fastleadLine[1] ? color.green : color.red, linewidth=3)

p1 = plot(upper, "Upper BB", color=#2962FF)
p2 = plot(lower, "Lower BB", color=#2962FF)
fill(p1, p2, title = "Background", color=color.blue)