Стратегия трендовой торговли на основе EMA и RSI


Дата создания: 2023-09-20 14:21:16 Последнее изменение: 2023-09-20 14:21:16
Копировать: 0 Количество просмотров: 894
1
Подписаться
1617
Подписчики

Обзор

Эта стратегия объединяет два показателя EMA и RSI для определения направления тренда и совершения входа и выхода. Когда цена выше EMA и RSI ниже точки покупки, она становится позитивной; когда цена ниже EMA и RSI выше точки продажи, она становится пассивной.

Стратегический принцип

  1. Вычислить 200-дневную ЭМА, как среднелинейный показатель для определения тенденции. ЭМА быстро реагирует на изменения цены и может эффективно определять направление тенденции.

  2. Рассчитывается 14-дневный RSI, чтобы определить, является ли это перекуп или перепродажа. RSI ниже 50 рассматривается как перепродажа, а выше 50 - как перекуп.

  3. Сравнение величины и направления тренда двух последних K-линий. Последние две линии считаются в восходящем тренде, а в нисходящем - в нисходящем.

  4. Сигнал покупки появляется, когда цена находится в восходящем тренде и превышает 200-дневную ЭМА, а RSI находится ниже 50 и восходит.

  5. Сигнал продажи подается, когда цена находится в нисходящем тренде, ниже 200-дневной ЭМА, а RSI выше 50 и снижается.

  6. ATR и самые высокие и самые низкие цены на последних 14 K-линий используются для расчета стоп-стоп и остановочных точек.

  7. Применение мобильной стратегии по прекращению убытков для контроля риска.

Анализ преимуществ

  1. Двойной индикатор в сочетании с определением направления тенденции повышает точность. EMA определяет основную тенденцию, RSI и K-линия определяет локальную тенденцию и время покупки и продажи.

  2. RSI эффективно избегает ложных прорывов. Популярность RSI позволяет избежать ненужных сделок, вызванных отставанием от EMA.

  3. Мобильный стоп эффективно контролирует убытки от индивидуальных колебаний большой амплитуды.

  4. Оптимизированные комбинации параметров делают параметры стратегии более надежными.

Анализ рисков

  1. В условиях больших амплитудных колебаний EMA и RSI имеют большую вероятность создания ошибочных сигналов, поэтому следует избегать таких ситуаций.

  2. Слишком маленькая точка остановки может привести к слишком частому остановке; слишком большая точка остановки может быть трудной для контроля потерь. ATR параметры должны быть соответствующим образом скорректированы.

  3. После прорыва EMA в дневное время вероятность обратной коррекции высока, поэтому RSI должен быть расслаблен, чтобы избежать пропущенной тенденции.

Направление оптимизации

  1. Применение ATR-параметров и остановочных расстояний для поиска лучших остановочных точек.

  2. Оптимизация параметров EMA и RSI, чтобы найти более подходящую комбинацию параметров.

  3. Добавление других вспомогательных показателей для фильтрации, таких как MACD, Брин-пояса и т. д., повышает точность сигнала.

  4. Можно проверить различия в параметрах настройки различных сортов, чтобы повысить стабильность параметров.

  5. Можно попытаться закрыть стратегию в определенный промежуток времени, чтобы избежать периодов времени, которые могут привести к ошибочным сигналам.

Подвести итог

Стратегия в целом стабильна, доход стабилен, максимальный отзыв и коэффициент Шарпа также очень хороши. Эффективность стратегии может быть дополнительно повышена с помощью оптимизации параметров и корректировки стоп-стоп.

Исходный код стратегии
/*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))