该策略基于移动平均线,在趋势向上的过程中,在短期回调之后开仓做多,属于趋势跟踪类型策略。
该策略使用3条不同周期的EMA线,EMA1线用于判断短期趋势,它要比其他两条EMA线周期短;EMA2线和EMA3线用于判断中长期趋势,其中EMA3线周期最长。当短期EMA1线上涨时说明处于短期上涨趋势中,EMA2线在EMA3线之上则说明中长期也处于上涨趋势中,所以这时是一个较好的做多时机点。具体来说,该策略的交易信号生成逻辑是:价格上穿EMA1线时则产生做多信号。为了进一步验证趋势稳定性,要求在产生信号的栏中,EMA2和EMA3都向上,并且最后一个bar也是上涨的,这样可以过滤掉短期调整带来的错误信号。
设置止损平仓线和止盈平仓线,可以锁定盈亏。具体来说,止损线按照ATR的值移动,止盈线也是按照ATR的值移动设置的。
该策略最大优势就是能够有效捕捉中长线上涨趋势,同时也考虑了短期调整,这使得它的持仓时间和盈利空间都很可观。
另外设置了止损和止盈机制也使其风险可控。
该策略最大风险在于无法判断趋势反转点,如果中长线趋势反转而短期还在上涨,这时就会产生错误的做多信号而入场,从而可能造成较大损失。
此外在盘整行情中也可能产生不必要的交易损失。
可以考虑根据具体交易品种特点,调整EMA的周期参数,使之更加匹配该品种的中长线周期。
可以结合其他指标判断短期调整的结束,避免错误入场。
可以考虑根据ATR数值的大小来调整止损系数,在ATR较大时适当放宽止损距离。
该策略总体来说是一种表现良好的中长线趋势跟踪策略。通过移动平均线判断趋势方向、回调信号判定入场时机、止盈止损设置来锁定盈亏。但也存在一定盲目跟踪的风险,需结合交易者自身对行情的判断来决定是否入场。
/*backtest start: 2024-01-21 00:00:00 end: 2024-01-28 00:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Trend Continuation', shorttitle='Trend_Continuation', overlay=true) // Input price = input(close) MA1_Length = input.int(50, step=1, title='EMA 1 Length') MA2_Length = input.int(80, step=1, title='EMA 2 Length') MA3_Length = input.int(200, step=1, title='EMA 3 Length') numberOfCandles = input(1) slATRFactor = input(3.5) tpATRFactor = input(3.5) ATRLength = input(14) // switch1=input(true, title="Show Bar Color?") // switch2=input(true, title="Show Moving Averages?") // Calculation MA1 = ta.ema(price, MA1_Length) MA2 = ta.ema(price, MA2_Length) MA3 = ta.ema(price, MA3_Length) prev_price = close[numberOfCandles] // Strategy allPositive = true for i = 0 to numberOfCandles - 1 by 1 if close[i] < close[i + 1] or close[i] < MA1 allPositive := false break long = MA2 > MA3 and price > MA1 and ta.crossunder(prev_price, MA1) and allPositive // short = crossover(price, MA3) or ( change(price)>0 and change(MA1)>0 and crossover(price,MA1) and change(MA2)<0 ) if long strategy.entry('Long', strategy.long, comment='Long') bought = strategy.position_size[0] > strategy.position_size[1] atrAtLong = ta.valuewhen(bought, ta.atr(ATRLength), 0) // Stop loss and take profit slPrice = strategy.position_avg_price - slATRFactor * atrAtLong tpPrice = strategy.position_avg_price + tpATRFactor * atrAtLong SL = plot(slPrice, title='SL', style=plot.style_linebr, linewidth=1, color=color.new(color.red, 0)) if price >= tpPrice and price < MA1 strategy.close('Long') if price < strategy.position_avg_price strategy.exit('Stop Loss', 'Long', stop=slPrice) // Strategy Alert alertcondition(long, title='Long Alert', message='Go Long!') // alertcondition(short, title='EMA Slope + EMA Cross Strategy, Short Alert', message='Go Short!') // MA trend bar color // up = change(MA2)>0 and change(MA3)>0 // dn = change(MA2)<0 and change(MA3)<0 // bar_color = up?green:dn?red:blue // barcolor(switch1?bar_color:na) // MA trend output color change_1 = ta.change(MA2) MA2_color = ta.change(MA2) > 0 ? color.lime : change_1 < 0 ? color.red : color.blue change_2 = ta.change(MA3) MA3_color = ta.change(MA3) > 0 ? color.lime : change_2 < 0 ? color.red : color.blue // MA output // EMA2 = plot(switch2?MA2:na, title="EMA 2", style=linebr, linewidth=2, color=MA2_color) // EMA3 = plot(switch2?MA3:na, title="EMA 3", style=linebr, linewidth=4, color=MA3_color) // fill(EMA2, EMA3, color=silver, transp=50) color_1 = MA2 > MA3 ? color.green : color.red EMA1 = plot(MA1, title='EMA 1', style=plot.style_linebr, linewidth=1, color=color_1) // EMA2 = plot(MA2, title="EMA 2", style=linebr, linewidth=2, color=blue) // EMA3 = plot(MA3, title="EMA 3", style=linebr, linewidth=3, color=red) //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)