基于Parabolic-SAR和EMA的趋势跟踪策略Parabolic-SAR-and-EMA-Trend-Tracking-Strategy
ChaoZhang · PineScript · 趋势跟踪 · 2023-12-22 13:04:55
概述
该策略主要思想是同时利用Parabolic SAR和EMA两个指标来识别趋势方向和入市时机。其中,Parabolic SAR用于判断当前趋势方向,EMA用于辅助确定具体的入市时机。当SAR在价格上方时为熊市,当SAR在价格下方时为牛市。入市时则要求价格突破EMA才认为趋势开始形成,此时跟随趋势方向入市。
策略原理
该策略的核心指标是Parabolic SAR,它是一个能够跟踪价格并判断趋势反转的技术分析工具。其计算公式较为复杂,但原理较为简单直观。SAR指标通过不断调整自己的位置,始终保持在价格的背后,当价格反转时,它会立即调整位置到价格的另一侧。因此,只需要观察SAR指标相对价格的位置,就可以判断目前的趋势方向。 辅助该策略的另一个指标是EMA。与SAR不同,EMA更适合判断趋势的持续性。通过要求价格需突破EMA之后才入场,可以有效过滤掉部分噪声。且EMA还可用于确认反转信号。例如当价格跌破上升趋势的EMA时,很可能是趋势反转的信号。 综上,该策略的具体交易规则如下:
- 使用SAR判断趋势方向,SAR在价格上方为熊市,在价格下方为牛市
- 在牛市中,当价格大于EMA时做多;在熊市中,当价格小于EMA时做空
- 止损点设置为SAR的值,以控制风险
通过Parabolic SAR判断大趋势,再利用EMA过滤误导信号,既可以锁定趋势又可控制风险,实现了对趋势的有效跟踪。
优势
该策略具有以下几点主要优势:
- 跟踪趋势能力强。SAR对于趋势反转的判断非常灵敏,可有效锁定趋势方向。
- 准确率较高。EMA可过滤噪声,避免被套。
- 风险控制到位。通过SAR设置止损点,可控制单笔损失。
- 实施难度不高。策略规则简单明确,容易理解和实施。
总的来说,该策略集成了多个指标的优点,在抓住趋势的同时也做到了有效的风险控制,是一种表现稳定、易于掌握的趋势跟踪策略。
风险
尽管该策略有诸多优势,但在实际运行中也还是存在一定的风险需要防范,主要风险有:
- 趋势反转风险。当趋势发生反转时,该策略无法及时止损,可能造成较大损失。
- 震荡行情风险。在震荡行情中,策略会产生多次小额损失。
- 参数优化风险。SAR和EMA的参数设置会影响策略表现,需要反复测试找到最优参数。
为降低上述风险,可以从以下几个方面进行优化:
- 结合其他指标判断趋势反转时机,设置更加灵敏的止损点。
- 增加过滤器,避免震荡行情的频繁开仓。
- 利用遗传算法等手段对参数组合进行优化,找到最优参数。
优化方向
进一步优化该策略,可以考虑从以下几个方面入手:
- 优化参数设置。可以通过更系统的方法如遗传算法对EMA和SAR的参数进行测试和优化,找到最优参数组合。
- 增加趋势判断工具。可以加入MACD、布林带等其他指标来确认趋势,提高准确性。
- 设置动态止损。可以根据ATR等指标设置动态的止损点,让止损更加灵活。
- 考虑交易成本。引入滑点和手续费参数,优化净利润而非绝对收益。
- 分层入场出场。可以设置更复杂的多级入场出场机制,在趋势不同阶段进行分批建仓或止损。
通过上述几点优化后,策略在跟踪趋势的同时,可望获得更高稳定性、更精准判断和更强风险控制能力,从而获得 mejor 绩效。
总结
基于Parabolic SAR和EMA的趋势跟踪策略,集成了多个指标判断趋势方向和入场时机的优势,通过设置SAR作为止损点,风险控制到位,是一种表现相对稳定的量化策略。该策略具有判断准确率高、易于掌握等优点,值得投资者参考学习。但也存在一定的风险,需要对参数和止损方式进行进一步优化,才能获得更佳的绩效。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| v_input_1 | 100 | EMA Length |
| v_input_2 | false | EMA Offset % |
| v_input_3 | 0.015 | start |
| v_input_4 | 0.005 | increment |
| v_input_5 | 0.2 | maximum |
| v_input_6 | true | From Day |
| v_input_7 | true | From Month |
| v_input_8 | 2019 | From Year |
| v_input_9 | true | To Day |
| v_input_10 | true | To Month |
| v_input_11 | 2020 | To Year |
源码(66 行)
/*backtest
start: 2022-12-15 00:00:00
end: 2023-12-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Parabolic SAR Strategy w/ EMA", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
emalength = input(100 , "EMA Length")
emaoffset = input(0.00, "EMA Offset %")
start = input(0.015)
increment = input(0.005)
maximum = input(0.2)
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
// From Date Inputs
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 = 2019, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
////////////////////////////////////////////////////////////////////////////////
psar = sar(start, increment, maximum)
ema = ema(close, emalength)
offset = (emaoffset / 100) * ema
// Signals
psar_long = high[1] < psar[2] and high > psar[1]
psar_short = low[1] > psar[2] and low < psar[1]
// Plot PSAR
plotshape(psar, location = location.absolute, style = shape.cross, size = size.tiny, color = low < psar[1] and not psar_long ? green : red)
//Plot EMA
plot(ema)
if(psar_long)
strategy.close("Short")
if(psar_short)
strategy.close("Long")
if (psar < low and time_cond and close > ema + offset)
strategy.entry("Long", strategy.long, comment="Long", stop = psar)
if (psar > high and time_cond and close < ema - offset)
strategy.entry("Short", strategy.short, comment="Short", stop = psar)
if (not time_cond)
strategy.close_all()