该策略结合MACD和DEMA双轨指标,通过多空线金叉死叉形成交易信号。策略捕捉MACD指标转折时机,利用DEMA滤波去噪实现较优入场。
计算快线DEMAfast,取价格的DEMA值,周期length为fastmacd。
计算慢线DEMAslow,取prices的DEMA值,周期length为slowmacd。
MACD线为快慢线差值:DEMAfast - DEMAslow。
Signal线为MACD线的DEMA值,周期length为signalmacd。
多空线交叉作为交易信号:金叉做多,死叉做空。
添加年月日过滤,只在指定日期范围发出信号。
该策略主要有以下优点:
结合MACD和DEMA,指标互补。MACD捕捉转折,DEMA滤波提高信号质量。
DEMA双轨设计可减少MACD指标的滞后性和噪声。
多空线交叉易于判断,信号生成简单清晰。
可灵活设置交易日期范围,适应不同策略需求。
MACD参数可优化组合,灵活应对多种行情。
该策略主要风险如下:
MACD作为趋势跟踪指标,不适合震荡横盘市。
多空交叉可能产生假信号,须有效过滤。
止损策略不完善,容易止损过大。
参数优化不全面,不同品种效果差异大。
交易日期过滤过于死板,须动态调整。
对应解决方法:
结合动量指标,避免横盘。
增加价格条件,过滤假交叉信号。
设定合理初始止损与追踪止损。
测试多品种参数效果,动态优化。
根据实时行情调整过滤日期。
该策略可考虑以下几点优化:
增加成交量指标进行信号过滤。
优化MACD参数组合,测试不同品种数据。
设置止损策略,如固定止损、追踪止损等。
根据市场波动程度动态调整止损位置。
跟踪趋势强弱,调整仓位大小。
MACD DEMA策略结合双指标优势,利用交叉信号捕捉趋势。但MACD本质具有滞后性,需注意过滤假信号。此外,止损策略需优化减少非理性止损。实盘时,建议基于参数优化结果谨慎入场,持续优化。
/*backtest
start: 2023-01-01 00:00:00
end: 2023-09-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy(" MACD DEMA STRATEGY ", overlay=true)
source=close
price=source
fastmacd = input(12,title='MACD Fast Line Length')
slowmacd = input(26,title='MACD Slow Line Length')
signalmacd = input(9,title='Signal Line Length')
macdslowline1 = ema(close,slowmacd)
macdslowline2 = ema(macdslowline1,slowmacd)
DEMAslow = ((2 * macdslowline1) - macdslowline2 )
macdfastline1 = ema(close,fastmacd)
macdfastline2 = ema(macdfastline1,fastmacd)
DEMAfast = ((2 * macdfastline1) - macdfastline2)
MACDLine = (DEMAfast - DEMAslow)
SignalLine1 = ema(MACDLine, signalmacd)
SignalLine2 = ema(SignalLine1, signalmacd)
SignalLine = ((2 * SignalLine1) - SignalLine2 )
MACDSignal = SignalLine-MACDLine
colorbar= MACDSignal>0?green:red
yearfrom = input(2018)
yearuntil =input(2019)
monthfrom =input(1)
monthuntil =input(12)
dayfrom=input(1)
dayuntil=input(31)
if ( crossover(MACDLine,SignalLine) )
strategy.entry("MMAL", strategy.long, stop=close, oca_name="TREND", comment="AL")
else
strategy.cancel(id="MMAL")
if ( crossunder(MACDLine,SignalLine) )
strategy.entry("MMSAT", strategy.short,stop=close, oca_name="TREND", comment="SAT")
else
strategy.cancel(id="MMSAT")