基于MACD指标的趋势跟踪策略


创建日期: 2023-11-16 17:42:09 最后修改: 2023-11-16 17:42:09
复制: 6 点击次数: 568
avatar of ChaoZhang ChaoZhang
1
关注
1364
关注者

基于MACD指标的趋势跟踪策略

概述

该策略基于MACD指标实现趋势跟踪交易。策略利用MACD指标识别趋势方向,配合动态止损来锁定利润。

策略原理

  1. 计算快线、慢线和MACD指标。快线采用12周期指数移动平均线,慢线采用26周期指数移动平均线。MACD 为快线和慢线的差值。

  2. 设置买入线和卖出线。当MACD上穿买入线时生成买入信号;当MACD下穿卖出线时生成卖出信号。

  3. 开仓后设置动态止损,跟踪止损线。止损线初始值为开仓价格的95%,随着价格运行止损线上移,来锁定利润。

  4. 当触发止损或反向信号时平仓。

优势分析

  1. 使用MACD指标识别趋势方向,可以有效跟踪趋势。

  2. 动态止损机制可以持续锁定利润,避免亏损扩大。

  3. 策略逻辑简单清晰,容易理解实现,适合量化交易的自动执行。

风险分析

  1. MACD指标存在滞后,可能错过短期趋势反转。

  2. 止损过于宽松可能错过部分利润,过于严格可能过早止损。

  3. parameter tuning问题,MACD参数及买卖线需要不断测试优化。

  4. 趋势行情中效果较好,震荡行情中存在亏损风险。

优化方向

  1. 优化MACD参数,寻找最佳参数组合。

  2. 测试不同的止损方式,比如点数止损、ATR止损等。

  3. 增加过滤条件,利用其它指标避免误交易。例如布林带、RSI等。

  4. 结合趋势判断指标,识别趋势和震荡行情,动态调整策略参数。

总结

该策略整体思路清晰,使用MACD指标跟踪趋势,并采用动态止损来锁定利润,可以有效跟踪趋势行情。但MACD指标存在滞后问题,止损点设置也需要优化。下一步将进一步测试参数设定,优化止损机制,并配合其它指标进行过滤,使策略更适合不同行情,提高策略的稳定性。

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

//@version=3
strategy(shorttitle = "EURUSD MACD", title = "EURUSD MACD")
fastMA = input(title="Fast moving average",  defval = 12, minval = 7)
slowMA = input(title="Slow moving average",  defval = 26, minval = 7)
lastColor = yellow
[currMacd,_,_] = macd(close[0], fastMA, slowMA, 9)
[prevMacd,_,_] = macd(close[1], fastMA, slowMA, 9)
plotColor = currMacd > 0 ? currMacd > prevMacd ? lime : green : currMacd < prevMacd ? maroon : red
plot(currMacd, style = histogram, color = plotColor, linewidth = 3)
plot(0, title = "Zero line", linewidth = 1, color = gray)

//MACD
// Getting inputs
fast_length = input(title="Fast Length",  defval=12)
slow_length = input(title="Slow Length",  defval=26)
src = input(title="Source",  defval=close)
signal_length = input(title="Signal Smoothing",  minval = 1, maxval = 50, defval =9)
sma_source = input(title="Simple MA(Oscillator)", type=bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
plot(macd, title="MACD", color=col_macd, transp=0)
plot(signal, title="Signal", color=col_signal, transp=0)
///END OF MACD

//Long and Close Long Lines
linebuy = input(title="Enter Long", type=float, defval=-0.0002)
linesell = input(title="Close Long", type=float, defval=0.0001)

//Plot Long and Close Long Lines
plot(linebuy,color=green),plot(linesell,color=red)


//Stop Loss Input
sl_inp = input(0.05, title='Stop Loss %', type=float)/100


//Order Conditions
longCond = crossover(currMacd, linebuy)
exitLong = crossover(currMacd, linesell)
stop_level = strategy.position_avg_price * (1 - sl_inp)


//Order Entries
strategy.entry("long", strategy.long,  when=longCond==true)
strategy.close("long", when=exitLong==true)
strategy.exit("Stop Loss", stop=stop_level)