Основная идея этой стратегии заключается в использовании поворотных точек для количественной торговли. Он ищет важные высокие и низкие колебания и совершает обратные сделки, когда цены проходят через эти ключевые уровни.
Стратегия сначала определяет функции pivotHighSig (()) и pivotLowSig (()) для определения высоких и низких точек.
В частности, для подъемных максимумов он ищет несколько более высоких максимумов слева и несколько более низких максимумов справа. Таким образом, пивотное максимум находится на относительно более высоком уровне. Критерии подъемных минимумов противоположны - он ищет более высокие минимумы и более низкие минимумы с обеих сторон.
После определения высоких и низких уровней, стратегия далее выбирает ключевые точки из этих ключевых точек, т.е. важные точки из ключевых точек.
Наконец, реверсивные сделки принимаются, когда цены прорываются через поворотные точки поворотов.
Эта количественная стратегия, основанная на ключевых точках, имеет следующие преимущества:
Эта стратегия также сопряжена с некоторыми рисками:
Эта стратегия может быть улучшена в следующих областях:
В целом эта стратегия работает хорошо. Основная идея заключается в том, чтобы обнаружить важные поворотные точки и торговать их прорывами. Дальнейшие улучшения могут генерировать более солидные и надежные сигналы для более высокой и более последовательной прибыли.
/*backtest start: 2023-02-13 00:00:00 end: 2024-02-19 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Pivot of Pivot Reversal Strategy [QuantNomad]", shorttitle = "PoP Reversal Strategy [QN]", 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]) 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]) // Pivots of pivots ph1 = 0.0 ph2 = 0.0 ph3 = 0.0 pl1 = 0.0 pl2 = 0.0 pl3 = 0.0 pphprice = 0.0 pplprice = 0.0 ph3 := swh_cond ? nz(ph2[1]) : nz(ph3[1]) ph2 := swh_cond ? nz(ph1[1]) : nz(ph2[1]) ph1 := swh_cond ? hprice : nz(ph1[1]) pl3 := swl_cond ? nz(pl2[1]) : nz(pl3[1]) pl2 := swl_cond ? nz(pl1[1]) : nz(pl2[1]) pl1 := swl_cond ? lprice : nz(pl1[1]) pphprice := swh_cond and ph2 > ph1 and ph2 > ph3 ? ph2 : nz(pphprice[1]) pplprice := swl_cond and pl2 < pl1 and pl2 < pl3 ? pl2 : nz(pplprice[1]) if (le) strategy.entry("PP_RevLE", strategy.long, comment="PP_RevLE", stop=pphprice + syminfo.mintick) if (se) strategy.entry("PP_RevSE", strategy.short, comment="PP_RevSE", stop=pplprice - syminfo.mintick) // Plotting plot(lprice, color = color.red, transp = 55) plot(hprice, color = color.green, transp = 55) plot(pplprice, color = color.red, transp = 0, linewidth = 2) plot(pphprice, color = color.green, transp = 0, linewidth = 2)