Ý tưởng cốt lõi của chiến lược này là sử dụng các điểm pivot cho giao dịch định lượng. Nó tìm kiếm các mức cao và thấp quan trọng và thực hiện các giao dịch đảo ngược khi giá vượt qua các mức chính này.
Chiến lược đầu tiên xác định các hàm pivotHighSig (()) và pivotLowSig (()) để xác định vị trí điểm cao và thấp.
Cụ thể, đối với swing high, nó tìm kiếm nhiều mức cao hơn ở bên trái và nhiều mức thấp hơn ở bên phải. Do đó, pivot high nằm ở một mức tương đối cao hơn. Các tiêu chí cho swing lows là ngược lại - nó tìm kiếm mức thấp hơn và thấp hơn ở cả hai bên.
Sau khi xác định vị trí đỉnh và đáy dao động, chiến lược tiếp tục chọn các điểm pivot từ các điểm pivot đó, tức là các điểm quan trọng từ các pivot. Điều này đạt được bằng cách xác định nhiều biến lịch sử cho các đỉnh và đáy dao động, ví dụ: ph1, ph2 vv.
Cuối cùng, các giao dịch đảo ngược được thực hiện khi giá vượt qua các điểm pivot của các pivot.
Chiến lược định lượng dựa trên điểm pivot này có những lợi thế sau:
Ngoài ra còn có một số rủi ro với chiến lược này:
Chiến lược này có thể được cải thiện trong các lĩnh vực sau:
Nhìn chung, chiến lược này hoạt động tốt. Ý tưởng cốt lõi là phát hiện các điểm trục quan trọng và giao dịch các bước đột phá của chúng. Các cải tiến hơn nữa có thể tạo ra các tín hiệu vững chắc và đáng tin cậy hơn cho lợi nhuận cao hơn và nhất quán hơn.
/*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)