Chiến lược phá vỡ khu vực giá trị xuyên giai đoạn

Tác giả:ChaoZhang, Ngày: 2023-12-12 10:58:22
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là xác định phạm vi giá hiện tại bằng cách kết hợp các chỉ số RSI của các chu kỳ khác nhau và thực hiện các hành động mua hoặc bán tương ứng trong các chu kỳ nhỏ hơn khi có sự đột phá trong RSI chu kỳ lớn hơn.

Chiến lược logic

Các bước chính cho chiến lược này để xác định phạm vi giá và tìm cơ hội giao dịch là:

  1. Tính toán RSI Swing High và Swing Low dựa trên chu kỳ lớn hơn (ví dụ: hàng ngày).
  2. Xác định liệu chỉ số RSI chu kỳ lớn hơn có tạo ra mức cao hoặc thấp mới trong khoảng thời gian nhìn lại.
  3. Nếu có sự đột phá, đánh giá xu hướng giá (bullish hoặc bearish) trong chu kỳ nhỏ hơn (ví dụ 5 phút) và thực hiện các hành động mua hoặc bán tương ứng.

Ví dụ, khi chỉ số RSI hàng ngày phá vỡ mức cao trước đó, chúng tôi đánh giá rằng hiện tại nó là thị trường tăng. Và khi chỉ số RSI hàng ngày phá vỡ dưới mức thấp trước đó, chúng tôi đánh giá nó là thị trường gấu. Trong cả hai trường hợp, chúng tôi hành động dài và ngắn tương ứng trong biểu đồ 5 phút.

Phân tích lợi thế

So với các chiến lược truyền thống chỉ tập trung vào một giai đoạn, chiến lược này có những lợi thế sau:

  1. Đánh giá chính xác hơn về giá trị giá tương đối hiện tại Các chu kỳ lớn hơn như hàng ngày có thể lọc tiếng ồn thị trường ngắn hạn và xác định xu hướng và khu vực giá trị tổng thể.

  2. Kết hợp các chỉ số qua các giai đoạn cải thiện độ tin cậy tín hiệu. Chỉ dựa vào chỉ số thời gian duy nhất có thể tạo ra tín hiệu sai dễ dàng hơn, trong khi các tín hiệu đồng thời từ nhiều giai đoạn là đáng tin cậy hơn.

  3. Tận dụng các cơ hội ngắn hạn hiệu quả hơn. trong khi chúng ta chỉ cần tìm cơ hội trong các chu kỳ nhỏ như 5 phút để kiếm lợi nhuận.

  4. Tỷ lệ giảm nhỏ hơn. Kết hợp các giai đoạn chéo giúp tránh bị mắc kẹt. Chúng ta có thể thoát ra nhanh chóng khi các chỉ số chu kỳ lớn bắt đầu đảo ngược.

Phân tích rủi ro

Những rủi ro chính của chiến lược này nằm ở:

  1. Phản án sai trong các chỉ số chu kỳ lớn. Định nghĩa không hiệu quả của khu vực giá trị trong RSI hàng ngày, v.v. có thể dẫn đến tín hiệu sai. Điều chỉnh tham số của RSI là cần thiết để cải thiện độ chính xác.

  2. Sự khác biệt giữa chuyển động giá chu kỳ nhỏ và xác định chu kỳ lớn. Đôi khi chuyển động ngắn hạn chống lại xu hướng hình ảnh lớn. Chúng ta cần thiết lập stop loss thích hợp để kiểm soát lỗ.

  3. Quản lý rủi ro không phù hợp. Mất quá mức trong giao dịch duy nhất do kích thước vị trí kém có thể dẫn đến giảm không thể phục hồi.

Hướng dẫn tối ưu hóa

