
MACD均线牛熊转换策略通过计算MACD指标的DIFF和DEA均线,判断市场趋势是否发生转折,进而产生交易信号。当DIFF上穿DEA时,做多;当DIFF下穿DEA时,做空。该策略同时结合价格EMA均线过滤,避免出现假突破。
该策略主要基于MACD指标的DIFF和DEA均线。MACD代表指数移动平均线差值,由DIFF、DEA和MACD线组成。其中,DIFF线代表短期EMA均线和长期EMA均线的差值,DEA线是DIFF的EMA均线,用来验证DIFF线信号,MACD线是DIFF减DEA的差值,代表背离。
当DIFF向上突破DEA时,代表短期均线开始走强,市场步入多头,当DIFF向下跌破DEA时,代表短期均线开始走弱,市场步入空头。因此,该策略在DIFF上穿DEA时做多,下穿时做空。
同时,策略还结合价格的EMA均线来过滤假突破。只有当DIFF向上突破DEA,且价格低于上一次做多价格时才做多;只有当DIFF向下突破DEA,且价格高于上一次做空价格时才做空。
MACD均线牛熊转换策略结合MACD指标和价格EMA均线,避免了仅通过MACD指标产生的假信号,提高了交易效果。该策略判断市场趋势转换迅速,适合短线操作。
优势主要体现在:
MACD均线牛熊转换策略也存在一些风险,主要体现在:
这些风险主要可以从以下几个方面进行优化:
MACD均线牛熊转换策略还具有优化空间,可以从以下几个维度进行优化:
MACD均线牛熊转换策略通过DIFF、DEA交叉判断市场步入多头和空头的时机,并配合价格EMA均线过滤假信号,实现了快速判断市场趋势转换的效果。该策略以简单清晰的交易逻辑,判断转换点迅速,适合短线与中线操作。下一步可从调整参数、增强过滤器、控制交易频率等方面进行优化,使策略更加稳定。
/*backtest
start: 2022-12-01 00:00:00
end: 2023-12-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("macd_strategy",
shorttitle="macd",
overlay=true,
pyramiding=1,
max_bars_back=5000,
calc_on_order_fills = false,
calc_on_every_tick=true,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
commission_type =strategy.commission.percent,
commission_value=0.00075)
[diff, dea, _] = macd(close, 12, 26, 7)
dea_close = ema(diff, 3)
price = ema(close, 9)
plot(price)
cross_over_price = na
cross_over_signal = na
cross_over_price := cross_over_price[1]
cross_over_signal := cross_over_signal[1]
cross_under_price = na
cross_under_signal = na
cross_under_price := cross_under_price[1]
cross_under_signal := cross_under_signal[1]
if (crossover(diff,dea))
cross_over_price := price[1]
cross_over_signal := diff
if (crossunder(diff,dea))
cross_under_price := price[1]
cross_under_signal := diff
if dea > 0
cross_over_price = na
cross_over_signal = na
else
cross_under_price = na
cross_under_signal = na
if diff > 0
if cross_under_price > cross_under_price[1]*1 and cross_under_signal < cross_under_signal[1]*0.95
strategy.entry("S", strategy.short, comment="S")
else
if cross_over_price < cross_over_price[1]*1 and cross_over_signal > cross_over_signal[1]*0.95
strategy.entry("B", strategy.long, comment="B")
// strategy.exit("exit_s", "S", stop = strategy.position_avg_price*1.05, when=strategy.position_size < 0)
// strategy.exit("exit_b", "B", stop = strategy.position_avg_price*0.95, when=strategy.position_size > 0)
strategy.close_all(when=(strategy.position_size < 0 and (dea < 0 or diff > cross_under_signal*1 or crossover(diff, dea)) or (strategy.position_size > 0 and (dea > 0 or diff < cross_over_signal*1 or crossunder(diff, dea)))))