Stratégie de négociation de tendance de l'EMA et du RSI

Auteur:ChaoZhang est là., Date: 2023-09-20 14h21 et 16h
Les étiquettes:

Résumé

Cette stratégie combine les indicateurs EMA et RSI pour identifier la direction de la tendance et prendre des décisions de trading. Elle va long lorsque le prix est au-dessus de l'EMA et que l'RSI est en dessous du point d'achat, et va court lorsque le prix est en dessous de l'EMA et que l'RSI est au-dessus du point de vente.

La logique de la stratégie

  1. Calculer l'EMA de 200 jours comme indicateur de la ligne de tendance.

  2. Calculer le RSI de 14 jours pour juger des conditions de surachat et de survente. RSI inférieur à 50 est considéré comme survendu, tandis que au-dessus de 50 est considéré comme suracheté.

  3. Comparez la relation de taille entre les deux dernières clôtures de bougies pour déterminer la direction de la tendance.

  4. Lorsqu'il y a une tendance haussière, un prix supérieur à l'EMA de 200 jours et un RSI inférieur à 50 et en hausse, un signal d'achat est généré.

  5. Lorsqu'il y a une tendance à la baisse, un prix inférieur à l'EMA de 200 jours et un RSI supérieur à 50 et en baisse, un signal de vente est généré.

  6. L'ATR et les prix les plus élevés/les plus bas des 14 dernières bougies sont utilisés pour calculer le stop loss et le take profit.

  7. Adopter une stratégie de trailing stop pour la gestion des risques.

Analyse des avantages

  1. La combinaison de deux indicateurs améliore la précision dans la détermination de la direction de la tendance.

  2. L'indice de volatilité évitera efficacement les fausses ruptures.

  3. L'arrêt de traction contrôle efficacement les pertes causées par de grandes fluctuations d'amplitude occasionnelles.

  4. Une combinaison de paramètres optimisée améliore la robustesse.

Analyse des risques

  1. Il est probable que l'EMA et le RSI génèrent des signaux incorrects sur les marchés latéraux à grande amplitude, ce qui devrait être évité.

  2. Une perte d'arrêt trop étroite entraîne des arrêts fréquents tandis qu'une perte d'arrêt trop large ne permet pas de contrôler la perte.

  3. La probabilité d'un recul après une percée est élevée. Le paramètre RSI doit être assoupli pour éviter de manquer des tendances.

Directions d'amélioration

  1. Ajustez le paramètre ATR et la distance d'arrêt pour trouver de meilleurs points d'arrêt.

  2. Optimiser les paramètres EMA et RSI pour trouver de meilleures combinaisons de paramètres.

  3. Ajouter d'autres indicateurs pour la filtration, tels que le MACD, les bandes de Bollinger, etc., pour améliorer la précision du signal.

  4. Différences de paramètres d'essai entre différents produits pour améliorer encore la robustesse.

  5. Essayez de désactiver la stratégie pendant des périodes de temps spécifiques pour éviter les heures de mauvais signaux.

Résumé

La stratégie globale est assez stable avec des rendements stables, un tirage maximum et un ratio Sharpe. Elle peut être améliorée par l'optimisation des paramètres et l'ajustement des stop-loss. Il faut également surveiller les mauvais signaux pendant les conditions spécifiques du marché et les éviter via des indicateurs auxiliaires ou des filtres temporels. Cette stratégie a le potentiel de devenir une stratégie stable à long terme grâce à une optimisation continue.


/*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))

Plus de