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.
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.
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.
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.
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.
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.
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.
El uso de estrategias móviles de stop loss para controlar el riesgo.
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.
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.
El Stop Loss móvil controla eficazmente las pérdidas causadas por las fluctuaciones individuales de gran amplitud.
La combinación de parámetros optimizada hace que los parámetros de la estrategia sean más robustos.
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.
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.
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.
Ajuste adecuadamente los parámetros ATR y la distancia de parada para encontrar un mejor punto de parada.
Optimización de los parámetros de EMA y RSI para encontrar la combinación de parámetros más adecuada.
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.
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.
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.
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.
/*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))