Стратегия отклонения от RSI

Автор:Чао Чжан, Дата: 2023-11-08 12:11:03
Тэги:

img

Обзор

Эта стратегия основана на индикаторе относительной силы (RSI) и использует принципы перекупленности / перепроданности RSI для совершения сделок. Она длинна, когда RSI превышает порог перекупленности, и коротка, когда RSI превышает порог перепроданности.

Логика стратегии

  1. Установка параметров индикатора RSI на основе данных пользователя, включая период RSI, порог перекупления и порог перепродажи.

  2. Определить, находится ли RSI в зоне перекупа или перепродажи на основе его положения относительно порогов.

  3. Когда RSI выходит из зоны перекупленности/перепроданности и пересекает соответствующую пороговую линию, совершайте сделки в противоположном направлении. Например, когда RSI выходит за пределы линии перекупленности из зоны перекупленности, рынок считается перевернутым, идите в длинный на этот момент. Когда RSI выходит за пределы линии перепроданности из зоны перепроданности, рынок считается перевернутым, идите в короткий здесь.

  4. После входа, установите стоп-лосс и возьмите линию прибыли.

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

  6. Он также позволяет торговать только в определенные временные рамки.

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

  • Использует классические принципы прорыва RSI с хорошими результатами обратных тестов.

  • Гибкое установление порога перекупки/перепродажи, подходящего для разных продуктов.

  • Факультативный EMA-фильтр позволяет избежать чрезмерных сделок.

  • Поддерживает SL/TP для повышения стабильности.

  • Поддерживает фильтр временных рамок, чтобы избежать неподходящего периода.

  • Поддерживает как длинный, так и короткий, чтобы полностью использовать двусторонние колебания цен.

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

  • Дивергенция RSI происходит часто, основываясь только на RSI может генерировать неточные сигналы. Необходимо сочетание с трендом, скользящими средними и т. Д.

  • Неправильное установление порога приводит к слишком частым или отсутствующим сделкам.

  • Плохие настройки SL/TP вызывают чрезмерную агрессивность или консервативность.

  • Неправильные настройки фильтра EMA могут пропустить действительные сделки или отфильтровать хорошие сигналы.

Решения рисков:

  • Оптимизировать параметры RSI для различных продуктов.

  • Сочетание с индикаторами тенденции для выявления расхождений.

  • Испытать и оптимизировать параметры SL/TP.

  • Тестировать и оптимизировать параметры EMA.

Руководство по оптимизации

Стратегия может быть улучшена в следующих аспектах:

  1. Оптимизировать параметры RSI для поиска оптимальных настроек для различных продуктов с помощью исчерпывающего обратного тестирования.

  2. Попробуйте использовать различные индикаторы в сочетании с RSI или заменить их, чтобы получить более надежные сигналы, например, MACD, KD, Bollinger Bands и т.д.

  3. Оптимизируйте стоп-лосс и используйте стратегии получения прибыли для повышения стабильности.

  4. Оптимизируйте параметры фильтра EMA или экспериментируйте с другими фильтрами, чтобы лучше избежать ударов.

  5. Добавить модули фильтра тренда, чтобы избежать торговли против основного тренда.

  6. Проверьте различные временные рамки, чтобы найти лучшие торговые сессии для этой стратегии.

Резюме

Стратегия реверсионного прорыва RSI имеет четкую логику, основанную на классических принципах перекупленности/перепроданности. Она направлена на захват среднего реверсия в крайних условиях с надлежащими фильтрами контроля риска. Есть хороший потенциал превратить ее в стабильную стратегию с помощью настройки параметров и модульных улучшений. Стоит оптимизировать и применять в живой торговле.


/*backtest
start: 2023-10-08 00:00:00
end: 2023-11-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © REV0LUTI0N

//@version=4

strategy("RSI Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)

// Strategy Backtesting
startDate  = input(timestamp("2021-10-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("9999-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true
// Strategy

Length = input(12, minval=1)
src = input(close, title="Source")
overbought = input(70, minval=1)
oversold = input(30, minval=1)
xRSI = rsi(src, Length)
    
rsinormal = input(true, title="Overbought Go Long & Oversold Go Short")
rsiflipped = input(false, title="Overbought Go Short & Oversold Go Long")

// EMA Filter
noemafilter = input(true, title="No EMA Filter")
useemafilter = input(false, title="Use EMA Filter")
ema_length = input(defval=15, minval=1, title="EMA Length")
emasrc = input(close, title="Source")
ema = ema(emasrc, ema_length)
plot(ema, "EMA", style=plot.style_linebr, color=#cad850, linewidth=2)

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit % Based
enablesl = input(false, title='Enable Stop Loss')
enabletp = input(false, title='Enable Take Profit')
stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100
takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100

longStop = strategy.position_avg_price * (1 - stopTick)
shortStop = strategy.position_avg_price * (1 + stopTick)
shortTake = strategy.position_avg_price * (1 - takeTick)
longTake = strategy.position_avg_price * (1 + takeTick)

plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")

// Strategy Execution
if (xRSI > overbought and close > ema and time_cond and timetobuy and rsinormal and useemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI < oversold and close < ema and time_cond and timetobuy and rsinormal and useemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if (xRSI < oversold and close > ema and time_cond and timetobuy and rsiflipped and useemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI > overbought and close < ema and time_cond and timetobuy and rsiflipped and useemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if (xRSI > overbought and time_cond and timetobuy and rsinormal and noemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI < oversold and time_cond and timetobuy and rsinormal and noemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if (xRSI < oversold and time_cond and timetobuy and rsiflipped and noemafilter)
    strategy.entry("Long", strategy.long, alert_message = message_enterlong)
    
if (xRSI > overbought and time_cond and timetobuy and rsiflipped and noemafilter)
    strategy.entry("Short", strategy.short, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesl and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enablesl and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    
if strategy.position_size > 0 and enabletp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong)
if strategy.position_size < 0 and enabletp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)
    



Больше