
Gagasan inti dari strategi ini adalah untuk melakukan perdagangan kuantitatif menggunakan titik pivot. Ini mencari titik pivot tinggi dan rendah yang penting, dan melakukan perdagangan reversal ketika harga menembus titik-titik kunci ini.
Strategi ini pertama-tama mendefinisikan fungsi pivotHighSig() dan pivotLowSig() untuk menemukan titik tinggi dan titik rendah pada sumbu. Kedua fungsi ini akan mencari titik sumbu yang memenuhi syarat di sisi kiri dan kanan.
Secara khusus, untuk titik tinggi pada sumbu, ia akan mencari beberapa titik tinggi yang lebih tinggi secara berturut-turut di sisi kiri dan beberapa titik tinggi yang lebih rendah secara berturut-turut di sisi kanan. Dengan demikian, titik tinggi pada sumbu berada pada posisi yang relatif lebih tinggi.
Setelah menemukan titik tinggi dan rendah pada sumbu, strategi akan memilih titik penting pada sumbu tersebut. Hal ini dilakukan dengan mendefinisikan beberapa variabel historis dari titik tinggi dan rendah pada sumbu, seperti ph1, ph2 dan sebagainya.
Akhirnya, saat harga menembus titik pivot dari sumbu, maka dilakukan reversal trading.
Strategi kuantitatif berbasis pivot ini memiliki beberapa keuntungan:
Strategi ini juga memiliki beberapa risiko:
Strategi ini juga dapat dioptimalkan dari beberapa arah:
Strategi ini overall berkinerja baik, dengan ide inti adalah untuk menemukan pivot point yang penting dan melakukan reverse trade pada saat terobosan. Dengan pengoptimalan lebih lanjut, strategi ini dapat memperoleh sinyal yang lebih stabil dan dapat diandalkan, sehingga mendapatkan keuntungan yang baik.
/*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)