本策略融合了MACD柱色和线性回归指标,通过巧妙的组合实现高频的反转交易,特别适合短线套利和对冲,属于典型的市场中性策略。
该策略主要由以下几部分组成:
MACD柱色作为趋势判断指标。当MACD柱子颜色是绿色时,说明处于上涨趋势,这时不做空单;当MACD柱子颜色是红色时,说明处于下跌趋势,这时不做多单。
线性回归作为关键的交易信号指标。当价格从下方上穿线性回归时,做多;当价格从上方下穿线性回归时,做空。
PAC通道由高、低、收盘价的EMA组成,用于判断线性回归的方向。只有当线性回归方向符合通道内趋势时,才产生交易信号。
EMA 89作为止损线,当价格重新回穿该线时,平仓止损。
交易信号的生成逻辑是:
多头信号:线性回归上穿PAC通道下轨 且 线性回归上坡趋势 且 MACD柱子颜色不是红色 空头信号:线性回归下穿PAC通道上轨 且 线性回归下坡趋势 且 MACD柱子颜色不是绿色
止损退出信号:价格下穿EMA 89
该策略结合趋势判断和关键价格水平,实现高频的对冲交易。
使用MACD柱子颜色判断大趋势,避免逆势交易。
线性回归具有平滑性,可以过滤掉部分噪音。
EMA形成的通道清晰地界定多空方向。
止损线设置合理,最大限度保证盈利。
交易频率高,适合借助程序交易的高频策略。
实现对冲交易,可在震荡行情中获利。
线性回归和通道指标都需要一定参数优化,否则可能出现失效。
大幅震荡行情中止损可能较频繁被触发。可以适当放宽止损范围。
交易次数较高,需要注意手续费的影响。
MACD指标具有一定滞后性,可能错过短期趋势反转。
EMA通道也需要不断优化,以适应市场变化。
调整线性回归和通道参数,使指标更符合不同品种特点。
放宽止损幅度,同时确保止盈比大于1。
优化MACD参数,使其能捕捉到更多短期信号。
尝试其他指标替代线性回归,如布林线。
增加仓位控制,防止单边亏损过大。
结合RSI等指标过滤部分交易信号。
本策略综合运用多种技术指标,实现高频的对冲交易。其优势在于抓住短期反转,风险控制合理,非常适合市场震荡时期。同时也需要注意一定的参数优化和改进,防止出现过拟合。如果管理得当,可以成为具有很强实战意义的高频策略。
/*backtest start: 2022-10-20 00:00:00 end: 2023-10-26 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 // strategy("Sonic R + Linear Reg + Kumo Cloud + Barcolor MACD", overlay=true,default_qty_value=10000,initial_capital=200,currency=currency.USD, pyramiding=1) EMA = input(defval=89, title="EMA Signal") HiLoLen = input(34, minval=2,title="High Low channel Length") pacC = ema(close,HiLoLen) pacL = ema(low,HiLoLen) pacH = ema(high,HiLoLen) DODGERBLUE = #1E90FFFF // Plot the Price Action Channel (PAC) base on EMA high,low and close// L=plot(pacL, color=DODGERBLUE, linewidth=1, title="High PAC EMA",transp=90) H=plot(pacH, color=DODGERBLUE, linewidth=1, title="Low PAC EMA",transp=90) C=plot(pacC, color=DODGERBLUE, linewidth=2, title="Close PAC EMA",transp=80) //Moving Average// signalMA =ema(close,EMA) plot(signalMA,title="EMA Signal",color=black,linewidth=3,style=line) linereg = linreg(close, EMA, 0) plot(linereg, color = orange, title = "Linear Regression Curve", style = line, linewidth = 1) //////ICHIMOKU///////// conversionPeriods = input(9), basePeriods = input(26, minval=1, title="Base Line") laggingSpan2Periods = input(52, minval=1, title="Lagging Span"), displacement = input(26, minval=1) donchian(len) => avg(lowest(len), highest(len)) conversionLine = donchian(conversionPeriods) baseLine = donchian(basePeriods) leadLine1 = avg(conversionLine, baseLine) leadLine2 = donchian(laggingSpan2Periods-1) p1 = plot(leadLine1, offset = displacement-1, color=gray,title="Senkou span A", transp=90) p2 = plot(leadLine2, offset = displacement-1, color=gray, title="Senkou span B", transp=90) fill(p1, p2, color = leadLine1 > leadLine2 ? green : red, title="Kumo Cloud") ///////////////// MACD BARCOLOR ///////////////////// fastLength = input(12) slowlength = input(26) MACDLength = input(9) MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD hisup= iff(delta>delta[1] and delta>0, 1, iff(delta<delta[1], -1, nz(hisup[1], 0))) hisdown = iff(delta<delta[1] and delta<0, 1, iff(delta>delta[1], -1, nz(hisdown[1], 0))) barcolor(hisup==1 and MACD>0 ? lime: hisdown==1 and MACD<0 ? red : blue ) ///////////// SIGNAL /////////////// conbuy = iff(crossover(linereg,pacL) and rising(linereg,5), 1, iff(crossover(linereg,pacH) or (crossunder(linereg,pacL) and pacL<signalMA), -1, nz(conbuy[1], 0))) consell = iff(crossunder(linereg,pacH) and falling(linereg,5), 1, iff(crossunder(linereg,pacL) or (crossover(linereg,pacH) and pacH>signalMA), -1, nz(consell[1], 0))) golong= conbuy==1 and close>open and open<pacH and close>linereg and hisdown!=1 goshort= consell==1 and close<open and open>pacL and close<linereg and hisup!=1 if(golong) strategy.entry("Buy",strategy.long) if(goshort) strategy.entry("Sell",strategy.short) closelong= conbuy==-1 closeshort=consell==-1 if(closelong) strategy.close("Buy") if(closeshort) strategy.close("Sell") ////////////// TP and SL//. //SL = input(defval=200.00, title="Stop Loss Point", type=float, step=1) //rr= input(defval=0.1,title="Reward/Risk",type=float) //useTPandSL = input(defval = false, title = "Use exit order strategy?") //Stop = SL //Take=SL*rr //Q = 100 //if(useTPandSL) // strategy.exit("Out Long", "Buy", qty_percent=Q, profit= Take, loss=Stop) // strategy.exit("Out Short", "Sell", qty_percent=Q, profit= Take, loss=Stop)