Cette stratégie combine deux indicateurs, l’EMA et le RSI, pour identifier la direction de la tendance et effectuer des transactions d’entrée et de sortie. Il est favorable lorsque le prix est au-dessus de l’EMA et le RSI est en dessous du point d’achat; il est négatif lorsque le prix est en dessous de l’EMA et le RSI est au-dessus du point de vente.
L’EMA à 200 jours est utilisé comme indicateur de tendance. L’EMA réagit rapidement aux variations de prix et permet de déterminer efficacement la direction de la tendance.
Calculer le RSI à 14 jours pour déterminer si l’indice est en hausse ou en hausse. Un RSI inférieur à 50 est considéré comme étant en hausse et un RSI supérieur à 50 est considéré comme étant en hausse.
Comparer la taille et la direction de la tendance des deux dernières lignes K. Les deux dernières lignes de clôture sont considérées comme étant en hausse et en baisse.
Un signal d’achat est émis lorsque le cours est en hausse, au-dessus de l’EMA de 200 jours et lorsque le RSI est en hausse et au-dessous de 50.
Un signal de vente est émis lorsque le cours est en baisse, en dessous de l’EMA de 200 jours et lorsque le RSI est supérieur à 50 et en baisse.
Les valeurs maximales et minimales de l’ATR et des 14 lignes K les plus récentes sont utilisées pour calculer les points d’arrêt et d’arrêt.
La stratégie de stop loss mobile est utilisée pour contrôler le risque.
Les doubles indicateurs permettent de juger de la direction de la tendance avec une plus grande précision. L’EMA détermine la tendance principale, le RSI et la relation K détermine la tendance locale et le moment de la vente.
L’indicateur RSI évite efficacement les fausses ruptures. Il évite les transactions inutiles entraînées par le retard de l’indicateur EMA grâce à l’état vide du RSI.
Le stop-loss mobile permet de contrôler efficacement les pertes causées par des fluctuations individuelles de grande amplitude.
Les combinaisons de paramètres optimisées rendent les paramètres de stratégie plus robustes.
Dans le cas de tremblements de grande amplitude, l’EMA et le RSI sont plus susceptibles de produire de faux signaux et doivent être évités.
Un point d’arrêt trop petit peut entraîner un arrêt trop fréquent; un point d’arrêt trop élevé est difficile à contrôler. Les paramètres ATR doivent être ajustés de manière appropriée.
Il y a une forte probabilité d’une reprise après une rupture de l’EMA pendant la journée, au cours de laquelle le paramètre RSI devrait être assoupli de manière appropriée pour éviter de rater la tendance.
Ajustez les paramètres ATR et la distance de rupture pour trouver un meilleur point de rupture.
Optimiser les paramètres des indicateurs EMA et RSI pour trouver la combinaison de paramètres la plus appropriée.
L’ajout d’autres indicateurs auxiliaires, tels que MACD, bande de Brin, etc. pour le filtrage, améliore la précision du signal.
La variabilité des paramètres de différentes variétés peut être testée pour améliorer encore la stabilité des paramètres.
Vous pouvez essayer de fermer la stratégie pendant une période donnée, en évitant les périodes de temps qui sont susceptibles de générer de faux signaux.
La stratégie est globalement stable, les gains sont stables, le retrait maximal et le taux de Sharp sont également très bons. L’efficacité de la stratégie peut être encore améliorée par l’optimisation des paramètres et l’ajustement des points de rupture.
/*backtest
start: 2023-01-01 00:00:00
end: 2023-08-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// strategy("EMA RSI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Author : AJ Rupasinghege
// Date : 06/11/2022
// Release : v6.0
// Description : If the last two closes are in ascending order, the rsi is below 50 and ascending, and the current candle is above 200 ema, then LONG.
// If the last two closes are in descending order, the rsi is above 50 and descending, and the current candle is below 200 ema, then SHORT.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// INPUTS //////////////////////////////////////////////////////////////
ema_length = input(200, "EMA Length")
rsi_buy_value = input(50, "RSI Buy Value")
rsi_sell_value = input(50, "RSI Sell Value")
show_data = input.bool(0, "Show Data")
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////
var stop_loss = 0.0
var last_trade_entry_price = 0.0
var low_value= 0.0
var atr = 0.0
var high_value = 0.0
var stop_loss_points = 0.0
var limit = 0.0
var bar_id_entry = 0
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// FUNCTIONS //////////////////////////////////////////////////////////
getTradeConditionsLong() =>
//@function Used to calculate stop_loss, stop_loss points, limit and label values for long trades
//@param direction (float) // strategy.poistion.size
//@returns stop_loss, stop_loss_points, limit
//@Dependancies low_value, atr, last_trade_entry_price,bar_id_entry
_stop_loss = low_value - atr
_stop_lossPoints = (last_trade_entry_price - _stop_loss) *100000
_limit = last_trade_entry_price + (last_trade_entry_price - low_value + atr)
value = "OpenValue: " + str.tostring(last_trade_entry_price) +
"\n OpenBarIndex: " + str.tostring(bar_id_entry) +
"\n LowValue: " + str.tostring(low_value) +
"\n atr: " + str.tostring(atr) + "\n stop_loss: " +
str.tostring(_stop_loss) + "\n Limit: " +
str.tostring(_limit)
[_stop_loss,_stop_lossPoints,_limit, value]
getTradeConditionsShort() =>
//@function Used to calculate stop_loss, stop_loss points, limit and label values for short trades
//@param direction (float) // strategy.poistion.size
//@returns stop_loss, stop_loss_points, limit
//@Dependancies high_value, atr, last_trade_entry_price,bar_id_entry
_stop_loss = high_value + atr
_stop_lossPoints = (_stop_loss -last_trade_entry_price) * 100000
_limit = last_trade_entry_price - (high_value - last_trade_entry_price + atr)
value = "OpenValue: " + str.tostring(last_trade_entry_price) +
"\n OpenBarIndex: " + str.tostring(bar_id_entry) +
"\n HighValue: " + str.tostring(high_value) +
"\n atr: " + str.tostring(atr) + "\n stop_loss: " +
str.tostring(_stop_loss) + "\n Limit: " +
str.tostring(_limit)
[_stop_loss,_stop_lossPoints,_limit, value]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// SIGNALS //////////////////////////////////////////////////////////
ema = ta.ema(close,ema_length)
rsi = ta.rsi(close,14)
ema_buy_signal = ema < low
ema_sell_signal = ema > high
rsi_buy_signal = rsi < rsi_buy_value and rsi[1] < rsi[0]
rsi_sell_signal = rsi > rsi_sell_value and rsi[1] > rsi[0]
trend_buy_signal = close[2] < close[1] and close[1] < close[0]
trend_sell_signal = close[2] > close[1] and close[1] > close[0]
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// TRADES //////////////////////////////////////////////////////////
long = trend_buy_signal
and ema_buy_signal
and rsi_buy_signal
short = trend_sell_signal
and ema_sell_signal
and rsi_sell_signal
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// STRATEGY //////////////////////////////////////////////////////////
if long
strategy.entry("Long", strategy.long)
if short
strategy.entry("Short", strategy.short)
// Calculate Trade Entry Variables
last_trade_entry_price := strategy.opentrades.entry_price(strategy.opentrades - 1)
bar_id_entry := strategy.opentrades.entry_bar_index(strategy.opentrades - 1)
atr := ta.atr(14)
low_value := ta.lowest(14)
high_value := ta.highest(14)
// Exit Strategy for Long Positions
if (strategy.position_size[1] != strategy.position_size and strategy.position_size>0)
[_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsLong()
stop_loss := _stop_loss
stop_loss_points := _stop_loss_points
limit := _limit
if show_data
label.new(bar_id_entry,stop_loss - 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none)
strategy.exit("Long Exit", "Long", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit )
// Exit Strategy for Short Positions
if (strategy.position_size[1] != strategy.position_size and strategy.position_size<0)
[_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsShort()
stop_loss := _stop_loss
stop_loss_points := _stop_loss_points
limit := _limit
if show_data
label.new(bar_id_entry,stop_loss + 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none)
strategy.exit("Short Exit", "Short", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit )
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// PLOTS //////////////////////////////////////////////////////////
plot(ema, "SMA", color = color.blue, linewidth = 2 )
p1 = plot(strategy.position_size>0? stop_loss:na, style = plot.style_linebr , color = color.rgb(82, 240, 42) )
p2 = plot(strategy.position_size<0? stop_loss:na, style = plot.style_linebr , color = color.rgb(223, 85, 85) )
p3 = plot(strategy.position_size!=0?limit : na, style = plot.style_linebr , color = color.rgb(94, 85, 223, 100) )
fill(p1, p3, color = color.new(color.green, 90))
fill(p2, p3, color = color.new(#e98787, 90))