Esta estratégia é baseada no indicador RSI (Relative Strength Index) para determinar condições de sobrecompra e sobrevenda. Ele assume posições de contra-tendência quando o RSI atinge níveis de sobrecompra ou sobrevenda para comprar baixo e vender alto. A estratégia é simples e eficaz, lucrando com cenários de sobrecompra e sobrevenda no mercado.
A estratégia usa o indicador RSI somente como sinal de entrada. Ela fica longa quando o RSI cruza abaixo do ponto baixo (default 20), e fica curta quando o RSI cruza acima do ponto alto (default 80). Ela negocia quantidade fixa a cada vez (default $100) e visa um lucro de 1% independentemente da condição do mercado. Se a perda atingir 3%, ela para. Para controlar a frequência do comércio, a estratégia para de negociar por 24 barras após uma negociação perdedora.
A lógica central é:
Como podemos ver, a estratégia é muito simples e mecânica. Há quase nenhum espaço para otimização de parâmetros. Ele explora puramente as propriedades matemáticas do RSI para tomar posições de contra-tendência em torno de regiões de sobrecompra / sobrevenda.
A maior vantagem desta estratégia é a sua simplicidade e eficiência.
Ele também implementa índices de stop loss / take profit para bloquear lucros e controlar riscos, bem como suspensão de negociação para reduzir a frequência.
Os principais riscos desta estratégia são:
Incapaz de lucrar em um mercado de forte tendência. O RSI pode permanecer na zona de sobrecompra/supervenda por um período prolongado quando a tendência persiste.
A perda de parada demasiado larga pode conduzir a uma perda excessiva.
A alta frequência de negociação pode levar ao excesso de negociação após as vitórias.
Concentração de riscos de $100, deve ser otimizada para % do capital.
Com base na análise, a estratégia pode ser melhorada das seguintes formas:
Adicione um filtro de tendência como MA para pausar a negociação quando a tendência não estiver clara.
Otimizar as taxas de stop loss/take profit, reduzir a stop loss para 1-2% e utilizar a take profit dinâmica.
Limitar a frequência das transações, tais como, no máximo, 2 transações por período de tempo.
Taxa de transacções baseada em % do capital em vez de 100 dólares fixos.
Otimizar os parâmetros do RSI como período, níveis de sobrecompra/venda.
Adicionar o dimensionamento das posições para não aumentar o tamanho quando o capital aumenta.
Com estas optimizações, os riscos podem ser reduzidos e a estabilidade melhorada significativamente.
Em resumo, esta é uma estratégia simples e direta que usa o RSI para negociar condições de sobrecompra / sobrevenda para a reversão média de curto prazo. Os prós são simplicidade, eficiência, nenhuma previsão necessária, lógica clara, fácil de testar. As desvantagens são a incapacidade de lucrar em tendências fortes e perdas potenciais. Com adições como filtro de tendência, parâmetros otimizados, dimensionamento de posição, etc., ele pode ser melhorado para estabilidade e lucratividade. A lógica é inovadora e valiosa para a negociação prática se aplicada corretamente.
/*backtest start: 2023-11-02 00:00:00 end: 2023-11-09 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash) open_pos = input.int(50000, title = "每次开单资金(usdt)") rsi_period = input.int(14, title = "rsi周期") rsi_line = input.float(20.0, title='RSI触发线', step=0.05) stop_rsi_top_line = input.float(70, title = "顶部rsi止损线") stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线") stop_loss_perc = input.float(0.03, title = "止损线") stop_profit = input.float(0.01, title = "止盈") loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易") rsiParam = ta.rsi(close, rsi_period) var int failedTimes = 0 var bool stopTrade = false // plot(rsiParam) if stopTrade failedTimes += 1 if failedTimes == loss_stop_trade_k failedTimes := 0 stopTrade := false // 获取当前持仓方向 checkCurrentPosition() => strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0 curPosition = checkCurrentPosition() // 当前持仓成本价 position_avg_price = strategy.position_avg_price // 当前持单, 触达反向的rsi线,清仓 if curPosition > 0 and rsiParam >= stop_rsi_top_line strategy.close_all(comment = "closebuy") if curPosition < 0 and rsiParam <= stop_rsi_bottom_line strategy.close_all(comment = "closesell") // 止盈止损清仓 if curPosition > 0 // if (position_avg_price - close) / close >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closebuy") // stopTrade := true if (close - position_avg_price) / position_avg_price >= stop_profit // 止盈 strategy.close_all(comment = "closebuy") if curPosition < 0 // if (close - position_avg_price) / position_avg_price >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closesell") // stopTrade := true if (position_avg_price - close) / close >= stop_profit // 止盈 strategy.close_all(comment = "closesell") a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0 stopTrade := true var float openPrice = 0.0 if rsiParam <= rsi_line and stopTrade == false strategy.entry("long", strategy.long, open_pos / close, comment = "long") if curPosition == 0 openPrice := close strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy") if rsiParam >= 100 - rsi_line and stopTrade == false strategy.entry("short", strategy.short, open_pos / close, comment = "short") if curPosition == 0 openPrice := close strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell") plot(failedTimes)