This strategy is designed for the cryptocurrency market, using a combination of ultra-long period RSI and RVI indicators to determine entries and exits.
Specifically, long entries are taken when RVI shows the buy zone, and the super long RSI crosses above overbought level. Exits occur when RVI enters sell zone, and RSI crosses below oversold level for stop loss.
The advantage of this strategy is the ultra-long RSI can more accurately determine trends to avoid whipsaws. RVI assists in gauging buy/sell pressure for higher entry precision. The stop loss method allows timely cut loss to reduce drawdowns.
However, both RSI and RVI have lagging issues, and cannot promptly capture turning points. Loosened parameters or moving stops are needed to adapt to spikes. Also, RSI has limited capabilities in decoding complex price action.
In summary, the cryptocurrency RSI curve tracking strategy can produce decent results when combined with strong trending moves. But active position management, parameter tuning, and monitoring fundamentals are still essential for traders to achieve long-term steady profits.
/*backtest start: 2023-01-01 00:00:00 end: 2023-03-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © exlux99 strategy(title="Crypto RSI + RVI Strategy", overlay=true, initial_capital = 1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.03, pyramiding=1 ) Period = input(100, minval=1) BuyZone = input(49, minval=1) SellZone = input(50, minval=1) length=Period MA_s=0.0 pos=0.0 possig=0.0 nU=0.0 nD=0.0 nRes=0.0 ob=SellZone os=BuyZone WiMA(src, length) => MA_s=0.0 MA_s:=(src + nz(MA_s[1] * (length-1)))/length MA_s calc_rsi_volume(fv, length) => up=iff(fv>fv[1],abs(fv-fv[1])*volume,0) dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0) upt=WiMA(up,length) dnt=WiMA(dn,length) 100*(upt/(upt+dnt)) rsi_v = calc_rsi_volume(close, length) // u=plot(ob) // l=plot(os) // fill(u,l,color.red) // plot(50) // plot(rsi_v, color=color.red, linewidth=1) reverse = input(false, title="Trade reverse") xPrice = close StdDev = stdev(xPrice, Period) d = iff(close > close[1], 0, StdDev) u = iff(close > close[1], StdDev, 0) nU := (13 * nz(nU[1],0) + u) / 14 nD := (13 * nz(nD[1],0) + d) / 14 nRes := 100 * nU / (nU + nD) pos := iff(nRes < BuyZone, -1, iff(nRes > SellZone, 1, nz(pos[1], 0))) possig := iff(reverse and pos == 1, -1, iff(reverse and pos == -1, 1, pos)) long=crossover (rsi_v,ob) and (possig == 1) short=crossunder(rsi_v,os) and (possig == -1) g(v, p) => round(v * (pow(10, p))) / pow(10, p) risk = input(100) leverage = input(2.5) c = g((strategy.equity * leverage / open) * (risk / 100), 4) strategy.entry("long",1,c,when=long) strategy.close("long",when=short) //strategy.entry("short",0,when=short) // ------------------------- Strategy Logic --------------------------------- // var longOpeneda = false var shortOpeneda = false var int timeOfBuya = na longCondition= long and not longOpeneda if longCondition longOpeneda := true timeOfBuya := time longExitSignala = short exitLongCondition = longOpeneda[1] and longExitSignala if exitLongCondition longOpeneda := false timeOfBuya := na //plotshape(longCondition, style=shape.labelup, location=location.belowbar, color=color.color.green, size=size.tiny, title="BUY", text="BUY", textcolor=color.color.white) //plotshape(exitLongCondition, style=shape.labeldown, location=location.abovebar, color=color.color.red, size=size.tiny, title="SELL", text="SELL", textcolor=color.color.white) sl=input(0.2) tp=input(1.0) strategy.exit("long_tp/sl", "long", profit=close * tp / syminfo.mintick, loss=close * sl / syminfo.mintick, comment='long_tp/sl', alert_message = 'closelong') strategy.exit("short_tp/sl", "short", profit=close * tp / syminfo.mintick, loss=close * sl / syminfo.mintick, comment='short_tp/sl', alert_message = 'closeshort')