VRSI-EMA交叉与VMACD融合的波浪寻找者策略


创建日期: 2023-11-21 17:12:06 最后修改: 2023-11-21 17:12:06
复制: 0 点击次数: 446
avatar of ChaoZhang ChaoZhang
1
关注
1266
关注者

VRSI-EMA交叉与VMACD融合的波浪寻找者策略

概述

这是一个结合随机RSI, EMA交叉和VMACD的策略,用于识别市场的反转点, 在下跌趋势即将反转的时候表现最佳。它会在符合条件时产生买入信号。

策略原理

该策略主要基于以下几个指标的组合:

  1. 随机RSI(随机指数平滑移动平均线):用于识别超买超卖现象
  2. EMA(指数移动平均线)快线和慢线的交叉:判断趋势和可能的反转
  3. VMACD(量加权MACD):用于确认反转信号

当随机RSI从超卖区域反弹,并且EM快线上穿慢线,同时VMACD也开始上升的时候,就会产生买入信号。此外,如果短期价格突破10周期的SMA(简单移动平均线),也会作为辅助信号产生买入。

该策略会实时跟踪这几个指标的变化,并计算一定长度后的SMA, EMA等信息。当触发买入条件后,就会使用固定数量的合约进行买入开仓。之后如果触发止损条件,例如回撤5%或者位于SMA线下方,就会平仓止损。

优势分析

该策略结合了多个指标,能够有效识别市场反转机会。主要优势有:

  1. 随机RSI识别超买超卖的能力较强
  2. EMA交叉判断反转信号准确性高
  3. VMACD有效过滤假信号
  4. 多指标组合, 提高信号质量
  5. 采用短期SMA作为止损方式合理

综上,该策略可以有效抓住反转信号,在下跌到一定程度后建立多头头寸,从而获利。

风险分析

尽管该策略有一定优势,但也存在一些风险需要注意,主要有:

  1. 市场可能并没有反转,继续下跌的系统性风险
  2. 当多个指标同时触发买入条件的概率不高,信号产生较少
  3. SMA止损可能过于主观,回撤控制效果一般
  4. 未考虑大幅震荡市场的情况

针对以上风险,可以通过以下方式进一步优化:

  1. 增加其他反转指标的组合,提高效果
  2. 采用时间止损和金额止损相结合的方式
  3. 对市场状态进行判断,在震荡行情避免建仓
  4. 优化止损逻辑,防止过于激进的止损被套

优化方向

该策略主要可从以下方向进行进一步优化:

  1. 增加更多指标的组合,形成指标集群,提高信号质量
  2. 根据大类资产的特点选择最佳的参数,进行参数优化
  3. 增加机器学习算法,根据历史数据训练判断反转的概率
  4. 在回测时加入滑点,使结果更贴近实际交易
  5. 优化止损策略,使之更加平滑合理
  6. 检测趋势状态,区分震荡和趋势行情,避免盲目建仓

总结

该VRSI-EMA交叉与VMACD融合的波浪寻找者策略,整体来说是一个不错识别下跌反转机会的策略。它结合多个指标形成买入信号,可以有效判定反转的时机。但也存在一些需要优化的方向,若经过进一步改进,该策略的实盘表现会更加出色。它代表了多指标融合这类量化策略的典型范例。

策略源码
/*backtest
start: 2022-11-14 00:00:00
end: 2023-11-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Wavefinder+", overlay=true)
length = input(20)
confirmBars = input(2)
price = close

slow = input(12, "Short period")
fast = input(26, "Long period")
signal = input(9, "Smoothing period")


maFast = ema( volume * close, fast ) / ema( volume, fast ) 
maSlow = ema( volume * close, slow ) / ema( volume, slow ) 
da = maSlow - maFast 
maSignal = ema( da, signal ) 
dm=da-maSignal


source = close
lengthRSI = input(14, minval=8), lengthStoch = input(14, minval=5)
smoothK = input(3,minval=3), smoothD = input(3,minval=3)
OverSold = input(25), OverBought = input(75)
rsi1 = rsi(source, lengthRSI)
rsi2= rsi(low, 20)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
k1= sma(stoch(rsi2, rsi2, rsi2, lengthStoch), smoothK)
d1= sma(k1, smoothD)
delta=k-d1
ma = ema(low, length)
ema5= ema(price,20)
sma= sma(price,10)
bcond = price < ma
lcond = price> ema5
bcount = 0
lcount= 0
bcount := bcond ? nz(bcount[1]) + 1 : 0
lcount := lcond ? nz(lcount[1]) + 1 : 0

if (lcount>1 and change(k)>3 and k>d and k<55 and rising(dm,1)) or ( k[1]-k[2]<-2 and k-k[1]>5 and k>35 and k<80) or (ma-sma>0.05*sma and rising(sma,3) and rising(dm,2)) 
    strategy.entry("Long", strategy.long, qty=10000/close)

if (bcount == confirmBars)
    strategy.close("Long")
if close<0.99*sma
    strategy.close("Long")

plot(0.99*sma)
plot(ma)

//hline(OverSold,color=blue)
//hline(OverBought,color=blue)

//plot(d, color=red)
//plot(k, color=green,title="k-line")
    
//(close-close[3]<-0.05*close[3]) or (close-close[2]<-0.05*close[2]) or (close-close[2]<-0.05*close[2]) or (close-close[4]<-0.05*close[4]) or
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)