Cette stratégie détermine la direction de la tendance en calculant le croisement entre l'indicateur MACD et sa moyenne mobile de la ligne de signal, et juge la force de la tendance actuelle avec l'indicateur EMA pour suivre la tendance.
Le noyau de cette stratégie est de déterminer la direction de la tendance et le moment d'entrée en fonction de l'indicateur MACD. Le croisement entre la ligne MACD et la ligne de signal indique un renversement de la tendance des prix. Par conséquent, les positions longues et courtes sont déterminées en fonction de la direction de rupture. Plus précisément, lorsque le prix de clôture est au-dessus de la ligne EMA et que la ligne MACD traverse la ligne de signal depuis le bas, passez long; lorsque le prix de clôture est en dessous de la ligne EMA et que la ligne MACD traverse la ligne de signal depuis le haut, passez court.
La ligne EMA sert à aider à juger de la tendance. Si le prix est au-dessus de la ligne EMA, cela indique une tendance à la hausse. À ce moment-là, une percée du MACD en dessous est susceptible de former un signal de croix dorée. Si le prix est en dessous de la ligne EMA, cela indique une tendance à la baisse. À ce moment-là, une percée au-dessus du MACD est susceptible de former un signal de croix de mort.
De cette façon, nous pouvons entrer sur le marché en temps opportun lorsque le prix commence à s'inverser pour former une nouvelle tendance, obtenant un effet de suivi de tendance.
Cette stratégie combine deux conditions de jugement, en tenant compte à la fois de la direction de tendance des prix et en utilisant des indicateurs pour déterminer le moment d'entrée spécifique, en évitant le risque de fausses ruptures et en améliorant la fiabilité de la stratégie.
L'application de la ligne EMA permet également à la stratégie de filtrer les effets des fluctuations à court terme et de localiser dans une certaine mesure les tendances à moyen et à long terme.
En outre, la stratégie établit des conditions à la fois longues et courtes, qui peuvent être appliquées aux marchés taureau et ours, ce qui améliore l'adaptabilité de la stratégie.
Le principal risque de cette stratégie est que l'indicateur MACD lui-même a une forte probabilité de mal juger les signaux de Fakeout.
En outre, la stratégie adopte un facteur de profit pour définir les conditions de stop loss et de prise de profit, ce qui implique une certaine subjectivité.
Enfin, la stratégie fixe simplement la taille de la position à 100% du capital propre du compte sans tenir compte de la gestion des fonds, ce qui présente également certains risques dans le trading en direct.
Les principales orientations d'optimisation de cette stratégie sont les suivantes:
Augmenter d'autres indicateurs de jugement pour former des combinaisons multiples d'indicateurs afin d'éviter davantage la probabilité que le MACD génère des signaux erronés.
La longueur de la ligne EMA peut être optimisée pour plusieurs paramètres afin de trouver les paramètres optimaux pour juger de la direction de la tendance.
Les paramètres MACD peuvent également être optimisés pour trouver les valeurs les plus précises pour déterminer le moment de l'inversion.
Ajouter un module de gestion de capital. Par exemple, le facteur de profit peut être utilisé comme entrée dynamique, et les arrêts de glissement peuvent également être définis.
Testez les effets sur différents types de contrats, tels que les crypto-monnaies, les contrats à terme sur indices, etc., pour trouver la variété de négociation la plus appropriée.
Dans l'ensemble, cette stratégie de suivi des tendances MACD EMA est relativement simple et pratique. Elle garantit la fiabilité du signal grâce à des conditions d'indicateur double et des verrous dans les bénéfices grâce à des méthodes de stop loss et de prise de profit raisonnables. L'espace d'optimisation principal réside dans la sélection des paramètres, les combinaisons d'indicateurs, la gestion des capitaux, etc. Avec une optimisation et des tests supplémentaires, on pense que cette stratégie peut devenir l'une des stratégies de suivi des tendances les plus efficaces.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type = strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD) // Time Range FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12) FromDay=input(defval=1,title="FromDay",minval=1,maxval=31) FromYear=input(defval=2020,title="FromYear",minval=2016) ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12) ToDay=input(defval=1,title="ToDay",minval=1,maxval=31) ToYear=input(defval=9999,title="ToYear",minval=2017) start=timestamp(FromYear,FromMonth,FromDay,00,00) finish=timestamp(ToYear,ToMonth,ToDay,23,59) window()=>true // STEP 2: // See if this bar's time happened on/after start date afterStartDate = true //EMA emasrc = close res = input(title="EMA Timeframe", type=input.resolution, defval="15") len1 = input(title="EMA Length", type=input.integer, defval=206) col1 = color.yellow // Calculate EMA ema1 = ema(emasrc, len1) emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off) // Draw EMA plot(emaSmooth, title="EMA", linewidth=1, color=col1) //MACD fast_length = input(title="Fast Length", type=input.integer, defval=15) slow_length = input(title="Slow Length", type=input.integer, defval=24) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true) sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true) zeroline = 0 // 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) //plot(zeroline, title="Zero Line", color=color.black, transp=0) ///////////////////////////LONG//////////////////////////////////////////////////////////////////// enablelong = input(true, title="Enable long?") //Long Signal upcondition = close > emaSmooth and close[1] > emaSmooth[1] macdunderhis = macd < zeroline macdcrossup = crossover(macd, signal) longcondition = upcondition and macdunderhis and macdcrossup //strategy buy long if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true) strategy.entry("long", strategy.long) //////////////////////////////////////SHORT////////////////////////////////////////////////////////////////////////////////// enableshort = input(true, title="Enable short?") //Short Signal downcondition = close < emaSmooth and close[1] < emaSmooth[1] macdoverhis = macd > zeroline macdcrosunder = crossunder(macd, signal) shortcondition = downcondition and macdoverhis and macdcrosunder //strategy buy short if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true) strategy.entry("short", strategy.short) //////////////////////////////////////EXIT CONDITION////////////////////////////////////////////////////////////////////////////////// bought = strategy.position_size[1] < strategy.position_size sold = strategy.position_size[1] > strategy.position_size barsbought = barssince(bought) barssold = barssince(sold) //////LOWEST LOW////// //Lowest Low LONG profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9) loLen = input(title="Lowest Low Lookback", type=input.integer, defval=46, minval=2) stop_level_long = lowest(low, loLen)[1] if strategy.position_size>0 profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong) strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long) //Lowest Low SHORT profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1) highLen = input(title="highest high lookback", type=input.integer, defval=25, minval=2) stop_level_short = highest(high, highLen)[1] if strategy.position_size<0 profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort) strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short) //PLOTT TP SL plot(stop_level_long, title="SL Long", linewidth=1, color=color.red) plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)