Chiến lược định lượng dựa trên sự đảo ngược điểm trục


Ngày tạo: 2024-02-20 14:22:13 sửa đổi lần cuối: 2024-02-20 14:22:13
sao chép: 0 Số nhấp chuột: 654
1
tập trung vào
1617
Người theo dõi

Chiến lược định lượng dựa trên sự đảo ngược điểm trục

Tổng quan

Ý 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.

Nguyên tắc chiến lượ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.

Lợi thế chiến lượ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ế:

  1. Sử dụng các vùng hỗ trợ và kháng cự của thị trường, những vùng này thường là điểm cơ hội để giá đảo ngược
  2. Trong khi đó, tìm kiếm những điểm cao và thấp quan trọng, thực hiện giao dịch song phương đa không gian.
  3. Điểm trung tâm là điểm extremum nổi bật hơn, điểm đột phá như vậy có tín hiệu mạnh hơn
  4. Sử dụng các điểm trung tâm của trục để làm cho tín hiệu đáng tin cậy hơn

Rủi ro và giải pháp

Chiến lược này cũng có một số rủi ro:

  1. Xác định sai điểm trung tâm dẫn đến tín hiệu sai. Giải pháp là điều chỉnh tham số khoảng cách bên phải và bên phải để đảm bảo nhận diện điểm trung tâm chính xác hơn.
  2. Phá vỡ giả phá vỡ. Giải pháp là kết hợp các yếu tố khác để lọc tín hiệu, chẳng hạn như năng lượng, số lượng giao dịch, v.v.

Hướng tối ưu hóa

Chiến lược này cũng có thể được tối ưu hóa theo một số hướng:

  1. Thêm chiến lược dừng lỗ để làm cho chiến lược ổn định hơn
  2. Lưu trữ các thông tin liên quan
  3. Phát triển chiến lược PRED đảo ngược để tối ưu hóa hơn nữa dự báo điểm trung tâm bằng ML
  4. Thêm tùy chỉnh tham số

Tóm tắt

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.

Mã nguồn chiến lược
/*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)