Estrategia de negociación de tendencias de EMA y RSI

El autor:¿ Qué pasa?, Fecha: 2023-09-20 14:21:16
Las etiquetas:

Resumen general

Esta estrategia combina los indicadores EMA y RSI para identificar la dirección de la tendencia y tomar decisiones comerciales. Va largo cuando el precio está por encima de la EMA y el RSI está por debajo del punto de compra, y va corto cuando el precio está por debajo de la EMA y el RSI está por encima del punto de venta. También utiliza la relación entre los dos últimos cierres de velas para determinar la dirección de la tendencia para el comercio de tendencias.

Estrategia lógica

  1. El EMA responde rápidamente a los cambios de precios y determina efectivamente la dirección de la tendencia.

  2. Calcular el RSI de 14 días para juzgar las condiciones de sobrecompra y sobreventa. RSI por debajo de 50 se considera sobreventa, mientras que por encima de 50 se considera sobrecompra. También utilizar la tendencia al alza o a la baja del RSI para determinar el momento de entrada y salida.

  3. Compare la relación de tamaño entre los dos últimos cierres de velas para determinar la dirección de la tendencia.

  4. Cuando en una tendencia alcista, el precio está por encima de la EMA de 200 días, y el RSI por debajo de 50 y en aumento, se genera una señal de compra.

  5. Cuando en una tendencia bajista, el precio por debajo de la EMA de 200 días, y el RSI por encima de 50 y bajando, se genera una señal de venta.

  6. El valor de las pérdidas se calculará en función de las condiciones de los precios de las últimas velas.

  7. Adoptar una estrategia de detención de trailers para la gestión del riesgo.

Análisis de ventajas

  1. La combinación de los dos indicadores mejora la precisión en la determinación de la dirección de la tendencia.

  2. El estado de sobrecompra/sobreventa del RSI evita operaciones innecesarias causadas por el retraso de la EMA.

  3. La parada de seguimiento controla eficazmente las pérdidas causadas por grandes fluctuaciones de amplitud ocasionales.

  4. La combinación optimizada de parámetros mejora la robustez.

Análisis de riesgos

  1. Es probable que la EMA y el RSI generen señales incorrectas en los mercados laterales de gran amplitud, lo que debe evitarse.

  2. Una pérdida de parada demasiado estrecha causa paradas frecuentes, mientras que una pérdida de parada demasiado amplia no controla la pérdida.

  3. La probabilidad de retroceso después del avance es alta.

Direcciones de mejora

  1. Ajuste el parámetro ATR y la distancia de detención para encontrar mejores puntos de detención de pérdidas.

  2. Optimizar los parámetros EMA y RSI para encontrar mejores combinaciones de parámetros.

  3. Añadir otros indicadores para la filtración, como MACD, bandas de Bollinger, etc., para mejorar la precisión de la señal.

  4. Diferencias de parámetros de ensayo entre diferentes productos para mejorar aún más la robustez.

  5. Intente desactivar la estrategia durante períodos de tiempo específicos para evitar horas propensas a señales incorrectas.

Resumen de las actividades

La estrategia general es bastante estable con rendimientos constantes, extracción máxima y relación Sharpe. Se puede mejorar aún más mediante la optimización de parámetros y el ajuste de stop loss. También es necesario estar atento a las señales incorrectas durante condiciones específicas del mercado, y evitarlas a través de indicadores auxiliares o filtros de tiempo.


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

Más.