Stratégie d'optimisation croisée à moyenne mobile sur plusieurs échelles de temps


Date de création: 2024-01-05 12:05:42 Dernière modification: 2024-01-05 12:05:42
Copier: 0 Nombre de clics: 365
1
Suivre
1166
Abonnés

Stratégie d’optimisation croisée à moyenne mobile sur plusieurs échelles de temps

Aperçu

La stratégie est basée sur la réécriture du célèbre indicateur CM_Ultimate_MA_MTF, permettant de tracer des moyennes mobiles sur plusieurs échelles de temps, permettant une opération croisée de MA de différentes périodes de temps. La stratégie a également une fonction de suivi des pertes.

Principe de stratégie

  1. Selon le choix de l’utilisateur, les lignes MA sont tracées séparément sur les périodes de la carte principale et sur les périodes supérieures à travers différents types d’indicateurs MA.
  2. Lorsque la ligne de MA à période rapide traverse la ligne de MA à période lente, faites plus; lorsque la ligne de MA à période rapide traverse la ligne de MA à période lente, faites moins.
  3. Ajout d’un mécanisme de suivi des pertes afin de mieux contrôler les risques.

Analyse des avantages

  1. Le croisement MA à plusieurs échelles de temps permet d’améliorer la qualité du signal et de réduire les faux signaux.
  2. La combinaison de différents types d’AM peut tirer parti des avantages de leurs indicateurs respectifs pour améliorer la stabilité.
  3. Le suivi des arrêts de perte aide à arrêter les pertes en temps opportun et à réduire la probabilité de pertes importantes.

Analyse des risques

  1. L’indicateur MA est en retard et peut avoir manqué une occasion d’opérer sur une ligne courte.
  2. Il est nécessaire d’optimiser correctement les paramètres de la période MA, sinon il peut y avoir trop de faux signaux.
  3. Une mise en place déraisonnable du point d’arrêt peut entraîner des pertes inutiles.

Direction d’optimisation

  1. Il est possible de tester des combinaisons MA de différents paramètres pour trouver le meilleur.
  2. Il est possible d’ajouter des filtres à d’autres indicateurs pour améliorer la qualité du signal.
  3. Les stratégies de stop-loss peuvent être optimisées pour mieux répondre aux caractéristiques du marché.

Résumer

La stratégie intègre l’analyse multi-temporelle des moyennes mobiles et une méthode de suivi des arrêts, afin d’améliorer la qualité du signal et de contrôler le niveau de risque. L’efficacité de la stratégie peut être encore renforcée par l’optimisation des paramètres et l’ajout d’autres indicateurs.

Code source de la stratégie
/*backtest
start: 2022-12-29 00:00:00
end: 2024-01-04 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "Ultimate Moving Average Strategy", shorttitle = "UMA Strategy", overlay = true)

//Created by user ChrisMoody 4-24-2014
//Converted to strategy by Virtual_Machinist 7-11-2018
//Plots The Majority of Moving Averages
//Defaults to Current Chart Time Frame --- But Can Be Changed to Higher Or Lower Time Frames
//2nd MA Capability with Show Crosses Feature

//inputs
src = close
useCurrentRes = input(true, title="Use Current Chart Resolution?")
resCustom = input(title="Use Different Timeframe? Uncheck Box Above",  defval="D")
len = input(20, title="Moving Average Length - LookBack Period")
atype = input(1,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA")
cc = input(true,title="Change Color Based On Direction?")
smoothe = input(2, minval=1, maxval=10, title="Color Smoothing - 1 = No Smoothing")
doma2 = input(false, title="Optional 2nd Moving Average")
len2 = input(50, title="Moving Average Length - Optional 2nd MA")
atype2 = input(1,minval=1,maxval=7,title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA")
cc2 = input(true,title="Change Color Based On Direction 2nd MA?")
warn = input(false, title="***You Can Turn On The Show Dots Parameter Below Without Plotting 2nd MA to See Crosses***")
warn2 = input(false, title="***If Using Cross Feature W/O Plotting 2ndMA - Make Sure 2ndMA Parameters are Set Correctly***")
sd = input(false, title="Show Dots on Cross of Both MA's")

useStop     = input(defval = true, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)

res = useCurrentRes ? timeframe.period : resCustom
//hull ma definition
hullma = wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len)))
//TEMA definition
ema1 = ema(src, len)
ema2 = ema(ema1, len)
ema3 = ema(ema2, len)
tema = 3 * (ema1 - ema2) + ema3

avg = atype == 1 ? sma(src,len) : atype == 2 ? ema(src,len) : atype == 3 ? wma(src,len) : atype == 4 ? hullma : atype == 5 ? vwma(src, len) : atype == 6 ? rma(src,len) : tema
//2nd Ma - hull ma definition
hullma2 = wma(2*wma(src, len2/2)-wma(src, len2), round(sqrt(len2)))
//2nd MA TEMA definition
sema1 = ema(src, len2)
sema2 = ema(sema1, len2)
sema3 = ema(sema2, len2)
stema = 3 * (sema1 - sema2) + sema3

avg2 = atype2 == 1 ? sma(src,len2) : atype2 == 2 ? ema(src,len2) : atype2 == 3 ? wma(src,len2) : atype2 == 4 ? hullma2 : atype2 == 5 ? vwma(src, len2) : atype2 == 6 ? rma(src,len2) : tema

out = avg 
out_two = avg2

out1 = request.security(syminfo.tickerid, res, out)
out2 = request.security(syminfo.tickerid, res, out_two)

ma_up = out1 >= out1[smoothe]
ma_down = out1 < out1[smoothe]

col = cc ? ma_up ? lime : ma_down ? red : aqua : aqua
col2 = cc2 ? ma_up ? lime : ma_down ? red : aqua : aqua

circleYPosition = out2

plot(out1, title="Multi-Timeframe Moving Avg", style=line, linewidth=4, color = col)
plot(doma2 and out2 ? out2 : na, title="2nd Multi-TimeFrame Moving Average", style=circles, linewidth=4, color=col2)
plot(sd and cross(out1, out2) ? circleYPosition : na,style=cross, linewidth=5, color=yellow)

// Strategy conditions

longCond    = ma_up
shortCond   = ma_down
// entries and base exit
strategy.entry("long", strategy.long, when = longCond)
strategy.entry("short", strategy.short, when = shortCond)

if (useStop)
    strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
    strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)
// not sure needed, but just incase..
strategy.exit("XL", from_entry = "long", when = shortCond)
strategy.exit("XS", from_entry = "short", when = longCond)