이 전략의 핵심 아이디어는 양적 거래에 피벗 포인트를 사용하는 것입니다. 중요한 스윙 고도와 하도를 찾고 가격이 이러한 핵심 수준을 넘어서면 역전 거래를합니다.
전략은 먼저 피보트HighSig() 및 피보트LowSig() 함수를 정의하여 스윙 고점과 저점을 찾습니다. 이 두 함수는 왼쪽과 오른쪽의 자격있는 피보트 포인트를 검색합니다.
특히, 스윙 하이즈의 경우 왼쪽에서 여러 개의 높은 하이즈와 오른쪽에서 여러 개의 낮은 하이즈를 찾습니다. 따라서 피보트 하이즈는 상대적으로 높은 수준에 위치합니다. 스윙 로우스의 기준은 반대입니다. 양쪽에서 더 높은 로우와 더 낮은 로우를 찾습니다.
스윙 고도와 하위점을 찾은 후 전략은 그 피브트 포인트, 즉 피브트에서 중요한 포인트를 추가로 선택합니다. 이것은 스윙 고도와 하위점, 예를 들어 ph1, ph2 등을위한 여러 역사적 변수를 정의함으로써 달성됩니다.
마지막으로, 반전 거래는 가격이 회전점의 회전점을 통과 할 때 수행됩니다.
이 피워트 포인트 기반의 양적 전략은 다음과 같은 장점을 가지고 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
이 전략은 다음 영역에서 개선될 수 있습니다.
전체적으로 이 전략은 잘 수행된다. 핵심 아이디어는 중요한 피워트 포인트를 탐지하고 그들의 브레이크아웃을 거래하는 것이다. 추가적인 개선은 더 크고 안정적인 수익을 위한 더 견고하고 신뢰할 수 있는 신호를 생성할 수 있다.
/*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)