Stratégie MACD - Opérations de sortie à double sens

Auteur:ChaoZhang est là., Date: 2023-12-12 12:44:50 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie utilise l'indicateur de convergence moyenne mobile (MACD) pour générer des signaux longs et courts et effectue des transactions d'inversion dans de bonnes conditions de tendance en définissant dynamiquement des points de sortie pour capturer des bénéfices.

Principes de stratégie

Le noyau de cette stratégie est basé sur la croix dorée MACD pour les signaux longs et la croix de la mort pour les signaux courts.

Sur les signaux de croix dorée, allez long si le prix de clôture est supérieur à l'EMA; sur les signaux de croix de mort, allez court si le prix de clôture est inférieur à l'EMA.

Une fois les positions entrées, la stratégie utilise le stop loss et le take profit pour contrôler dynamiquement les sorties. Plus précisément, le stop loss pour les positions longues est défini au prix d'entrée * (1 - max drawdown); le take profit est défini au prix d'entrée * (1 + TARGET_STOP_RATIO * max drawdown).

L'avantage de cette stratégie de stop dynamique est qu'elle peut ajuster le stop loss et le ratio risque/rendement en fonction de la volatilité du marché.

Les avantages

  1. Le MACD est un indicateur efficace pour identifier les opportunités d'inversion.

  2. Le filtre EMA garantit que les transactions longues ne se produisent que sur un marché à tendance haussière.

  3. Le système de contrôle de sortie dynamique maximise les profits tout en gérant efficacement les risques.

  4. La vitesse rapide réduit le temps de surveillance requis, ce qui le rend approprié pour les investisseurs occupés.

Risques et solutions

  1. Le MACD oscille fréquemment pendant les marchés latéraux, générant de faux signaux.

  2. La volatilité extrême peut entraîner un DYNAMIC STOP trop lâche.

  3. Les investisseurs ont besoin d'une certaine endurance psychologique et d'un engagement dans le temps.

Directions d'optimisation

  1. Ajustez les paramètres MACD en fonction des caractéristiques du symbole pour optimiser la qualité du signal.

  2. Testez différentes moyennes mobiles en tant que filtre de tendance pour trouver la moyenne optimale.

  3. Testez le calcul TARGET_STOP_RATIO et la définition du tirage maximal pour optimiser la stratégie de sortie.

  4. Ajoutez d'autres facteurs tels que le volume, la volatilité, etc. pour améliorer la qualité du signal.

  5. Explorer les modèles d'apprentissage automatique pour extraire plus de fonctionnalités et construire des modèles multifactoriels adaptatifs pour des sorties plus intelligentes.

Conclusion

Cette stratégie a une forte valeur pratique dans l'ensemble. Avec le MACD comme signal de trading principal, les modules complémentaires de filtre de tendance et de contrôle de sortie dynamique peuvent améliorer considérablement la performance du MACD lui-même. Le contrôle de sortie est essentiel pour l'optimisation de la stratégie et cette stratégie innove considérablement dans ce domaine.


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



Plus de