Stratégie de suivi des tendances croisées de la MACD EMA

Auteur:ChaoZhang est là., Date: 18 février 2024
Les étiquettes:

img

Résumé

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.

La logique de la stratégie

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.

Analyse des avantages

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.

Analyse des risques

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.

Directions d'optimisation

Les principales orientations d'optimisation de cette stratégie sont les suivantes:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

Conclusion

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)

Plus de