MACD Motion Average Crossover Trend Suivant une stratégie avec un stop-loss de suivi

Auteur:ChaoZhang est là., Date: 2023-11-06 11:56:14 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie utilise le MACD pour déterminer la direction de la tendance, combinée à l'intersection EMA et SMA comme confirmation. Le signal d'entrée est lorsque l'histogramme MACD traverse au-dessus de la ligne de signal et que la tendance est à la hausse. Le stop loss est défini au niveau de prix inférieur au stop de trail ATR flottant. La stratégie sort également partiellement pour tirer profit, sort plus sur une augmentation plus importante des prix et maintient une certaine position avec un stop de trail jusqu'à ce qu'un stop de perte soit atteint.

La logique

Signal d'entrée

Lorsque l'EMA plus rapide traverse une EMA plus lente, cela indique que la tendance à court terme est meilleure que la tendance à long terme, ce qui indique un achat. Pendant ce temps, une traversée plus rapide de la SMA au-dessus de la SMA plus lente suggère également une dynamique haussière plus forte à court terme.

Arrêtez la perte

L'ATR est utilisé pour calculer le niveau de stop loss. L'ATR peut mesurer efficacement la plage de fluctuation des prix. Lorsque le prix dépasse cette plage, le stop loss est déclenché. La période ATR peut être ajustée - une période plus courte permet un stop plus précis mais plus facile à arrêter, tandis qu'une période plus longue donne un stop plus large mais plus robuste.

Signaux de sortie

Sort partiellement d'une petite hausse de prix pour réaliser un profit. Sort plus d'une forte hausse de prix pour obtenir un profit. Maintient une certaine position avec un arrêt de suivi jusqu'à ce qu'un stop-loss soit atteint. Cela aide à bloquer le profit, tout en étant toujours en mesure de maintenir la position pendant une certaine période.

Les avantages

  • La tendance de jugement du MACD combinée au croisement EMA/SMA confirme le calendrier d'entrée
  • L'arrêt de trail ATR permet un arrêt de perte efficace tout en suivant la tendance
  • Les sorties partielles permettent de réaliser des bénéfices, de bloquer les bénéfices et de maintenir la durée

Risques et solutions

  • Risque de mauvais signaux du MACD et des indicateurs de tendance.

  • Le risque d'atteinte d'un stop loss ATR peut augmenter la période ATR ou le multiplicateur de stop loss.

  • Réduisez la taille de la position et réduisez les pertes en temps.

Des possibilités d'amélioration

  • Optimiser les paramètres MACD pour un meilleur jugement de la tendance

  • Optimiser la période ATR pour un meilleur niveau de stop loss

  • Optimiser les ratios de sortie et la taille des positions pour réduire le risque de piégeage

  • Considérez l'ajout d'un indice de prise de profit ou de volatilité en mouvement pour améliorer le stop loss

Résumé

La stratégie combine MACD, EMA/SMA et d'autres indicateurs pour déterminer avec précision le moment de la tendance et de l'entrée. Le stop loss ATR flottant aide à verrouiller le profit tout en suivant la tendance. Les sorties sont échelonnées pour tirer profit, assurer le gain et maintenir la position pendant la durée. Dans l'ensemble, il est stable avec un résultat décent. Mais les paramètres et les sorties peuvent être optimisés pour un meilleur rendement.


/*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")


Plus de