Cette stratégie permet de déterminer la direction de la tendance en calculant la croisée de l’indicateur MACD et de la ligne de signal de la moyenne mobile, et en combinaison avec l’indicateur EMA pour juger de la force de la tendance actuelle, pour réaliser un suivi de la tendance. Lorsque la ligne MACD se déplace de bas en haut, la ligne de signal se déplace de haut en bas, et la ligne EMA peut également juger de la force de la tendance et ainsi filtrer les fausses ruptures.
La stratégie est basée sur la direction de la tendance et le moment de l’entrée dans le MACD. La ligne MACD indique que la ligne de signal de rupture indique que la tendance est inversée, donc la direction de la rupture est jugée plus courte. La logique de jugement spécifique est de faire plus lorsque le prix de clôture est supérieur à la moyenne EMA et que la ligne MACD dépasse la ligne de signal en dessous.
L’EMA sert à juger de la tendance, si le prix est supérieur à l’EMA indiquant une tendance à la hausse, une rupture du MACD en dessous est susceptible de former un signal de croix dorée en cours; si le prix est inférieur à l’EMA indiquant une tendance à la baisse, une rupture du MACD en haut est susceptible de former un signal de croix morte. La longueur de l’EMA détermine également le degré moyen ou long terme de la tendance.
De cette façon, vous pouvez entrer en jeu à temps lorsque les prix commencent à se retourner pour former une nouvelle tendance, ce qui permet de suivre la tendance.
Cette stratégie, combinée à un double critère de jugement, prend en compte la direction de la tendance des prix et utilise l’indicateur pour déterminer le moment d’entrée spécifique, évitant ainsi le risque de fausse rupture, ce qui renforce la fiabilité de la stratégie. Par rapport à l’utilisation d’un seul indicateur MACD, la stratégie permet de déterminer plus précisément le début d’une nouvelle tendance.
L’utilisation de la moyenne EMA permet également à la stratégie de filtrer dans une certaine mesure l’effet des fluctuations à court terme et de bloquer les tendances de la ligne moyenne et longue. Cela est utile pour jouer sur l’effet d’inversion du jugement de l’indicateur MACD.
De plus, la stratégie peut être utilisée dans des conditions de marché où le lotus est en hausse et en baisse, 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 plus grande probabilité de déterminer un fakeout, et que le signal peut être mal identifié. Le fonctionnement auxiliaire de l’EMA est alors nécessaire, mais il est possible que cela ne fonctionne pas dans des cas particuliers.
En outre, la stratégie utilise un ratio de gain et de perte pour définir les conditions de stop-loss, ce qui présente un certain degré de subjectivité et peut affecter l’efficacité de la stratégie si elle n’est pas correctement définie.
Enfin, la stratégie a simplement placé le nombre d’ouvertures de positions à 100% des intérêts sur le compte, sans tenir compte des problèmes de gestion des fonds, ce qui présente également un certain risque dans le jeu physique.
La stratégie a été conçue dans le but d’optimiser:
L’ajout d’autres indices de jugement, formant des combinaisons d’indicateurs, permet d’éviter davantage la probabilité que le MACD émette le mauvais signal. Par exemple, KDJ, BOLL, etc. peuvent être considérés.
La longueur moyenne de l’EMA peut être optimisée en plusieurs combinaisons pour trouver les meilleurs paramètres permettant de déterminer la direction de la tendance.
Les paramètres du MACD peuvent également être optimisés pour trouver les paramètres les plus précis permettant de déterminer le moment de l’inversion.
L’ajout de modules de gestion de fonds, tels que le ratio profit/perte, peut être utilisé comme entrée dynamique, mais aussi comme paramètre de stop-loss.
Tester l’efficacité de différents types de contrats pour trouver ceux qui correspondent le mieux, comme les crypto-monnaies, les futures sur indices boursiers, etc.
La stratégie de suivi de la tendance croisée en or MACD EMA est relativement simple et pratique dans l’ensemble, elle assure la fiabilité du signal grâce à un double critère de jugement, et définit un moyen raisonnable d’arrêter les pertes et de bloquer les bénéfices. La principale opportunité d’optimisation est la sélection de paramètres, la combinaison d’indicateurs, la gestion des fonds, etc. Si les tests sont optimisés davantage, la stratégie peut devenir l’une des stratégies de suivi de tendance 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)