MACD趋势预测策略是一种基于MACD指标和EMA指标的趋势跟随策略。该策略不像传统的MACD策略那样通过信号线的交叉生成交易信号,而是通过MACD指标线和信号线之间距离的变化来产生交易信号,以捕捉趋势的变化。
计算快线DEMAfast: 通过EMA方法计算快线的两次EMA均值MMEfast,然后根据公式DEMAfast=((2 * MMEfast) - MMEfastb)计算快线DEMAfast。
计算慢线DEMAslow: 通过EMA方法计算慢线的两次EMA均值MMEslow,然后根据公式DEMAslow=((2 * MMEslow) - MMEslowb)计算慢线DEMAslow。
计算MACD线: MACD线是快线DEMAfast减去慢线DEMAslow的差值LigneMACDZeroLag。
计算信号线: 通过EMA方法计算MACD线的两次EMA均值MMEsignal,然后根据公式信号线Lignesignal=((2 * MMEsignal) - MMEsignalb)。
比较MACD线和信号线: 当MACD线大于信号线时产生买入信号;当MACD线小于信号线时产生卖出信号。
以上计算使用的是DEMA算法,可以有效减少MACD指标的滞后。
使用DEMA算法,可以减少MACD指标的滞后,使得交易信号更加灵敏。
不依赖MACD指标的交叉信号,而是通过MACD和信号线距离变化来捕捉趋势变化,可以更早进入趋势。
该策略对趋势的判断准确,profit factor可以达到1.6-3.5,收益表现较好。
策略逻辑简单清晰,容易理解实现,适合用于量化交易。
MACD作为滞后指标,在盘整行情中可能产生大量无效交易信号。
DEMA算法虽可减少滞后但无法完全消除,仍存在一定滞后。
作为趋势跟随策略,在震荡行情下收益可能不佳。
需要优化参数sma,lma,tsp等值,以适应不同周期和品种。
可能需要添加止损策略控制亏损。
优化sma,lma,tsp参数以适应不同周期和交易品种。
添加类似ATR的动态止损策略,以控制每单亏损。
结合趋势判断指标,避免在震荡行情中交易。
添加交易量控制,根据市场波动程度调整仓位。
优化入场和出场逻辑,细化交易信号规则。
MACD趋势预测策略通过改进MACD指标的计算方法,使用DEMA算法来减少滞后,并采用MACD和信号线距离变化判断趋势,作为趋势跟随策略,可以有效捕捉趋势变化, profit factor可达1.6-3.5,具有一定的优势。但仍需要进一步优化参数设置、止损策略、过滤震荡行情等,以适应更多市场环境,将是该策略的发展方向。
/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © moritz1301
//@version=4
strategy("MACD Trendprediction Strategy V1", shorttitle="MACD TPS", overlay=true)
sma = input(12,title='DEMA Courte')
lma = input(26,title='DEMA Longue')
tsp = input(9,title='Signal')
dolignes = input(true,title="Lignes")
MMEslowa = ema(close,lma)
MMEslowb = ema(MMEslowa,lma)
DEMAslow = ((2 * MMEslowa) - MMEslowb )
MMEfasta = ema(close,sma)
MMEfastb = ema(MMEfasta,sma)
DEMAfast = ((2 * MMEfasta) - MMEfastb)
LigneMACDZeroLag = (DEMAfast - DEMAslow)
MMEsignala = ema(LigneMACDZeroLag, tsp)
MMEsignalb = ema(MMEsignala, tsp)
Lignesignal = ((2 * MMEsignala) - MMEsignalb )
MACDZeroLag = (LigneMACDZeroLag - Lignesignal)
bgcolor(LigneMACDZeroLag<Lignesignal ? color.red : color.green)
if (LigneMACDZeroLag>Lignesignal)
strategy.entry("Buy", strategy.long, comment="BUY")
if (LigneMACDZeroLag<Lignesignal)
strategy.close("Buy", strategy.long, comment="SELL")