Эта стратегия объединяет индикаторы EMA и RSI для определения направления тренда и принятия торговых решений. Она длинна, когда цена выше EMA, а RSI ниже точки покупки, и коротка, когда цена ниже EMA, а RSI выше точки продажи. Она также использует связь между последними двумя закрытиями свечей для определения направления тренда для торговли трендом.
Вычислить 200-дневный EMA как индикатор линии тренда.
Вычислить 14-дневный RSI, чтобы судить о условиях перекупления и перепродажи. RSI ниже 50 считается перепроданным, а выше 50 - перекупленным.
Для определения направления тренда сравнить размеры взаимосвязей между последними двумя закрытиями свечей.
Когда в восходящем тренде цена выше 200-дневной EMA, а RSI ниже 50 и повышается, генерируется сигнал покупки.
При понижающемся тренде, цене ниже 200-дневной EMA, а RSI выше 50 и падает, генерируется сигнал продажи.
ATR и самые высокие/низкие цены последних 14 свечей используются для расчета стоп-лосса и прибыли.
Принять стратегию отставания для управления рисками.
Сочетание двух индикаторов повышает точность определения направления тренда.
Статус RSI перекуплен/перепродан позволяет избежать ненужных сделок, вызванных отставанием EMA.
Задержка эффективно контролирует потери, вызванные случайными большими колебаниями амплитуды.
Оптимизированная комбинация параметров повышает прочность.
EMA и RSI, вероятно, будут генерировать неправильные сигналы на больших амплитудных боковых рынках, что следует избегать.
Слишком тесный стоп-потерь вызывает частые остановки, в то время как слишком широкий стоп-потерь не контролирует потерю.
Вероятность отступления после прорыва высока. Параметр RSI должен быть расслаблен, чтобы избежать пропущенных тенденций.
Настройка параметров ATR и дистанции остановки для поиска лучших точек остановки.
Оптимизировать параметры EMA и RSI для поиска лучших комбинаций параметров.
Добавьте другие индикаторы для фильтрации, такие как MACD, Bollinger Bands и т. д., чтобы улучшить точность сигнала.
Различия в параметрах испытаний между различными продуктами для дальнейшего повышения надежности.
Попробуйте отключить стратегию в определенные периоды времени, чтобы избежать неправильных сигналов в часы.
Общая стратегия довольно стабильна с устойчивыми доходами, максимальным снижением и коэффициентом Шарпа. Ее можно еще больше улучшить путем оптимизации параметров и корректировки стоп-лосса. Также необходимо следить за неправильными сигналами во время конкретных рыночных условий и избегать их с помощью вспомогательных индикаторов или временных фильтров. Эта стратегия имеет потенциал стать долгосрочной стабильной стратегией посредством непрерывной оптимизации.
/*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))