Vẫn còn nhiều chỗ để cải thiện chiến lược này, chủ yếu là về các khía cạnh sau:

  1. Kiểm tra thêm các kết hợp thời gian để tìm các tham số tối ưu.

  2. Điều chỉnh tham số RSI. Điều chỉnh các tham số RSI lookback vv để cải thiện độ chính xác phán đoán.

  3. Thêm thêm các chỉ số. Tạo thêm các chỉ số như MA để giúp đánh giá hướng xu hướng.

  4. Cải thiện cơ chế dừng lỗ. Điều chỉnh động các điểm dừng lỗ dựa trên điều kiện rút tiền.

  5. Tối ưu hóa quy tắc kích thước vị trí. Quản lý kích thước vị trí cụ thể cho mỗi giao dịch một cách khoa học hơn.

Kết luận

Chiến lược này nhận ra sự điều chỉnh giai đoạn chéo giữa các chiều dài thời gian khác nhau bằng cách đánh giá tình trạng tăng giá trong RSI giai đoạn chéo. Ý tưởng này của sự đánh giá giai đoạn chéo xứng đáng được khai thác hơn nữa. Chúng ta có thể tiếp tục cải thiện nó thông qua điều chỉnh tham số, tối ưu hóa dừng lỗ, kết hợp chỉ số để làm cho nó có lợi hơn. Nhìn chung, chiến lược này có một ý tưởng độc đáo và tiềm năng lớn để tăng cường.


/*backtest
start: 2022-12-05 00:00:00
end: 2023-12-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3

strategy("Swing MTF", shorttitle="Swing MTF", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5)
//
otf_period = input(defval=2, title="Look Back Period (2nd Timeframe)")
otf = input(defval="180", title="Second Momentum Timeframe")

// Function to dectect a new bar
is_newbar(res) =>
    t = time(res)
    change(t) != 0 ? true : false

// Check how many bars are in our upper timeframe
since_new_bar = barssince(is_newbar(otf))
otf_total_bars = na
otf_total_bars := since_new_bar == 0 ? since_new_bar[1] : otf_total_bars[1]

//Calculate RSI Values
ctf_rsi = rsi(open, otf_period)

breakline=input(title="Breaks in lines", defval = true, type=bool)

so = request.security(syminfo.tickerid, otf, rsi(open, otf_period))
sc = request.security(syminfo.tickerid, otf, rsi(close, otf_period))


final_otf_so = na
final_otf_so := barstate.isrealtime ? since_new_bar == otf_total_bars ? so : final_otf_so[1] : so

final_otf_sc = na
final_otf_sc := barstate.isrealtime ? since_new_bar == otf_total_bars ? sc : final_otf_sc[1] : sc

barsback = input(11, title='Bars back to check for a swing')
// showsig = input(false, title='Show Signal Markers')
 
swing_detection(index)=>
    swing_high = false
    swing_low = false
    start = (index*2) - 1 // -1 so we have an even number of
    swing_point_high = final_otf_so[index]
    swing_point_low = final_otf_sc[index]
    
    //Swing Highs
    for i = 0 to start
        swing_high := true
        if i < index 
            if final_otf_so[i] > swing_point_high 
                swing_high := false
                break
        // Have to do checks before pivot and after seperately because we can get
        // two highs of the same value in a row. Notice the > and >= difference
        if i > index
            if final_otf_so[i] >= swing_point_high 
                swing_high := false
                break
        
    //Swing lows
    for i = 0 to start
        swing_low := true
        if i < index
            if final_otf_sc[i] < swing_point_low 
                swing_low := false
                break  
        // Have to do checks before pivot and after seperately because we can get
        // two lows of the same value in a row. Notice the > and >= difference
        if i > index
            if final_otf_sc[i] <= swing_point_low 
                swing_low := false
                break 
        
    [swing_high, swing_low]
 
// Check for a swing
[swing_high, swing_low] = swing_detection(barsback)
 

long =  final_otf_so > final_otf_sc
short = final_otf_so < final_otf_sc

if swing_low and long
    strategy.entry("My Long Entry Id", strategy.long)


if swing_high and short
    strategy.entry("My Short Entry Id", strategy.short)

Thêm nữa