
A estratégia é baseada na concepção do indicador RSI, um indicador relativamente forte, e usa o princípio de compra e venda de RSI para realizar operações de ruptura bidirecionais. Quando o indicador RSI atravessa a linha de compra e venda definida, fazendo mais e quando o indicador RSI atravessa a linha de venda definida, fazendo menos, é uma estratégia de negociação típica de reversão.
Os parâmetros do indicador RSI são calculados de acordo com as configurações de entrada do usuário, incluindo o comprimento do ciclo RSI, o limiar da linha de compra e o limiar de venda.
De acordo com a curva RSI, a relação entre a posição da linha de superaquecimento e a linha de superaquecimento determina se você está em uma zona de superaquecimento ou de superaquecimento.
Quando o indicador RSI quebra a linha de desvalorização correspondente a partir da zona de superalimento, execute a operação de abertura de posição na direção oposta. Por exemplo, quando a zona de superalimento quebra a linha de superalimento, considere que a tendência se inverte e abra uma posição maior; quando a zona de superalimento quebra a linha de superalimento, considere que a tendência se inverte e abra uma posição vazia.
Depois de abrir uma posição, configure o Stop Loss Stop Line.
A estratégia também oferece a opção de usar o EMA como um filtro. O preço deve romper o EMA para abrir uma posição somente quando o indicador RSI faz mais sinais de curto-circuito.
A estratégia também oferece a função de negociar apenas em determinados períodos de negociação. O usuário pode configurar a negociação apenas em um determinado período de tempo, e sair da posição após o tempo de liquidação.
Resolução de riscos:
A estratégia pode ser melhorada em vários aspectos:
Optimizar os parâmetros do RSI, procurando a melhor combinação de parâmetros de diferentes variedades. O melhor limite de superaquecimento pode ser encontrado através do rastreamento.
Tente substituir ou combinar diferentes indicadores do RSI para formar um sinal de julgamento mais forte. Por exemplo, MACD, KD, faixa de Brin, etc.
Optimizar a estratégia de stop loss para aumentar a estabilidade da estratégia. Pode ser definido a partir de stop loss de acordo com a volatilidade do mercado, ou com a função de rastreamento de stop loss.
Otimizar os parâmetros do filtro EMA ou testar outros indicadores de filtro para evitar ainda mais o encaixe.
Adicionar módulos de julgamento de tendências, evitando a reversão de ações de múltiplos ativos, ou a reversão de ações de múltiplos ativos.
Testar diferentes parâmetros de tempo de negociação para determinar quais períodos são adequados para a estratégia e quais devem ser evitados.
A estratégia de ruptura bidirecional do RSI é clara, usando o clássico princípio de venda e venda de RSI para a negociação de reversão. Pode aproveitar as oportunidades de reversão da zona de venda e venda, mas também pode controlar o risco com filtragem EMA e parada de perda. O espaço de otimização de parâmetros e módulos é grande, o que pode ser uma estratégia de reversão mais estável e confiável.
/*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)