
이 전략의 핵심 아이디어는 중심축을 이용해서 거래하는 것이다. 중요한 중심축의 최고점과 낮은 곳을 찾아서, 가격이 이러한 핵심점을 돌파했을 때, 반전 거래를 한다.
이 전략은 먼저 축의 높고 낮은 점을 찾는 함수 pivotHighSig() 와 pivotLowSig() 를 정의한다. 이 두 함수는 좌측과 우측에서 합격한 축의 점을 찾는다.
구체적으로, 축의 높이에 대해, 그것은 왼쪽에서 연속적으로 더 높은 높이를 찾고, 오른쪽에서 연속적으로 더 낮은 높이를 찾습니다. 따라서 축의 높이는 상대적으로 더 높은 위치에 있습니다. 축의 낮은 점의 판단 조건은 반대로, 그것은 왼쪽과 왼쪽의 두쪽에 더 높은 낮은 점을 찾습니다.
축의 높낮이를 찾은 후, 전략은 축의 축점, 즉 축점의 중요한 점을 추가로 선택합니다. 이것은 축의 높낮이의 여러 역사 변수를 정의하여 구현됩니다.
마지막으로, 가격이 축의 축점을 돌파했을 때, 반전 거래가 진행됩니다.
이러한 축점 기반의 양적 전략은 다음과 같은 장점이 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.
이 전략은overall 잘 수행하고, 핵심 아이디어는 중요한 축점을 발견하고 그 돌파구에 반전 거래를하는 것입니다. 추가적으로 최적화하면,이 전략은 더 안정적이고 신뢰할 수있는 신호를 얻을 수 있습니다.
/*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)