Estrategia de trading de tendencias basada en EMA y RSI


Fecha de creación: 2023-09-20 14:21:16 Última modificación: 2023-09-20 14:21:16
Copiar: 0 Número de Visitas: 894
1
Seguir
1617
Seguidores

Descripción general

La estrategia combina dos indicadores, EMA y RSI, para identificar la dirección de la tendencia y realizar entradas y salidas. Cuando el precio está por encima de la EMA y el RSI está por debajo del punto de compra, el precio es positivo; cuando el precio está por debajo de la EMA y el RSI está por encima del punto de venta, el precio es negativo.

Principio de estrategia

  1. Calcula el EMA de 200 días como un indicador de línea media para determinar la tendencia. El EMA responde rápidamente a los cambios en los precios y puede determinar la dirección de la tendencia de manera eficiente.

  2. Calcula el RSI de 14 días para determinar si está sobrecomprado o sobrevendido. El RSI inferior a 50 se considera sobrecomprado y superior a 50 se considera sobrecomprado. Al mismo tiempo, combina la tendencia alcista del RSI para determinar el momento de comprar o vender.

  3. Compara la relación entre el tamaño y el precio de cierre de las dos últimas líneas K para determinar la dirección de la tendencia. Los precios de cierre de las dos últimas líneas se consideran crecientes en una tendencia alcista y decrecientes en una tendencia descendente.

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

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

  6. Los precios máximos y mínimos de ATR y de las 14 líneas K más recientes se utilizan para calcular los puntos de parada y parada.

  7. El uso de estrategias móviles de stop loss para controlar el riesgo.

Análisis de las ventajas

  1. El doble indicador combina la dirección de la tendencia para mejorar la precisión. El EMA determina la tendencia principal, el RSI y la relación de la línea K determinan la tendencia local y el momento de compra y venta.

  2. El indicador RSI evita de manera efectiva los falsos breaks. El estado de vacío del RSI evita las transacciones innecesarias causadas por el retraso del indicador EMA.

  3. El Stop Loss móvil controla eficazmente las pérdidas causadas por las fluctuaciones individuales de gran amplitud.

  4. La combinación de parámetros optimizada hace que los parámetros de la estrategia sean más robustos.

Análisis de riesgos

  1. En situaciones de gran amplitud, la probabilidad de que la EMA y el RSI produzcan señales erróneas es mayor, por lo que se debe evitar.

  2. El punto de parada demasiado pequeño puede causar un alto de frecuencia excesivo; el punto de parada demasiado grande es difícil de controlar. Se debe ajustar adecuadamente el parámetro ATR.

  3. La probabilidad de una reajuste después de la ruptura de la EMA durante el día es alta, en este momento se debe relajar adecuadamente el parámetro RSI para evitar perder la tendencia.

Dirección de optimización

  1. Ajuste adecuadamente los parámetros ATR y la distancia de parada para encontrar un mejor punto de parada.

  2. Optimización de los parámetros de EMA y RSI para encontrar la combinación de parámetros más adecuada.

  3. Se añaden otros indicadores auxiliares para la filtración, como MACD, banda de Brin, etc., para mejorar la precisión de la señal.

  4. Se puede probar la variabilidad de la configuración de los parámetros de las diferentes variedades para mejorar aún más la estabilidad de los parámetros.

  5. Se puede intentar cerrar la estrategia en un período de tiempo determinado, evitando períodos de tiempo que son propensos a generar señales erróneas.

Resumir

La estrategia en general es estable, con ganancias estables, un máximo de retirada y un índice de Sharp muy bueno. Se puede mejorar aún más la eficacia de la estrategia mediante la optimización de los parámetros y el ajuste de los puntos de parada. Al mismo tiempo, se debe estar atento a las señales de error que pueden producirse en situaciones específicas y evitarlas con indicadores auxiliares o filtros de tiempo.

Código Fuente de la Estrategia
/*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))