
本策略名称为“基于Stochastic RSI的数字货币交易策略”。该策略结合了相对强弱指数(RSI)和随机指数平滑移动平均线(Stochastic RSI)两个指标来识别数字货币的买入和卖出信号。
策略的主要思路是:首先计算RSI值,然后基于RSI构建Stochastic RSI指标,即K值和D值。当K值上穿D值时产生买入信号,当K值下穿D值时产生卖出信号。为过滤假信号,策略还引入了变动速率指数(RVI)和其平滑移动平均线来进行确认。
计算长度为14的RSI值。
基于RSI构建长度为14的Stochastic RSI指标,得到K值和D值(D为K的3期移动平均)。
计算长度为5的RVI和其信号线(即RVI的平滑移动平均线)。
当K上穿D时,如果RVI > 信号线并且上一周期RVI < 信号线,则产生买入信号;当K下穿D时,如果RVI <信号线并且上一周期RVI > 信号线,则产生卖出信号。
根据产生的信号,进行买入或卖出开仓操作。
结合Stochastic RSI和RVI双重确认,可以有效过滤虚假信号。
RVI指标可以反映短期内的超买超卖情况,避免在极端点位开仓。
Stochastic RSI指标可以识别超买超卖区域,借助KDJ指标的金叉死叉形态来判断买卖点位。
回测结果表明,该策略在一些数字货币交易对(如FCT/BTC)上取得了不错的效果。
类似的跟踪止损策略,止损点设置得不恰当可能会被套牢。
信号产生频率可能过高,交易费用是需要考量的因素。
KDJ指标及RVI指标都可能产生虚假信号,从而导致不必要的亏损。
策略参数需要针对不同的交易对进行优化,普适性有待考量。
增加移动止损来锁定利润,可以参考ATR来设置止损位。
优化RVI参数和Stochastic RSI参数,使信号更加明确。
增加交易量控制,避免单笔订单过大。
增加过滤机制,避免高位开仓。可以引入波动率指标来判断目前是否处于震荡状态。
测试不同的数字货币交易对,寻找最佳适配品种。
本策略首先利用RSI指标构造Stochastic RSI,然后结合RVI指标来确认信号,以发现短期内的超买超卖现象,从而在反转点位打开仓位。优点是双重确认可以过滤假信号,缺点是可能存在参数过拟合风险。总体来说,该策略在一些交易对上取得了不错效果,通过进一步优化,可以获得更稳定的收益。
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="Stochastic RSI", shorttitle="Stoch RSI", overlay = true)
Per = input(5, title="Length", minval=1)
smoothK = input(3, minval=1)
smoothD = input(3, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
K = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
D = sma(K, smoothD)
rvi = sum(swma(close-open), Per)/sum(swma(high-low),Per)
sig = swma(rvi)
//plot(rvi, color=green, title="RVI")
//plot(sig, color=red, title="Signal")
//plot(K, title="K")
//plot(D, title="D")
Dn = K <= D and K > 70 and rvi <= sig and rvi[1] >= sig[1]
Up= K >= D and K < 30 and rvi >= sig and rvi[1] <= sig[1]
ARROW = Up - Dn
plotarrow(ARROW, title="Down Arrow", colordown=red, transp=0, maxheight=10, minheight=10)
plotarrow(ARROW, title="Up Arrow", colorup=lime, transp=0, maxheight=10, minheight=10)
long = crossover(Up, Dn)
short = crossunder(Up, Dn)
last_long = long ? time : nz(last_long[1])
last_short = short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
//plot(long_signal, "BUY", color=green)
//plot(short_signal, "SELL", color=red)
strategy.entry("BUY", strategy.long, when=long_signal)
strategy.entry("SELL", strategy.short, when=short_signal)