MACD Stochastics波段震荡突破策略(MACD Stochastics Oscillation Breakout Strategy)是一个结合MACD指标和Stochastics指标的量化交易策略。该策略试图识别股票价格的趋势方向,并在价格从震荡区间突破时进入仓位。
在进入仓位时,该策略同时考虑MACD和Stochastics两个指标的信号,以提高 Entries的质量。另外,该策略预设了止损点和止盈点,可以有效控制风险。
MACD Stochastics波段震荡突破策略主要基于以下原理:
具体来说,该策略以MACD指标的DIFF线和DEA线交叉作为判断价格趋势方向的信号。当DIFF向上突破DEA时生成多头信号,反之生成空头信号。
同时,Stochastics的K线在超买超卖区域(默认30和70)附近与D线发生向上或向下交叉也会产生交易信号。
当MACD指标和Stochastics指标同时给出同向信号时,该策略会选择入场。此时股票价格很可能会产生较大的突破。
入场后,策略会设置理性的止损点和止盈点。合理止损可以有效控制单笔损失,止盈可以锁定盈利。
MACD Stochastics波段震荡突破策略具有以下优势:
该策略同时利用MACD和Stochastics两个指标,可以过滤掉一些假信号,提高Entries质量。
策略专门设计来抓住股价长时间震荡后的突破行情。这类行情幅度通常较大。
策略内置了止损止盈设定,可以合理控制单笔损失,并及时锁定盈利。
尽管 MACD Stochastics波段震荡突破策略进行了慎重设计,仍然存在一定的风险:
股票价格突破前可能出现一定假突破情况。如果入场时机选择不当可能会使这次进入变成错过最佳入场点。
尽管突破前做了充分准备,但仍然存在突破失败的可能性。这种情况下会产生损失。
策略的参数设置会对结果产生很大影响。如果参数设置不当,会大打折扣。
针对以上风险,可以通过以下方式进行优化:
组合其他指标过滤信号
人工干预确保突破立场
多组参数优化测试
MACD Stochastics波段震荡突破策略仍有进一步优化的空间:
优化 MACD 参数,找到最佳参数组合
优化 Stochastics 参数,找到最佳参数组合
增加其他指标组合,例如 KDJ、BOLL 等,进一步提升 Entries 质量
测试不同持仓时间,优化止盈止损策略
测试不同交易标的参数差异性
增加机器学习算法,自动优化参数
MACD Stochastics波段震荡突破策略综合运用 MACD 和 Stochastics 两个指标,在波段震荡突破时高质量入场,顺势而为。同时辅以止损止盈策略有效控制风险。该策略抓住股票价格的短期趋势行情,具有一定的交易优势。但也还有参数优化和技术指标组合方面的探索空间,有待于进一步优化。
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="macd stoch strategy", shorttitle="benzo MACD stoch",overlay=true)
// Getting inputs
fast_length = input(title = "Fast Length", defval = 180)
slow_length = input(title = "Slow Length", defval = 390)
src = input(title = "Source", defval = close)
signal_length = input.int(title = "Signal Smoothing", minval = 1, maxval = 500, defval = 135)
sma_source = input.string(title = "Oscillator MA Type", defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
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
// hline(0, "Zero Line", color = color.new(#787B86, 50))
// plot(hist, title = "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
// plot(macd, title = "MACD", color = #2962FF)
// plot(signal, title = "Signal", color = #FF6D00)
periodK = input.int(14, title="%K Length", minval=1)
smoothK = input.int(1, title="%K Smoothing", minval=1)
periodD = input.int(3, title="%D Smoothing", minval=1)
k = ta.sma(ta.stoch(close, high, low, periodK), smoothK)
d = ta.sma(k, periodD)
// plot(k, title="%K", color=#2962FF)
// plot(d, title="%D", color=#FF6D00)
// h0 = hline(80, "Upper Band", color=#787B86)
// hline(50, "Middle Band", color=color.new(#787B86, 50))
// h1 = hline(20, "Lower Band", color=#787B86)
// fill(h0, h1, color=color.rgb(33, 150, 243, 90), title="Background")
// Make inputs that set the take profit % (optional)
longProfitPerc = input.float(3, title="Long Take Profit (%)", minval=0.0, step=0.1) * 0.01
shortProfitPerc = input.float(3, title="Short Take Profit (%)",minval=0.0, step=0.1) * 0.01
// Calculate trading conditions
enterLong = macd>signal and ta.crossover(k,30)
enterShort = macd<signal and ta.crossunder(k,70)
// Figure out take profit price
longExitPrice = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
// Plot take profit values for confirmation
plot(strategy.position_size > 0 ? longExitPrice : na,
color=color.green, style=plot.style_circles,
linewidth=3, title="Long Take Profit")
plot(strategy.position_size < 0 ? shortExitPrice : na,
color=color.red, style=plot.style_circles,
linewidth=3, title="Short Take Profit")
// Submit entry orders
if enterLong
strategy.entry("long", strategy.long)
if enterShort
strategy.entry("short", strategy.short)
// STEP 3:
// Submit exit orders based on take profit price
if strategy.position_size > 0
strategy.exit("long TP", limit=longExitPrice)
if strategy.position_size < 0
strategy.exit("short TP", limit=shortExitPrice)