布林带、RSI、MACD、Stochastic多指标融合交易策略


创建日期: 2023-09-28 12:06:39 最后修改: 2023-09-28 12:06:39
复制: 0 点击次数: 1220
avatar of ChaoZhang ChaoZhang
1
关注
1243
关注者

概述

这个策略综合运用了布林带、RSI、MACD和Stochastic四个不同的技术指标,进行长短双向交易。它首先判断价格是否处于布林带通道之外,如果是,则根据方向做多做空;然后判断RSI是否处于超买超卖区,如果是,也可根据方向入场;接着判断MACD是否发生金叉死叉,如果是,也可根据方向入场;最后判断Stochastic是否产生金叉死叉并且处于超买超卖区,如果满足条件,也可入场。以上四个指标都符合条件时,该策略会采取更激进的加仓方式,从而获得更高的收益。

原理

该策略主要运用了布林带、RSI、MACD和Stochastic四个指标。

布林带是根据股价的标准差计算上下轨,股价超出布林带上下轨时代表股价已经离开正常波动范围,这时可做空做多。

RSI通过快速 Rise 和快速 Fall 推算其数值,当RSI低于30时为超卖,高于70时为超买,可以做为买卖信号。

MACD是指数平均线DIFF减去DEA的差离值,DIFF向上突破DEA为金叉做多信号,DIFF向下跌破DEA为死叉做空信号。

Stochastic K线和D线穿破也可以作为交易信号,K线低于20为超卖,高于80为超买,K线上穿D线为多头信号,下穿D线为空头信号。

综合判断这四个指标的做多做空信号,可以提高入场的成功率。具体来说,当价格超出布林带上轨时看作做多信号;当RSI低于30时看作做多信号;当MACD金叉时看作做多信号;当Stochastic K线上穿D线且K线低于20时看作做多信号。当同时满足这四个条件时,采取加仓做多的策略。做空信号的判断也是类似,当四个条件同时满足时采取加仓做空策略。

优势分析

该策略最大的优势是结合多个指标判断趋势,相比单一指标具有更高的准确度和胜率。

首先,该策略融合多个时间段指标,包括布林带的中长期趋势判断,以及MACD、RSI和Stochastic的短期指标判断,使得策略在多个时间维度上都进行判断,降低了误判概率。

其次,该策略采用多指标确认入场原则,只有当多个指标同时发出信号时才入场,确保了入场时机的精准。例如必须要布林带、RSI、MACD和Stochastic四个指标都满足条件,才会采取加仓的方式入场。这避免了单一指标可能出现的失灵情况。

再者,该策略中运用了指标的组合,能够互补不同指标的优势,提高胜率。例如,RSI能判断超买超卖,布林带能判断趋势背离,MACD能发现短期变化等。把这些指标组合使用,能发挥各自的优势。

最后,该策略采用加仓策略,这在指标信号确定的情况下,能够获利更多。当四个指标信号确定时,采取加仓方式,会比定量交易获利更多。

风险分析

该策略也存在一些风险需要注意。

首先,策略中采用了多种参数和指标,这增加了策略优化难度。要调整的参数较多,需要大量历史数据进行反复测试,才能找到最佳参数组合。

其次,策略依赖多个指标同时发出信号,这种情况不太常见,可能导致交易频率不高。如果长时间无法捕捉到同步信号,则策略会表现疲软。

再者,加仓策略虽然能扩大盈利,但也可能扩大亏损。当四个指标错误发出同步信号时,采取加仓会导致较大亏损。

最后,策略假设多个指标同时发出信号具有更强确认性,但指标发散时如何决策需要考虑。指标不一致时,策略应建立定量的决策机制。

优化方向

该策略可以从以下几个方面进行优化:

  1. 对指标参数进行优化,找到最佳参数组合。可以通过遗传算法、网格搜索等方法对指标参数进行全面的优化搜索。

  2. 增加止损策略,以控制亏损。当价格向不利方向突破某一点时,采取止损退出的策略,防止亏损扩大。

  3. 优化入场逻辑,当指标不一致时,建立定量的评分机制。例如设定不同指标的权重,按照评分入场。

  4. 优化出场逻辑,研究不同持仓时间下的盈亏比例,制定最优出场规则。

  5. 对交易品种、交易时段进行优化,调整适合该策略的品种和交易时段。

  6. 测试交易成本的影响,根据滑点和手续费优化策略的参数。

  7. 增加机器学习算法,利用神经网络等进行参数自适应和策略优化。

总结

该策略综合运用多种指标和多重确认机制进行决策,在合理参数和严格条件控制下,可以获取较好的策略效果。但其中也存在一定操作难度和风险,需要通过不断优化来提升策略的稳定性和可靠性。关键是要找到指标参数的最佳匹配,建立科学的入场出场规则,并且控制好风险,使策略在复杂多变的市场中持续盈利。

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

//@version=2
strategy("MD strategy", overlay=true)
lengthrsi = input( 14 )
overSold = input( 30 )
overBought = input( 70 )
price = close
source = close
lengthbb = input(20, minval=1)
mult = input(2.0, minval=0.001, maxval=50)
direction = input(0, title = "Strategy Direction",  minval=-1, maxval=1)
fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
consecutiveBarsUp = input(3)
consecutiveBarsDown = input(3)
lengthch = input( minval=1, maxval=1000, defval=5)
upBound = highest(high, lengthch)
downBound = lowest(low, lengthch)
lengthst = input(14, minval=1)
OverBoughtst = input(80)
OverSoldst = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, lengthst), smoothK)
d = sma(k, smoothD)



ups = price > price[1] ? nz(ups[1]) + 1 : 0
dns = price < price[1] ? nz(dns[1]) + 1 : 0
MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

basis = sma(source, lengthbb)
dev = mult * stdev(source, lengthbb)

upper = basis + dev
lower = basis - dev

vrsi = rsi(price, lengthrsi)

if (not na(vrsi))
    if (crossover(vrsi, overSold))
        strategy.entry("RsiLE", strategy.long, comment="RsiLE")
    if (crossunder(vrsi, overBought))
        strategy.entry("RsiSE", strategy.short, comment="RsiSE")

if (crossover(source, lower))
    strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands",  comment="BBandLE")
else
    strategy.cancel(id="BBandLE")

if (crossunder(source, upper))
    strategy.entry("BBandSE", strategy.short, stop=upper, oca_name="BollingerBands",  comment="BBandSE")
else
    strategy.cancel(id="BBandSE")
    
    
if (not na(k) and not na(d))
    if (crossover(k,d) and k < OverSoldst)
        strategy.entry("StochLE", strategy.long, comment="StochLE")
    if (crossunder(k,d) and k > OverBoughtst)
        strategy.entry("StochSE", strategy.short, comment="StochSE")   
        
if (crossover(delta, 0))
    strategy.entry("MacdLE", strategy.long, comment="MacdLE")

if (crossunder(delta, 0))
    strategy.entry("MacdSE", strategy.short, comment="MacdSE")