基于MACD和RSI指标的交叉信号策略


创建日期: 2023-12-18 17:19:03 最后修改: 2023-12-18 17:19:03
复制: 0 点击次数: 742
avatar of ChaoZhang ChaoZhang
1
关注
1338
关注者

基于MACD和RSI指标的交叉信号策略

概述

本策略运用MACD指标判断市场趋势和寻找潜在买卖点,同时结合RSI指标确认超买超卖现象,在MACD指标发出买入/卖出信号时,只有当RSI也同时确认市场处于超卖/超买状态时,才会生成交易信号,进行买入或卖出。该策略可以有效过滤假信号,提高策略稳定性。

策略原理

MACD指标计算

MACD指标由快速移动平均线(EMA)与慢速移动平均线的差值构成,反映短期和长期平均价格变动趋势的差异。本策略中,快速线的周期为12日,慢速线的周期为26日。

当快速线上穿慢速线时为金叉信号,表示市场步入上涨趋势;当快速线下穿慢速线时为死叉信号,表示市场步入下跌趋势。

RSI指标计算

RSI指标反映市场的超买超卖现象。本策略中,RSI的参数周期设置为14。

RSI BELOW 30 when buyers outpaced sellers for an extended period suggests ASSET was OVERSOLD.

RSI ABOVE 70 when selling pressure outpaced buying pressure over the tracked timeline suggests ASSET was OVERBOUGHT.

当RSI低于30时表示市场处于超卖状态;当RSI高于70时,表示市场处于超买状态。

策略信号

仅依靠MACD指标生成交易信号时,会出现一定的假信号。本策略运用RSI指标过滤信号,只有当MACD发出信号的同时,RSI也确认市场超买超卖状态,才会生成实际的交易信号。

具体来说,当MACD形成金叉信号,如果这时RSI<=34,确认市场处于超卖状态,则产生买入信号;当MACD形成死叉信号,如果这时RSI>=75,确认市场处于超买状态,则产生卖出信号。

这种双重确认机制,可以过滤掉许多不可靠的交易信号,从而提高策略的稳定性和可靠性。

优势分析

双重指标过滤 提高信号可靠性

本策略运用MACD与RSI两个指标相结合,进行双重确认。这可以有效减少假信号的干扰,过滤掉一些不可靠的交易信号,从而提高信号的可靠性和稳定性。

清晰的趋势判断

MACD作为一个量价指标,可以清楚判断市场的涨跌趋势。结合RSI指标的超买超卖判断,可以准确抓住市场重要的反转点,进出仓信号明确。

参数优化空间大

本策略MACD和RSI的参数可以进行优化调整,适应不同周期和不同品种,优化空间较大。通过参数调整可以针对性的因地制宜,获得更好的策略效果。

容易理解实现

该策略运用的MACD和RSI等指标都是非常典型和常用的技术指标,易于理解,代码实现也非常简单直观。这为参数调整与优化带来了便利。

风险分析

可能错过部分交易机会

本策略采用的是比较谨慎的双重确认策略,为过滤假信号而可能错过一些单一指标条件下就可以获得利润的交易机会。

  • 解决方法:适当放宽RSI的阈值范围,降低确认严格度,容许策略获得更多交易机会。

行情剧烈变化时发生亏损

当行情出现剧烈变化时,MACD和RSI指标都可能会延迟作出判断,导致策略生成错误的交易信号产生亏损。

  • 解决方法:加入止损机制,避免单笔亏损过大;调整参数使指标对剧烈变化有一定的敏感度。

效果与参数设置质量高度相关

本策略的效果很大程度上取决于MACD和RSI等参数的设置。如果参数设置不当,容易获得反向的交易信号。

  • 解决方法:通过回测对参数组合进行优化,找到最佳的参数设置。

优化方向

加入止损机制管理风险

可以设置价格止损或指标止损规则,在亏损扩大到一定程度时止损出场,有效控制单笔损失。

调整参数适应行情特征

可以通过调整MACD的快慢线周期、RSI的超买超卖阈值等参数,优化参数设置,使其更加适合不同周期和品种的行情特征。

测试不同品种寻找最佳适配

可以在不同的品种如股票指数、数字货币、外汇、商品等上进行回测,找到策略效果最好的品种。

加入其它指标进行多维确认

可以在现有MACD和RSI的基础上,引入 stoch、OBV、CCI等其它指标,实现多指标確認,进一步提高信号质量。

总结

本策略基于MACD指标判断市场趋势方向和交易信号。为了过滤假信号,加入RSI指标确认超买超卖现象,只有两者同时满足条件时才产生交易信号。这种双重指标確認机制,可以有效提高信号的质量和稳定性。

通过参数优化、止损机制的应用、多指标確認等改进手段,策略的效果可以得到进一步提升。该策略操作简单,稳定性较好,是一种适合初学者实践和优化的量化交易策略。

策略源码
/*backtest
start: 2023-11-17 00:00:00
end: 2023-12-17 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(default_qty_type = strategy.percent_of_equity, default_qty_value = 25, pyramiding = 10, title="MACD crossover while RSI Oversold/Overbought", overlay=true, shorttitle="MACD Cross + RSI Oversold Overbought", initial_capital = 1000)

//MACD Settings
fastMA = input(title="Fast moving average",  defval = 12, minval = 7) //7 16
slowMA = input(title="Slow moving average",  defval = 26, minval = 7) //24 26 
signalLength = input(9,minval=1) //9 6

//RSI settings
RSIOverSold = input(34 ,minval=1) //26
RSIOverBought = input(75 ,minval=1) //77
src = close, len = input(14, minval=1, title="Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
wasOversold = rsi[0] <= RSIOverSold or rsi[1] <= RSIOverSold or rsi[2] <= RSIOverSold or rsi[3] <= RSIOverSold or rsi[4] <= RSIOverSold or rsi[5] <= RSIOverSold
wasOverbought = rsi[0] >= RSIOverBought or rsi[1] >= RSIOverBought or rsi[2] >= RSIOverBought or rsi[3] >= RSIOverBought or rsi[4] >= RSIOverBought or rsi[5] >= RSIOverBought


[currMacd,_,_] = macd(close[0], fastMA, slowMA, signalLength)
[prevMacd,_,_] = macd(close[1], fastMA, slowMA, signalLength)
signal = ema(currMacd, signalLength)

crossoverBear = cross(currMacd, signal) and currMacd < signal ? avg(currMacd, signal) : na
crossoverBull = cross(currMacd, signal) and currMacd > signal ? avg(currMacd, signal) : na

plotshape(crossoverBear and wasOverbought , title='MACD-BEAR', style=shape.triangledown, text='overbought', location=location.abovebar, color=orange, textcolor=orange, size=size.tiny) 
plotshape(crossoverBull and wasOversold, title='MACD-BULL', style=shape.triangleup, text='oversold', location=location.belowbar, color=lime, textcolor=lime, size=size.tiny) 

// Configure backtest start date with inputs
startDate = input(title="Start Date",
     defval=8, minval=1, maxval=31)
startMonth = input(title="Start Month",
     defval=3, minval=1, maxval=12)
startYear = input(title="Start Year",
     defval=2021, minval=1800, maxval=2100)

afterStartDate = (time >= timestamp(syminfo.timezone,
     startYear, startMonth, startDate, 0, 0))
     
if (afterStartDate==true)
    posSize = abs(strategy.position_size)
    strategy.order("long", strategy.long, when = crossoverBull and wasOversold) 
    strategy.order("long", long=false, qty=posSize/3, when = crossoverBear and wasOverbought)