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.
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.
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.
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.
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.
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
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")