本策略融合了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)