该策略是一个基于MACD指标和量价关系的交易系统,通过观察MACD柱状图的形态变化来判断市场趋势转折点。策略采用了动态的止盈止损机制,通过ATR指标来自适应市场波动,有效控制风险。
策略的核心逻辑建立在MACD指标的深浅柱状变化上,结合EMA和SMA双重均线系统。当MACD柱状图从深色转为浅色时,表明动量发生转变,系统会在此时进行交易。具体来说: 1. 使用快速(12)和慢速(26)均线计算MACD值 2. 通过9周期的信号线平滑MACD 3. 观察MACD柱状图的颜色深浅变化 4. 结合14周期ATR指标设置动态止盈止损
这是一个结合了技术分析经典指标MACD和现代风险控制方法的综合策略。通过观察MACD柱状图的形态变化来捕捉市场动量的转变,并使用ATR进行动态风险控制。策略设计合理,操作逻辑清晰,具有较好的实用价值。通过持续优化和完善,该策略有望在实战中取得更好的表现。
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=5
strategy(title="軒割MACD 空心量能不足策略", shorttitle="軒割MACD 空心量能不足策略", overlay=true)
//=== 1) 參數 ===//
fast_length = input.int(title="Fast Length", defval=12)
slow_length = input.int(title="Slow Length", defval=26)
src = input.source(title="MACD Source", defval=close)
signal_length = input.int(title="Signal Smoothing", defval=9, minval=1, maxval=50)
sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA","EMA"])
sma_signal = input.string(title="Signal MA Type", defval="EMA", options=["SMA","EMA"])
// 啟用多單 / 空單
useLong = input.bool(title="啟用多單?(底部紅色)", defval=true)
useShort = input.bool(title="啟用空單?(頂部綠色)", defval=true)
// 止盈倍數 (1~10倍 ATR)
tpATRmult = input.int(title="止盈 ATR 倍數 (1~10)", defval=10, minval=1, maxval=500)
// 止損倍數 (1~10倍 ATR)
slATRmult = input.int(title="止損 ATR 倍數 (1~10)", defval=3, minval=1, maxval=500)
//=== 2) MACD 計算 ===//
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//=== 3) 判斷深色/淺色(用於變化訊號)===//
darkGreen = hist >= 0 and hist <= hist[1] // 上方,柱子縮小或持平
lightGreen = hist >= 0 and hist > hist[1] // 上方,柱子變大
darkRed = hist < 0 and hist <= hist[1] // 下方,柱子(絕對值)變大或持平
lightRed = hist < 0 and hist > hist[1] // 下方,柱子(絕對值)變小
// 由「深 → 淺」是否發生在上一根
colorChangeToLightGreen = darkGreen[1] and lightGreen
colorChangeToLightRed = darkRed[1] and lightRed
//=== 4) ATR 計算 (用於止盈止損) ===//
atrPeriod = 14
atrValue = ta.atr(atrPeriod)
//=== 5) 多單策略:深紅 → 淺紅 (底部紅色) ===//
if useLong and colorChangeToLightRed
// 以當前 K 線 low - ATR倍數 作為多單止損
longStopLoss = low - (slATRmult * atrValue)
// 以當前 close + ATR倍數 作為多單止盈
longTakeProfit = close + (tpATRmult * atrValue)
// 進多單
strategy.entry("Long Entry", strategy.long, comment="多", qty=1)
strategy.exit("平多", "Long Entry", stop=longStopLoss, limit=longTakeProfit)
//=== 6) 空單策略:深綠 → 淺綠 (頂部綠色) ===//
if useShort and colorChangeToLightGreen
// 以當前 K 線 high + ATR倍數 作為空單止損
shortStopLoss = high + (slATRmult * atrValue)
// 以當前 close - ATR倍數 作為空單止盈
shortTakeProfit = close - (tpATRmult * atrValue)
// 進空單
strategy.entry("Short Entry", strategy.short, comment="空", qty=1)
strategy.exit("平空", "Short Entry", stop=shortStopLoss, limit=shortTakeProfit)
//=== 7) 繪製 MACD 與直方圖 ===//
hline(0, "Zero Line", color=color.new(#787B86, 50))
// 長條圖顏色:
// - 上方 (hist >= 0) 時:hist 比前一根大 (淺綠) 或小 (深綠)
// - 下方 (hist < 0) 時:hist 比前一根大 (淺紅) 或小 (深紅)
plot(hist,title="Histogram",style=plot.style_columns,color = hist >= 0? (hist > hist[1] ? #26A69A : #B2DFDB) : (hist > hist[1] ? #FFCDD2 : #FF5252) )
// 繪製 MACD 與 Signal
plot(macd, title="MACD", color=#2962FF)
plot(signal, title="Signal", color=#FF6D00)