
Cette stratégie utilise l’indicateur des moyennes mobiles (MACD) pour construire des signaux de plus-value, effectuer des transactions inversées dans des conditions favorables à la tendance et tirer des bénéfices grâce à la mise en place dynamique d’une position de sortie.
Cette stratégie est basée sur les indicateurs MACD, à savoir: la multiplication des forks dorés et des forks morts. Plus précisément, la multiplication des forks dorés est générée lorsque la ligne MACD traverse la ligne du signal de bas en haut; la multiplication des forks morts est générée lorsque la ligne MACD traverse la ligne du signal de haut en bas.
Lors d’un signal de fourche dorée, si le prix de clôture est supérieur à la moyenne de l’EMA, faites plus; lors d’un signal de fourche morte, si le prix de clôture est inférieur à la moyenne de l’EMA, faites vide. Cela garantit un revirement de la tendance majeure.
Après l’entrée, la stratégie utilise le stop loss et le stop loss pour effectuer un stop loss dynamique. Plus précisément, plusieurs stop loss sont définis comme prix d’entrée.(1- la plus grande baisse); le stop est défini comme prix d’entrée(1+TARGET_STOP_RATIO*Le maximum de baisse est calculé de manière dynamique, en indiquant le pourcentage de baisse de la zone de basse à la clôture; TARGET_STOP_RATIO prend par défaut 2, indiquant que le ratio de gain / perte est de 2 .
L’avantage d’une position de départ ainsi configurée est qu’elle permet d’ajuster dynamiquement les marges et les arrêts en fonction des fluctuations du marché. Arrêtez-vous rapidement en dehors de la zone lors de fortes fluctuations et suivez les arrêts lors de petites fluctuations.
L’indicateur MACD peut être utilisé pour construire un signal de plus-value, permettant de déterminer efficacement le moment de la reprise des cours.
Le filtrage est effectué en combinaison avec l’EMA, en choisissant une tendance à la hausse à l’entrée et en évitant le trading à la baisse.
Système de contrôle dynamique hors-jeu, permettant d’ajuster en temps réel le ratio de profit/perte, le point de rupture, la recherche de profits élevés tout en contrôlant les risques.
En raison de la volatilité du marché, les sorties sont plus rapides et permettent de réduire le temps de mise en bourse, ce qui convient mieux aux investisseurs occupés.
Les indices MACD produisent souvent de faux signaux dans les marchés où le cours est à l’envers. La solution consiste à ajouter la ligne de parité comme filtre pour éviter le trading à contre-courant.
Dans les marchés extrêmement volatiles, le DYNAMIC STOP peut entraîner des arrêts trop lâches, mais fonctionne mieux dans la plupart des scénarios. Si vous rencontrez des situations extrêmes, vous pouvez envisager de fixer le ratio de gain / perte.
L’espace de profit est limité et nécessite des transactions fréquentes pour rechercher des bénéfices. Cela nécessite une certaine tolérance psychologique et un investissement de temps de l’investisseur. Si vous n’avez pas le temps d’opérer, vous pouvez envisager de vous adapter à un cycle élevé.
Adapter les paramètres MACD en fonction des caractéristiques de chaque variété afin d’optimiser l’effet de la transaction.
Il est possible de tester différentes moyennes mobiles comme indicateurs de tendance et de trouver de meilleurs filtres.
Tester le RATIO TARGET_STOP_RATIO, la méthode de calcul du maximum de baisse et optimiser les stratégies de stop-loss.
Ajout d’autres critères, tels que les variations du volume de transactions, la volatilité, etc., pour améliorer la qualité du signal.
Les algorithmes d’apprentissage de la machine ont été testés pour affiner davantage les caractéristiques, créer des modèles dynamiques multifactoriels et réaliser des stop-loss plus intelligents.
La stratégie a une forte utilité globale. Avec le MACD comme signal de trading central, l’ajout de deux modules auxiliaires de jugement de tendance et de contrôle dynamique des sorties de terrain peut considérablement améliorer l’efficacité de la négociation du MACD lui-même. La stratégie de stop-loss est une direction clé de l’optimisation de la stratégie.
/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 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/
// © maxencetajet
//@version=5
strategy("MACD Strategy", overlay=true, initial_capital=1000, slippage=25)
src = input(title="Source", defval=close)
target_stop_ratio = input.float(title='Risk/Reward', defval=2, minval=0.5, maxval=100)
risk = input.float(2, title="Risk per Trade %")
riskt = risk / 100 + 1
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",
group="Backtest Time Period")
backtestStartDate = input(timestamp("5 June 2022"),
title="Start Date", group="Backtest Time Period",
tooltip="This start date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("5 July 2022"),
title="End Date", group="Backtest Time Period",
tooltip="This end date is in the time zone of the exchange " +
"where the chart's instrument trades. It doesn't use the time " +
"zone of the chart or of your computer.")
inTradeWindow = true
emaV = input.int(200, title="Length", group="EMA")
swingHighV = input.int(7, title="Swing High", group="number of past candles")
swingLowV = input.int(7, title="Swing Low", group="number of past candles")
ema = ta.ema(src, emaV)
fast_length = input(title="Fast Length", defval=12, group="MACD")
slow_length = input(title="Slow Length", defval=26, group="MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
longcondition = close > ema and ta.crossover(macd, signal) and macd < 0
shortcondition = close < ema and ta.crossunder(macd, signal) and macd > 0
float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na
risk_long := risk_long[1]
risk_short := risk_short[1]
swingHigh = ta.highest(high, swingHighV)
swingLow = ta.lowest(low, swingLowV)
lotB = (strategy.equity*riskt-strategy.equity)/(close - swingLow)
lotS = (strategy.equity*riskt-strategy.equity)/(swingHigh - close)
if strategy.position_size == 0 and longcondition and inTradeWindow
risk_long := (close - swingLow) / close
strategy.entry("long", strategy.long, qty=lotB)
if strategy.position_size == 0 and shortcondition and inTradeWindow
risk_short := (swingHigh - close) / close
strategy.entry("short", strategy.short, qty=lotS)
if strategy.position_size > 0
stopLoss := strategy.position_avg_price * (1 - risk_long)
takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
entry_price := strategy.position_avg_price
strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit)
if strategy.position_size < 0
stopLoss := strategy.position_avg_price * (1 + risk_short)
takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
entry_price := strategy.position_avg_price
strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit)
plot(ema, color=color.white, linewidth=2, title="EMA")
p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))