该策略是在传统的支点反转策略基础上进行优化,主要通过计算ATR并设置ATR过滤因子,来过滤掉一些无意义的支点,只交易那些真正重要的支点。
该策略的核心逻辑是计算出重要的高点支点和低点支点。计算高点支点的主要步骤是:
计算低点支点的逻辑与此类似。
获得重要支点后,当价格突破该重要高点支点时,做空;当价格突破该重要低点支点时,做多。
该策略的主要优势有:
该策略的主要风险有:
为控制上述风险,可以从以下几个方面进行优化: 1. 优化ATR参数,保证有足够的交易机会。 2. 设置合理的止损止盈比例。 3. 适当调整开仓手数,降低交易成本的影响。
该策略还可以从以下几个方向进行进一步优化:
结合其他指标判断市场趋势状态,避免反转交易出现在趋势行情中。可以考虑加入MACD,KDJ等指标。
增加机器学习算法,自动优化参数。可以使用genetic algorithm, random forest等方法寻找最优参数组合。
加入量化数据进行训练,找到最佳的ATR范围。增加历史数据可以提高参数选择的准确性。
可以考虑与其他策略组合使用,结合不同类型策略的优势。例如与趋势跟踪策略组合,在盘整中反转,在趋势中顺势。
该重要支点反转策略通过计算ATR并设置过滤因子的方法过滤无意义小波动,只在重要支点进行反转交易,可以有效提高策略的盈利水平。同时也增加了一定参数优化难度,需要从ATR范围、止损止盈比例等多个方面综合考虑找到最优参数。如果参数优化到位,该策略可以成为高效稳定的短线交易策略。
/*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)