Stratégie de filtrage des moyennes mobiles doubles

Auteur:ChaoZhang est là., Date: 2023-11-27 17h03:08
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie qui utilise des moyennes mobiles et des bandes de Bollinger pour le jugement de la tendance, combinée à des principes de filtrage de rupture et de stop loss.

Principe de stratégie

La stratégie se compose principalement des éléments suivants:

  1. Juge de tendance: Utilisez le MACD pour juger de la tendance des prix et distinguer les tendances haussières et baissières.

  2. Filtrage de gamme: Utilisez les bandes de Bollinger pour juger de la gamme de fluctuation des prix et filtrer les signaux qui ne franchissent pas la gamme.

  3. Confirmation de la moyenne mobile double: l'EMA rapide et l'EMA lente forment la moyenne mobile double pour confirmer les signaux de tendance. Les signaux d'achat ne sont générés que lorsque l'EMA rapide > l'EMA lente.

  4. Mécanisme de stop loss: définir des points de stop loss. Fermer les positions lorsque les prix franchissent les points de stop loss dans des directions défavorables.

La logique des signaux d'entrée est la suivante:

  1. Le MACD estime une tendance à la hausse
  2. Les prix franchissent le niveau supérieur des bandes de Bollinger
  3. L'EMA rapide est supérieure à l'EMA lente

Lorsque les trois conditions sont remplies en même temps, un signal d'achat est généré.

Le point de prise de profit est le prix d'entrée multiplié par un certain pourcentage, et le point de stop loss est le prix d'entrée multiplié par un certain pourcentage.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Peut capturer les changements de tendance en temps opportun avec moins de tracebacks.
  2. Réduire les faux signaux en filtrant avec des moyennes mobiles doubles, améliorant la qualité du signal.
  3. Le mécanisme de stop loss contrôle efficacement les pertes uniques.
  4. Un grand espace d'optimisation des paramètres qui peut être ajusté à l'état optimal.

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Les faux signaux générés sur les marchés latéraux peuvent entraîner des pertes.
  2. Les paramètres incorrects des stop-loss peuvent entraîner des pertes inutiles.
  3. Les paramètres inappropriés peuvent entraîner une mauvaise performance de la stratégie.

Pour faire face à ces risques, la stratégie peut être optimisée en ajustant les paramètres, en définissant des positions stop loss, etc.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Ajustez la longueur moyenne mobile double pour trouver la combinaison optimale de paramètres.
  2. Testez différentes méthodes de stop loss, telles que le stop loss de trailing, le stop loss oscillant, etc.
  3. Testez les paramètres MACD pour trouver les paramètres optimaux.
  4. Utiliser l'apprentissage automatique pour l'optimisation automatisée des paramètres.
  5. Ajouter des conditions supplémentaires aux signaux filtrants.

En testant différents paramètres et en évaluant les rendements et les ratios Sharpe, l'état optimal de la stratégie peut être trouvé.

Conclusion

Il s'agit d'une stratégie quantitative qui utilise le jugement de tendance, le filtrage de la plage, la confirmation de la moyenne mobile double et les idées de stop loss. Il peut déterminer efficacement la direction de la tendance et trouver un équilibre entre la maximisation des bénéfices et le contrôle des risques.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r : 
       x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
    rngfilt
filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)


Plus de