A estratégia de ruptura dupla do RSI é uma estratégia de negociação algorítmica que identifica pontos de reversão de preços usando o indicador RSI. Ela gera sinais de negociação comparando o indicador RSI com valores de limiar superior e inferior pré-definidos para determinar se o mercado está sobrecomprado ou sobrevendido.
Esta estratégia baseia-se principalmente no indicador RSI para julgar a condição do mercado. O indicador RSI é calculado com base nas mudanças nos preços de fechamento durante um determinado período, refletindo o impulso de compra e venda do estoque. Quando o RSI cruza acima do limiar superior pré-definido (default 75), ele indica que o estoque entrou na zona de supercompra. Quando o RSI cai abaixo do limiar inferior pré-definido (default 25), ele indica que o estoque entrou na zona de supervenda.
As regras de julgamento são as seguintes:
A sua lógica de negociação é simples e clara, com configurações razoáveis de parâmetros de referência, um grande espaço de configuração e é adequada para captar tendências maiores no mercado.
As vantagens desta estratégia incluem:
Em geral, com configurações razoáveis de parâmetros de referência, implementação simples e capacidade de determinar efetivamente as inversões de preços através do RSI, esta estratégia é adequada para a captura de tendências de médio a longo prazo e é fácil de compreender e usar como uma estratégia quantitativa.
Embora esta estratégia seja relativamente simples e fiável, não podemos ignorar os riscos potenciais que ela enfrenta:
Para controlar os riscos, precisamos prestar atenção aos seguintes aspectos:
Considerando que os principais riscos enfrentados por esta estratégia são erros de avaliação de reversão e perdas em mercados variados, podemos otimizar a partir dos seguintes aspectos:
Em resumo, a estratégia de ruptura dupla do RSI é uma estratégia quantitativa simples e prática. Ela identifica inversões de preços através do RSI para alcançar uma tendência simples. Embora existam certos riscos de erro de julgamento, otimizações como sintonização de parâmetros, filtragem de sinal podem ajudar a mitigar isso e permitir que ela desempenhe um papel importante na captura de tendências de médio a longo prazo. Sua lógica é direta, tornando-a adequada para quantes iniciantes se referirem e aprenderem.
/*backtest start: 2023-12-19 00:00:00 end: 2023-12-26 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("RSI Algo", overlay=true) // Calculate start/end date and time condition DST = 1 //day light saving for usa //--- Europe London = iff(DST==0,"0000-0900","0100-1000") //--- America NewYork = iff(DST==0,"0400-1500","0500-1600") //--- Pacific Sydney = iff(DST==0,"1300-2200","1400-2300") //--- Asia Tokyo = iff(DST==0,"1500-2400","1600-0100") //-- Time In Range timeinrange(res, sess) => time(res, sess) != 0 london = timeinrange(timeframe.period, London) newyork = timeinrange(timeframe.period, NewYork) time_cond = true myPeriod = input(defval=14, type=input.integer, title="Period") myThresholdUp = input(defval=75, type=input.float, title="Upper Threshold") myThresholdDn = input(defval=25, type=input.float, title="Lower Threshold") myAlgoFlipToggle = input(defval=false, type=input.bool, title="Imverse Algorthim") myLineToggle = input(defval=true, type=input.bool, title="Show Lines") myLabelToggle = input(defval=true, type=input.bool, title="Show Labels") myRSI=rsi(close, myPeriod) buy = myAlgoFlipToggle ? falling(myRSI,1) and cross(myRSI, myThresholdDn) : rising(myRSI, 1) and cross(myRSI,myThresholdUp) //and time_cond sell = myAlgoFlipToggle ? rising(myRSI, 1) and cross(myRSI,myThresholdUp) : falling(myRSI,1) and cross(myRSI, myThresholdDn) //and time_cond myPosition = 0 myPosition := buy==1 ? 0 : sell==1 or myPosition[1]==1 ? 1 : 0 trendColor = buy ? color.red : sell ? color.green : na plot(myLineToggle ? buy and myPosition[1]==1 ? low - 0.004: sell and myPosition[1]==0 ? high + 0.004 : na : na, color=trendColor, style=plot.style_line, linewidth=4, editable=false) plotshape(myLabelToggle ? buy and myPosition[1]==1 ? low - 0.005 : na : na, style=shape.labelup, location=location.absolute, text="Buy", transp=0, textcolor = color.white, color=color.black, editable=false) plotshape(myLabelToggle ? sell and myPosition[1]==0 ? high + 0.005 : na : na, style=shape.labeldown, location=location.absolute, text="Sell", transp=0, textcolor = color.white, color=color.black, editable=false) strategy.initial_capital = 50000 //Calculate the size of the next trade balance = strategy.netprofit + strategy.initial_capital //current balance floating = strategy.openprofit //floating profit/loss risk = input(2,type=input.float,title="Risk %")/100 //risk % per trade isTwoDigit = input(false,"Is this a 2 digit pair? (JPY, XAU, XPD...") stop = input(250, title="stop loss pips") tp = input(2500, title="take profit pips") if(isTwoDigit) stop := stop/100 temp01 = balance * risk //Risk in USD temp02 = temp01/stop //Risk in lots temp03 = temp02*100000 //Convert to contracts size = 1 strategy.entry("long",1,size,when=buy and myPosition[1]==1 ) strategy.entry("short",0,size,when=sell and myPosition[1]==0) strategy.exit("exit_long","long",loss=stop, profit=tp) //Long exit (stop loss) strategy.exit("exit_short","short",loss=stop, profit=tp) //Short exit (stop loss) //strategy.close_all(when= not time_cond)