
Ý tưởng cốt lõi của chiến lược này là sử dụng các điểm trung tâm để giao dịch số lượng. Nó tìm kiếm các điểm cao và thấp quan trọng, và khi giá vượt qua các điểm then chốt, nó sẽ thực hiện giao dịch đảo ngược.
Chiến lược này đầu tiên xác định các hàm tìm các điểm cao và thấp của trục trục pivotHighSig() và pivotLowSig() [2]. Hai hàm này sẽ tìm các điểm trục phù hợp ở bên trái và bên phải [2].
Cụ thể, đối với điểm cao của trục, nó sẽ tìm kiếm nhiều điểm cao liên tiếp ở bên trái và nhiều điểm thấp liên tiếp ở bên phải. Như vậy điểm cao của trục nằm ở một vị trí tương đối cao hơn. Điều kiện phán đoán của điểm thấp của trục ngược lại, nó sẽ tìm kiếm các điểm cao và thấp hơn ở cả hai bên trái và bên phải.
Sau khi tìm thấy điểm cao thấp của trục, chiến lược sẽ tiếp tục chọn điểm trung tâm của trục, tức là điểm quan trọng trong điểm trung tâm. Điều này được thực hiện bằng cách xác định một số biến lịch sử của điểm cao thấp của trục như ph1, ph2 v.v.
Cuối cùng, khi giá phá vỡ điểm trung tâm của trục, hãy thực hiện một giao dịch đảo ngược.
Chiến lược định lượng dựa trên các điểm trung tâm này có một số lợi thế:
Chiến lược này cũng có một số rủi ro:
Chiến lược này cũng có thể được tối ưu hóa theo một số hướng:
Chiến lược này nói chung hoạt động tốt, ý tưởng cốt lõi là tìm ra các điểm trung tâm quan trọng và thực hiện giao dịch đảo ngược khi nó bị phá vỡ. Bằng cách tối ưu hóa hơn nữa, chiến lược này có thể có được tín hiệu đáng tin cậy ổn định hơn, do đó có lợi nhuận tốt.
/*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)