
La stratégie est une stratégie de suivi de tendance basée sur un double croisement de 10 EMA et 50 EMA. Elle combine les 10 EMA de la ligne horaire comme jugement auxiliaire pour trouver dynamiquement la direction de la tendance dans un marché où les taureaux et les ours alternent, permettant ainsi un arrêt de suivi automatique.
La logique de base de la stratégie est basée sur la fourche dorée de 10 EMA et 50 EMA. Plus précisément, lorsque 10 EMA passe par le bas pour former la fourche dorée de 50 EMA, le cours est jugé à la hausse; lorsque 10 EMA passe par le bas pour former la fourche dorée de 50 EMA, le cours est jugé à la baisse.
En outre, la stratégie introduit également le 10EMA de la ligne horaire comme jugement auxiliaire, qui ouvre une position supplémentaire après la fourche dorée seulement lorsque la 10EMA de la ligne horaire est en tendance à la hausse, et ouvre une position vide après la fourche dorée seulement lorsque la 10EMA de la ligne horaire est en tendance à la baisse, afin de filtrer certains faux signaux.
Après l’ouverture de la position, la stratégie utilise un mode de sortie suivi d’un stop loss + d’un stop price. Le stop loss permet de verrouiller les bénéfices et de maximiser les bénéfices de la transaction; le stop price garantit la fermeture de la position pour obtenir des bénéfices lorsque le prix atteint le point cible.
Le plus grand avantage de cette stratégie réside dans l’utilisation de la croix EMA pour déterminer la direction de la tendance principale, tout en introduisant des signaux de filtrage d’indicateurs auxiliaires, qui peuvent filtrer efficacement les fausses croix et ainsi améliorer la fiabilité du signal. En outre, la double croix EMA combinée avec le suivi des arrêts de perte et des arrêts de prix limite, permet à la fois de maximiser les gains de suivi de la tendance et de contrôler efficacement les risques de négociation.
Cette stratégie permet de déterminer plus précisément la direction et les amplitudes de la tendance par rapport à une stratégie d’indicateur unique. Comparée au stop loss traditionnel, la stratégie utilise une technologie de stop loss de suivi plus avancée pour mieux localiser les bénéfices.
La stratégie est principalement exposée à des risques de whipsaw intermittent et de revers de tendance. Des signaux de fausses croix successifs peuvent entraîner une arbitrage de la stratégie. De plus, des revers de prix après l’ouverture d’une position peuvent également entraîner des pertes.
Pour réduire le risque de whipsaw, la stratégie ajoute des indicateurs auxiliaires pour filtrer les signaux. Pour contrôler le risque de renversement de tendance, la stratégie adopte une gamme de stop plus tolérante, tandis que le paramètre de stop-limit peut également aider à réduire ce type de risque.
La stratégie peut également être optimisée de plusieurs façons: premièrement, vous pouvez tester différentes combinaisons de paramètres, tels que le cycle EMA, la racine de retard d’ouverture de position, etc., pour trouver le paramètre optimal; deuxièmement, vous pouvez introduire plus d’indicateurs auxiliaires, tels que MACD, BOLL, etc. pour filtrer le signal et améliorer la qualité du signal; troisièmement, vous pouvez optimiser la logique de stop loss, par exemple en utilisant d’autres méthodes de stop loss, telles que le stop loss de temps, le stop loss d’oscillation; quatrièmement, vous pouvez combiner plus de conditions d’ouverture de la stratégie de négociation, telles que le déclenchement du signal uniquement pendant une certaine période de temps ou sous une certaine hausse ou baisse.
La stratégie de suivi de tendance à double croisement de 10 EMA, qui permet de déterminer la direction de la tendance actuelle en utilisant l’EMA golden cross et la croix de la mort, de définir des arrêts de suivi et des arrêts de prix pour bloquer les bénéfices et contrôler les risques, tout en combinant des signaux de filtrage d’indicateurs auxiliaires pour améliorer la qualité des signaux, est une stratégie de trading de tendance plus complète. Par rapport à l’indicateur unique et au stop loss traditionnel, la stratégie présente des avantages tels que l’exactitude du jugement, l’optimisation des arrêts et des pertes, ainsi que la possibilité d’obtenir efficacement des gains de tendance.
/*backtest
start: 2022-12-22 00:00:00
end: 2023-12-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("10ema Strat 9", overlay=true, format=format.price)
//#region // inputs for candles
//time
t1 = time(timeframe.period,"0930-1500") //last hour of market is not ideal for trading
// candle status
bullish = close > open and barstate.isconfirmed
bearish = open > close and barstate.isconfirmed
bullcandle = ta.valuewhen(bullish, close, 0)
bearcandle = ta.valuewhen(bearish, close, 0)
ema1 = input.int(10, minval=1, title="short ema")
ema2 = input.int(50, minval=1, title="long ema")
ema3 = input.int(200, minval=1, title="hourly 10 ema")
//@variable Input for source
src = input(close, title="Source")
offsetema = input.int(title="Offset", defval=0, minval=-500, maxval=500)
sema = ta.ema(src, ema1)//@variable Input for smaller ema1
lema = ta.ema(src, ema2)//@variable Input for longer ema2
hema = ta.ema(src, ema3)// @variable Input for hourly ema3
bullcrosscount = ta.barssince(ta.crossover(sema,lema)) //@variable Input 10/50 cross higher
bearcrosscount = ta.barssince(ta.crossunder(sema,lema)) //@variable Input 10/50 cross lower
ideallong = bullcrosscount <= 5 //number of candles after the cross
idealshort = bearcrosscount <= 5 //number of candles after the cross
emabull = (sema > lema) and bearish and close > sema and close > hema and ideallong and t1 and barstate.isconfirmed
xemabull = ta.barssince(emabull)
dbullema = emabull and emabull[1] and xemabull <=1
bullentry = if dbullema
ta.valuewhen(emabull[1], high + 0.05, 0)
else
ta.valuewhen(emabull, high + 0.05, 0)
bullentryh = dbullema ? bullentry[1] : bullentry
bullentrylow = ta.valuewhen(emabull, low - 0.05, 0)
bullstop = (bullentryh - bullentrylow) <= 1.00 ? bullentryh - 1.00 : (bullentryh - bullentrylow) <= 10.40 ? bullentrylow : na
bulltarget = (bullentryh - bullstop) * 1.62 + bullentryh
// bear setup
emabear = (sema < lema) and bullish and close < sema and close < hema and idealshort and t1 and barstate.isconfirmed
xemabear = ta.barssince(emabear)
dbearema = emabear and emabear [1] and xemabear <=1
bearentry = if dbearema
ta.valuewhen(emabear[1], low - 0.05, 0)
else
ta.valuewhen(emabear, low - 0.05, 0)
bearentryh = dbearema ? bearentry[1] : bearentry
bearentryhigh = ta.valuewhen(emabear, high + 0.05, 0)
bearstop = (bearentryhigh - bearentryh) <= 1.00 ? bearentryh + 1.00 : (bearentryh - bearentryhigh) <= 10.40 ? bearentryhigh : na
beartarget = bearentryh - (bearstop-bearentryh) * 1.62
bullclose = (xemabull <=7) and bullish and bullcrosscount >=1 and barstate.isconfirmed //number of candles for a close above
bearclose = (xemabear <=7) and bearish and bearcrosscount >=1 and barstate.isconfirmed //number of candles for a close below
buyzone = ta.barssince(bullclose)
shortzone = ta.barssince(bearclose)
idealbuy = close >= bullentryh and bullclose and (buyzone<=7)
idealsell = close <= bearentryh and bearclose and (shortzone<=7)
// // bull setup on chart
// if sema > lema and xemabull < 50
// var line line_bullentry = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
// if emabull
// line.set_xy1(line_bullentry, x=bar_index, y=bullentryh)
// line.set_xy2(line_bullentry, x=bar_index, y=bullentryh)
// alert("EMA-bullish", alert.freq_once_per_bar_close)
// line.set_x2(line_bullentry, x=bar_index)
// var line line_bullstop = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
// if emabull
// line.set_xy1(line_bullstop, x=bar_index, y=bullstop)
// line.set_xy2(line_bullstop, x=bar_index, y=bullstop)
// line.set_x2(line_bullstop, x=bar_index)
// var line line_bulltarget = line.new(bar_index, na, bar_index + 1, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
// if emabull
// line.set_xy1(line_bulltarget, x=bar_index, y=bulltarget)
// line.set_xy2(line_bulltarget, x=bar_index, y=bulltarget)
// line.set_x2(line_bulltarget, x=bar_index)
// //bear setup on chart
// if sema < lema and xemabear < 50
// var line line_bearentry = line.new(bar_index, na, bar_index, na, color=color.rgb(0, 200, 0), style=line.style_solid, width=1)
// if emabear
// line.set_xy1(line_bearentry, x=bar_index, y=bearentryh)
// line.set_xy2(line_bearentry, x=bar_index, y=bearentryh)
// alert("EMA-bearish", alert.freq_once_per_bar_close)
// line.set_x2(line_bearentry, x=bar_index)
// var line line_bearstop = line.new(bar_index, na, bar_index, na, color=color.rgb(250, 0, 0), style=line.style_solid, width=1)
// if emabear
// line.set_xy1(line_bearstop, x=bar_index, y=bearstop)
// line.set_xy2(line_bearstop, x=bar_index, y=bearstop)
// line.set_x2(line_bearstop, x=bar_index)
// var line line_beartarget = line.new(bar_index, na, bar_index, na, color=color.rgb(200, 100, 200), style=line.style_solid, width=1)
// if emabear
// line.set_xy1(line_beartarget, x=bar_index, y=beartarget)
// line.set_xy2(line_beartarget, x=bar_index, y=beartarget)
// line.set_x2(line_beartarget, x=bar_index)
//#endregion
//execution
if idealbuy
strategy.close("sell", comment=na)
strategy.entry("buy", strategy.long, limit=bullentryh, stop=bullstop, comment="buy")
strategy.exit("exit","buy", trail_points = low, trail_offset = 5, qty_percent=100, limit=bulltarget, stop=bullstop)
if idealsell
strategy.close("buy",comment=na)
strategy.entry("sell", strategy.short, limit=bearentryh, stop=bearstop, comment="sell")
strategy.exit("exit","sell", trail_points = low, trail_offset = 5, qty_percent=100, limit=beartarget, stop=bearstop)
// strategy.close_all(time == close_day)
//#region // graphical analysis
//Plots
plotshape(emabull, location=location.belowbar, title='emabull')
plotshape(idealbuy, style=shape.circle, color=color.green, title="bull close")
plotshape(emabear, title='emabear')
plotshape(idealsell, location=location.belowbar, style=shape.circle, color=color.red, title="bear close")
// //Dashboard
// var label id = na
// label.delete(id) // Delete last label
// i_offsetLabel = input(15, "Data Dashboard Offset")
// offset = i_offsetLabel * (time - time[1])
// dynamicText = "= Bull Setup ="
// id := label.new(x=time + offset, y=open, xloc=xloc.bar_time, text=dynamicText, color=color.rgb(255, 255, 255), size=size.normal)
// label.set_textcolor(id, color.rgb(0, 0, 0))
// label.set_text(id=id, text=dynamicText)
// label.set_textalign(id, text.align_left)
// label.set_text(id=id, text=dynamicText)
// f_round( _val, _decimals) =>
// _p = math.pow(10, _decimals)
// math.round(math.abs(_val) * _p) / _p * math.sign(_val)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bulltarget,2)) + " :Target"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullentryh,2)) + " :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bullstop,2)) + " :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + "= Bear Setup ="
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearstop,2)) + " :Stop"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(bearentryh,2)) + " :Entry"
// label.set_text(id=id, text=dynamicText)
// dynamicText := dynamicText + "\n" + str.tostring(f_round(beartarget,2)) + " :Target"
// label.set_text(id=id, text=dynamicText)
// //#endregion