策略
重要支点反转策略Significant-Pivot-Points-Reversal-Strategy
ChaoZhang · PineScript · 波动率与通道 · 2024-01-29 14:58:15
概述
该策略是在传统的支点反转策略基础上进行优化,主要通过计算ATR并设置ATR过滤因子,来过滤掉一些无意义的支点,只交易那些真正重要的支点。
策略原理
该策略的核心逻辑是计算出重要的高点支点和低点支点。计算高点支点的主要步骤是:
- 计算ATR,设置ATR过滤因子atr_mult。
- 遍历左侧一定数量的K线(由leftBars设置),如果高点支点高于任何一个左侧K线的高点+ATR*atr_mult,则该支点无效。
- 遍历右侧一定数量的K线(由rightBars设置),如果高点支点高于任何一个右侧K线的高点+ATR*atr_mult,则该支点无效。
- 如果高点支点经过上述检验仍然有效,则返回该高点作为重要的高点支点。
计算低点支点的逻辑与此类似。 获得重要支点后,当价格突破该重要高点支点时,做空;当价格突破该重要低点支点时,做多。
优势
该策略的主要优势有:
- 通过ATR和atr_mult过滤参数,可以过滤掉无意义的小波动,只交易真正重要的支点,避免无谓的交易。
- ATR参数可以动态调整,在大幅波动市场中自动调整交易范围,避免过度交易。
- 支点反转策略本身就具有比较高的胜率和盈利率。
风险
该策略的主要风险有:
- ATR参数设置不当可能过滤掉太多有效交易机会。如果ATR太大,有效支点也可能被过滤。
- 支点反转策略本身依然存在被套牢的风险,需要设置止损来控制风险。
- 反转类策略对交易成本比较敏感,需要合理设置止损和止盈。
为控制上述风险,可以从以下几个方面进行优化:
- 优化ATR参数,保证有足够的交易机会。
- 设置合理的止损止盈比例。
- 适当调整开仓手数,降低交易成本的影响。
优化方向
该策略还可以从以下几个方向进行进一步优化:
- 结合其他指标判断市场趋势状态,避免反转交易出现在趋势行情中。可以考虑加入MACD,KDJ等指标。
- 增加机器学习算法,自动优化参数。可以使用genetic algorithm, random forest等方法寻找最优参数组合。
- 加入量化数据进行训练,找到最佳的ATR范围。增加历史数据可以提高参数选择的准确性。
- 可以考虑与其他策略组合使用,结合不同类型策略的优势。例如与趋势跟踪策略组合,在盘整中反转,在趋势中顺势。
总结
该重要支点反转策略通过计算ATR并设置过滤因子的方法过滤无意义小波动,只在重要支点进行反转交易,可以有效提高策略的盈利水平。同时也增加了一定参数优化难度,需要从ATR范围、止损止盈比例等多个方面综合考虑找到最优参数。如果参数优化到位,该策略可以成为高效稳定的短线交易策略。
参数
| 参数 | 默认值 | 说明 |
|---|---|---|
| v_input_1 | 4 | PP Left Bars |
| v_input_2 | 2 | PP Right Bars |
| v_input_3 | 14 | ATR Length |
| v_input_4 | 0.1 | ATR Mult |
源码(71 行)
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("QuantNomad - Significant Pivot Reversal Strategy", shorttitle = "SPPS", overlay=true)
// Inputs
leftBars = input(4, title = 'PP Left Bars')
rightBars = input(2, title = 'PP Right Bars')
atr_length = input(14, title = 'ATR Length')
atr_mult = input(0.1, title = 'ATR Mult')
// Pivot High Significant Function
pivotHighSig(left, right) =>
pp_ok = true
atr = atr(atr_length)
for i = 1 to left
if (high[right] < high[right+i] + atr * atr_mult)
pp_ok := false
for i = 0 to right-1
if (high[right] < high[i] + atr * atr_mult)
pp_ok := false
pp_ok ? high[right] : na
// Pivot Low Significant Function
pivotLowSig(left, right) =>
pp_ok = true
atr = atr(atr_length)
for i = 1 to left
if (low[right] > low[right+i] - atr * atr_mult)
pp_ok := false
for i = 0 to right-1
if (low[right] > low[i] - atr * atr_mult)
pp_ok := false
pp_ok ? low[right] : na
swh = pivotHighSig(leftBars, rightBars)
swl = pivotLowSig (leftBars, rightBars)
swh_cond = not na(swh)
hprice = 0.0
hprice := swh_cond ? swh : hprice[1]
le = false
le := swh_cond ? true : (le[1] and high > hprice ? false : le[1])
if (le)
strategy.entry("PivRevLE", strategy.long, comment="PivRevLE", stop=hprice + syminfo.mintick)
swl_cond = not na(swl)
lprice = 0.0
lprice := swl_cond ? swl : lprice[1]
se = false
se := swl_cond ? true : (se[1] and low < lprice ? false : se[1])
if (se)
strategy.entry("PivRevSE", strategy.short, comment="PivRevSE", stop=lprice - syminfo.mintick)