该策略是一个利用抛物线滑点值(Parabolic SAR)与K线进行交叉操作,实现动量追踪和止损的Swing交易策略。策略会在看涨和看跌形势下建立做多和做空仓位,在价格反转时平掉这些仓位止损。
该策略主要依靠抛物线指标(Parabolic SAR)判断当前是价格上涨趋势还是下跌趋势。当Parabolic SAR指标在K线下方时,表示目前处于价格上涨状态,这时策略会在每根K线收盘时检查Parabolic SAR值是否上穿K线最低价,如果没有上穿,说明上涨趋势继续,策略会建立做多仓位;如果Parabolic SAR上穿K线最低价,说明上涨趋势反转为下跌,这时策略会平掉做多仓位止损。相反,当Parabolic SAR指标在K线上方时,表示目前处于价格下跌状态。这时,策略会在每根K线收盘时检查Parabolic SAR值是否下穿K线最高价,如果没有下穿,则建立做空头寸;如果下穿,说明下跌趋势反转为上涨,这时平掉做空头寸止损。
通过这样的操作原理,该策略能够在确认的价格趋势下顺势建立仓位,并在第一时间止损,从而锁定盈利。同时,抛物线作为动量指标,能够更准确地判断趋势是否反转,这也使得止损更为精确。
提高策略健壮性的方法包括:优化止损点设置使其足够严格;结合其他指标判断作为确认;调整指标参数适应市场环境变化;根据不同品种选择最优参数组合等。
该抛物线Swing策略整体来说是一个效果较好的短线操作策略。它利用抛物线指标判断趋势方向和 prices 的动量变化,配合Swing交易方式,在品种上涨和下跌阶段反复建立做多和做空仓位。严格的止损机制也使得该策略风险控制能力较强。但作为单一指标策略,抛物线的失效也会对策略产生较大的影响。所以这是一个有一定优势和潜力,但也存在一定风险的策略,需要根据实际情况检验和不断优化,才能使其产生持续稳定的超额收益。
/*backtest
start: 2023-12-14 00:00:00
end: 2023-12-21 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Parabolic SAR Strategy", overlay=true)
start = input(0.05)
increment = input(0.075)
maximum = input(1)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
//monday and session
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
var bool uptrend = na
var float EP = na
var float SAR = na
var float AF = start
var float nextBarSAR = na
if bar_index > 0
firstTrendBar = false
SAR := nextBarSAR
if bar_index == 1
float prevSAR = na
float prevEP = na
lowPrev = low[1]
highPrev = high[1]
closeCur = close
closePrev = close[1]
if closeCur > closePrev
uptrend := true
EP := high
prevSAR := lowPrev
prevEP := high
else
uptrend := false
EP := low
prevSAR := highPrev
prevEP := low
firstTrendBar := true
SAR := prevSAR + start * (prevEP - prevSAR)
if uptrend
if SAR > low
firstTrendBar := true
uptrend := false
SAR := max(EP, high)
EP := low
AF := start
else
if SAR < high
firstTrendBar := true
uptrend := true
SAR := min(EP, low)
EP := high
AF := start
if not firstTrendBar
if uptrend
if high > EP
EP := high
AF := min(AF + increment, maximum)
else
if low < EP
EP := low
AF := min(AF + increment, maximum)
if uptrend
SAR := min(SAR, low[1])
if bar_index > 1
SAR := min(SAR, low[2])
else
SAR := max(SAR, high[1])
if bar_index > 1
SAR := max(SAR, high[2])
nextBarSAR := SAR + AF * (EP - SAR)
if barstate.isconfirmed and time_cond
if uptrend
strategy.entry("ParSE", strategy.short, stop=nextBarSAR, comment="ParSE")
strategy.cancel("ParLE")
else
strategy.entry("ParLE", strategy.long, stop=nextBarSAR, comment="ParLE")
strategy.cancel("ParSE")
plot(SAR, style=plot.style_cross, linewidth=3, color=color.orange)
plot(nextBarSAR, style=plot.style_cross, linewidth=3, color=color.aqua)
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)