Stratégie de trading de tendance basée sur l'EMA et le RSI


Date de création: 2023-09-20 14:21:16 Dernière modification: 2023-09-20 14:21:16
Copier: 0 Nombre de clics: 894
1
Suivre
1617
Abonnés

Aperçu

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.

Principe de stratégie

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

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

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

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

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

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

  7. La stratégie de stop loss mobile est utilisée pour contrôler le risque.

Analyse des avantages

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

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

  3. Le stop-loss mobile permet de contrôler efficacement les pertes causées par des fluctuations individuelles de grande amplitude.

  4. Les combinaisons de paramètres optimisées rendent les paramètres de stratégie plus robustes.

Analyse des risques

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

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

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

Direction d’optimisation

  1. Ajustez les paramètres ATR et la distance de rupture pour trouver un meilleur point de rupture.

  2. Optimiser les paramètres des indicateurs EMA et RSI pour trouver la combinaison de paramètres la plus appropriée.

  3. L’ajout d’autres indicateurs auxiliaires, tels que MACD, bande de Brin, etc. pour le filtrage, améliore la précision du signal.

  4. La variabilité des paramètres de différentes variétés peut être testée pour améliorer encore la stabilité des paramètres.

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

Résumer

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.

Code source de la stratégie
/*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))