Stratégie de prise de profit et de stop-loss à moyenne mobile triple exponentielle

Auteur:ChaoZhang est là., Date: 2024-02-04 10h38 et 42 min
Les étiquettes:

img

Résumé

La stratégie Triple Exponential Moving Average Profit Taking and Stop Loss est une stratégie de suivi des tendances basée sur trois moyennes mobiles exponentielles avec des périodes différentes pour l'entrée et la sortie du marché.

La logique de la stratégie

La stratégie utilise trois moyennes mobiles exponentielles: la ligne rapide, la ligne moyenne et la ligne lente. Elle va long lorsque la ligne moyenne traverse au-dessus de la ligne lente et ferme la position lorsque la ligne rapide traverse au-dessous de la ligne moyenne.

Dans le même temps, la stratégie tire parti de l'indicateur Average True Range pour calculer les niveaux de prise de profit et de stop-loss. Plus précisément, le profit de prise de profit pour les positions longues est le prix d'entrée + Average True Range * facteur de profit, et pour les positions courtes, c'est le prix d'entrée - Average True Range * facteur de profit. La logique de stop loss est similaire. Cela limite efficacement le risque de pertes importantes.

Analyse des avantages

  1. Les indicateurs de décision sont intuitifs et faciles à comprendre.
  2. Systématique et facile à automatiser.
  3. Équilibre entre le suivi des tendances et le contrôle des risques.

Analyse des risques

  1. Il y a un certain retard et l'incapacité de capturer les retours en arrière en temps opportun.
  2. Prédisposé à un arrêt des pertes sur des marchés variables.
  3. Le réglage des paramètres nécessite une optimisation, sinon les résultats peuvent être médiocres.

Les mesures d'atténuation des risques comprennent: le raccourcissement des périodes de moyenne mobile, l'optimisation du facteur profit/arrêt et l'ajout d'indicateurs auxiliaires.

Directions d'optimisation

  1. Testez des combinaisons de moyennes mobiles pour trouver des paramètres optimaux.
  2. Ajoutez d'autres indicateurs techniques tels que le MACD, le RSI, etc.
  3. Utilisez l'apprentissage automatique pour optimiser les paramètres.
  4. Ajustez dynamiquement le niveau profit/stop en fonction de la plage réelle.
  5. Incorporer le sentiment pour éviter la surpopulation.

Conclusion

Dans l'ensemble, il s'agit d'une stratégie de suivi de tendance efficace avec des performances stables et une mise en œuvre facile via des paramètres simples. La prise de profit dynamique et le stop-loss basé sur la plage moyenne vraie limitent le risque par côté. Mais l'optimisation des paramètres et les combinaisons d'indicateurs doivent être effectuées avec soin pour éviter le sur-ajustement ou le retard de décision.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//© Densz
strategy("3EMA with TP & SL (ATR)", overlay=true )

// INPUTS
startTime           =       input(title="Start Time", type = input.time, defval = timestamp("01 Jan 2017 00:00 +0000"))
endTime             =       input(title="End Time", type = input.time, defval = timestamp("01 Jan 2022 00:00 +0000"))

slowEMALength       =       input(title="Slow EMA Length", type = input.integer, defval = 55)
middleEMALength     =       input(title="Middle EMA Length", type = input.integer, defval = 21)
fastEMALength       =       input(title="Fast EMA Length", type = input.integer, defval = 9)

trendMALength       =       input(title="Trend indicator MA Length", type = input.integer, defval = 200)

atrLength           =       input(title="ATR Length", type = input.integer, defval = 14)
tpATRMult           =       input(title="Take profit ATR multiplier", type = input.integer, defval = 3)
slATRMult           =       input(title="Stop loss ATR multiplier", type = input.integer, defval = 2)

rsiLength           =       input(title="RSI Length", type = input.integer, defval = 14)

// Indicators
slowEMA             =       ema(close, slowEMALength)
middEMA             =       ema(close, middleEMALength)
fastEMA             =       ema(close, fastEMALength)
atr                 =       atr(atrLength)

rsiValue            =       rsi(close, rsiLength)
isRsiOB             =       rsiValue >= 80
isRsiOS             =       rsiValue <= 20

sma200              =       sma(close, trendMALength)

inDateRange         =       true

// Plotting
plot(slowEMA, title="Slow EMA", color=color.red, linewidth=2, transp=50)
plot(middEMA, title="Middle EMA", color=color.orange, linewidth=2, transp=50)
plot(fastEMA, title="Fast EMA", color=color.green, linewidth=2, transp=50)

plot(sma200, title="SMA Trend indicator", color=color.purple, linewidth=3, transp=10)
plotshape(isRsiOB, title="Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, text="OB")
plotshape(isRsiOS, title="Oversold", location=location.belowbar, color=color.green, transp=0, style=shape.triangledown, text="OS")

float takeprofit    =       na
float stoploss      =       na

var line tpline     =       na
var line slline     =       na

if strategy.position_size != 0
    takeprofit := takeprofit[1]
    stoploss := stoploss[1]
    line.set_x2(tpline, bar_index)
    line.set_x2(slline, bar_index)
    line.set_extend(tpline, extend.none)
    line.set_extend(slline, extend.none)
    
// STRATEGY
goLong  = crossover(middEMA, slowEMA) and inDateRange
closeLong = crossunder(fastEMA, middEMA) and inDateRange


if goLong
    takeprofit := close + atr * tpATRMult
    stoploss := close - atr * slATRMult
    // tpline := line.new(bar_index, takeprofit, bar_index, takeprofit, color=color.green, width=2, extend=extend.right, style=line.style_dotted)
    // slline := line.new(bar_index, stoploss, bar_index, stoploss, color=color.red, width=2, extend=extend.right, style=line.style_dotted)
    // label.new(bar_index, takeprofit, "TP", style=label.style_labeldown)
    // label.new(bar_index, stoploss, "SL", style=label.style_labelup)
    strategy.entry("Long", strategy.long, when = goLong)
    strategy.exit("TP/SL", "Long", stop=stoploss, limit=takeprofit)
if closeLong
    takeprofit := na
    stoploss := na
    strategy.close(id = "Long", when = closeLong)

if (not inDateRange)
    strategy.close_all()


Plus de