Stratégie de stop loss suiveur de tendance croisée de moyenne mobile MACD


Date de création: 2023-11-06 11:56:14 Dernière modification: 2023-11-06 11:56:14
Copier: 0 Nombre de clics: 626
1
Suivre
1621
Abonnés

Stratégie de stop loss suiveur de tendance croisée de moyenne mobile MACD

Aperçu

La stratégie utilise l’indicateur MACD pour déterminer la direction de la tendance, en combinaison avec la moyenne EMA et la moyenne SMA croisée comme jugement auxiliaire. Les signaux d’entrée traversent la ligne de signal sur la ligne droite du MACD et tendent vers le haut, les arrêts sont des arrêts flottants calculés par l’ATR. La stratégie est également configurée en sorties par lots, d’abord en liquidant une partie des positions pour obtenir des bénéfices, puis en liquidant une partie des positions pour assurer des bénéfices importants lorsque les prix atteignent une hausse plus importante, et enfin en suivant les positions jusqu’à ce que les pertes soient arrêtées.

Le principe

Signaux d’entrée

Lorsque la courte EMA traverse la courte EMA, cela indique que la tendance à la variation des prix à court terme est meilleure que la tendance à long terme et constitue un signal d’achat. De plus, la courte EMA sur la courte SMA indique également que la hausse des prix à court terme est meilleure que la longue. Ainsi, en combinant la courte EMA sur la droite MACD et le signal croisé EMA et SMA sur la tendance, un moment d’entrée plus fort peut être déterminé.

Comment arrêter les pertes

L’ATR est utilisé pour calculer le stop loss. L’ATR peut refléter efficacement la zone de fluctuation du prix. Lorsque le prix tombe au-delà de cette zone de fluctuation, il sort du stop loss.

Début du match

Il s’agit d’une opération en lots, qui consiste d’abord à liquider une partie de la position après une légère hausse. Puis à liquider une partie de la position lorsque le prix augmente fortement. Enfin, une partie de la position est suivie et détenue jusqu’à ce que le stop loss soit déclenché.

Les avantages

  • L’utilisation du MACD pour déterminer la direction de la tendance, en plus du signal croisé des EMA et SMA, permet de déterminer plus précisément le moment d’entrée
  • Le stop-loss calculé par ATR permet de réaliser un stop-loss tout en suivant la tendance
  • Les investisseurs peuvent récupérer leurs fonds, bloquer leurs bénéfices et les conserver pendant un certain temps.

Risques et contre-mesures

  • Le risque que le MACD et les indicateurs de tendance émettent de faux signaux. Les paramètres peuvent être ajustés de manière appropriée ou d’autres indicateurs peuvent être ajoutés pour aider à juger.
  • Le risque de rupture de l’arrêt ATR. Le cycle ATR peut être étendu ou le coefficient d’arrêt peut être augmenté.
  • Le risque d’être emprisonné lors de la poursuite de certaines positions. Vous pouvez réduire le pourcentage de positions suivies et arrêter les pertes à temps.

Direction d’optimisation

  • Optimisation des paramètres MACD pour une meilleure appréciation des tendances

  • Optimisation des paramètres ATR pour rendre le stop loss plus approprié

  • Optimiser le ratio de sortie et le contrôle de position pour réduire le risque de prise de risque

  • Augmentation des arrêts mobiles ou prise en compte des paramètres de volatilité pour optimiser les arrêts de perte

Résumer

Cette stratégie utilise une combinaison de plusieurs indicateurs, tels que MACD, EMA/SMA, pour déterminer la direction de la tendance afin d’obtenir un moment d’entrée précis. En même temps, l’ATR flottant est utilisé pour bloquer les bénéfices et suivre la tendance.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")