Chiến lược đảo ngược đột phá ba thanh và bốn thanh

Tác giả:ChaoZhang, Ngày: 2023-12-18 10:39:53
Tags:

img

Tổng quan

Chiến lược Three Bar và Four Bar Breakout Reversion xác định ba hoặc bốn thanh K-line có động lực mạnh, và thực hiện các giao dịch ngược xu hướng sau khi một số thanh K tầm nhỏ hình thành mức hỗ trợ / kháng cự và các tín hiệu đảo ngược xuất hiện.

Chiến lược logic

Logic xác định cốt lõi của chiến lược này bao gồm:

  1. Nhận ra các thanh tầm xa (Gap Bars): Break 1.5 x ATR, với tỷ lệ phần trăm cơ thể trên 65%. Chúng được coi là có động lực mạnh.

  2. Nhận diện thanh tầm thấp (Collecting Bars): Một hoặc hai thanh tầm nhỏ tiếp theo sau Gap Bars, với mức cao / thấp gần với Gap Bars. Chúng đại diện cho đà chậm lại và củng cố, hình thành các mức hỗ trợ / kháng cự.

  3. Nhận ra các thanh tín hiệu đảo ngược: Nếu một thanh vượt qua mức cao / thấp của các thanh trước sau khi củng cố, nó có thể được coi là tín hiệu đảo ngược.

  4. Stop loss và take profit: Đặt stop loss dưới / trên điểm thấp / cao Gap Bar. Take profit được xác định bằng cách nhân tỷ lệ rủi ro-lợi nhuận với khoảng cách stop loss.

Phân tích lợi thế

Những lợi thế chính của chiến lược này:

  1. Xác định xu hướng và đảo ngược bằng cách sử dụng hành động giá thô, không cần chỉ số.

  2. Các quy tắc nghiêm ngặt về Gap Bars và Collecting Bars đảm bảo độ chính xác trong việc nắm bắt xu hướng và hợp nhất thực tế.

  3. Phán xét các thanh đảo theo cơ thể làm giảm tín hiệu sai.

  4. Mỗi giao dịch chỉ mất 3-4 bar, tần số cao với thời gian giữ ngắn.

  5. Các quy tắc rõ ràng về dừng lỗ và lấy lợi nhuận giúp quản lý rủi ro dễ dàng hơn.

Phân tích rủi ro

Những rủi ro chính:

  1. Dựa trên các thiết lập tham số, các tham số lỏng lẻo làm tăng tín hiệu sai và thua lỗ giao dịch.

  2. Thể bị tổn thương bởi những vụ trốn thoát giả và không thể lọc ra tất cả các tín hiệu sai.

  3. Rủi ro bị mắc kẹt trong hợp nhất sau khi cố gắng thoát thất bại.

  4. Phạm vi dừng lỗ rộng có nghĩa là tổn thất lớn đôi khi khi bị mắc kẹt.

Để giảm rủi ro:

  1. Tối ưu hóa các tham số để xác định Gap Bar và Collecting Bar.

  2. Thêm các bộ lọc như thanh xác nhận trước khi nhập vị trí.

  3. Tối ưu hóa các thuật toán dừng lỗ để làm cho chúng thích nghi hơn.

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

Các hướng tối ưu hóa chính:

  1. Thêm các bộ lọc tổng hợp để tránh các sự đột phá sai, ví dụ như yêu cầu tăng khối lượng.

  2. Kết hợp với các đường trung bình động, chỉ nhận tín hiệu khi các mức MA chính bị phá vỡ.

  3. Yêu cầu thỏa thuận trên nhiều khung thời gian trước khi tham gia giao dịch.

  4. Điều chỉnh năng động các mục tiêu lợi nhuận dựa trên biến động thị trường và ưu tiên rủi ro.

  5. Kết hợp với hệ thống nhận dạng chế độ thị trường, chỉ cho phép chiến lược trong môi trường xu hướng.

Những tối ưu hóa này có thể cải thiện thêm sự ổn định và lợi nhuận.

Kết luận

Chiến lược Three Bar và Four Bar Breakout Reversion nhằm mục đích nắm bắt các chuyển động xu hướng và các giao dịch đảo ngược chất lượng cao. Nó có lợi thế của thời gian giữ ngắn và tần suất cao. Ngoài ra còn có những rủi ro vốn có cần phải được giảm thông qua tối ưu hóa liên tục. Bằng cách xác định hiệu quả các tín hiệu xu hướng và đảo ngược tự chứa từ hành động giá thô, chiến lược này đảm bảo nghiên cứu và áp dụng thêm.


/*backtest
start: 2023-12-10 00:00:00
end: 2023-12-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Three (3)-Bar and Four (4)-Bar Plays Strategy", shorttitle="Three (3)-Bar and Four (4)-Bar Plays Strategy", overlay=true, calc_on_every_tick=true, currency=currency.USD, default_qty_value=1.0,initial_capital=30000.00,default_qty_type=strategy.percent_of_equity)

frommonth = input(defval = 1, minval = 01, maxval = 12, title = "From Month")
fromday = input(defval = 1, minval = 01, maxval = 31, title = "From day")
fromyear = input(defval = 2021, minval = 1900, maxval = 2100, title = "From Year")

tomonth = input(defval = 12, minval = 01, maxval = 12, title = "To Month")
today = input(defval = 31, minval = 01, maxval = 31, title = "To day")
toyear = input(defval = 2100, minval = 1900, maxval = 2100, title = "To Year")

garBarSetting1 = input(defval = 1.5, minval = 0.0, maxval = 100.0, title = "Gap Bar Size", type = input.float)
garBarSetting2 = input(defval = 0.65, minval = 0.0, maxval = 100.0, title = "Gap Bar Body Size", type = input.float)
TopSetting = input(defval = 0.10, minval = 0.0, maxval = 100.0, title = "Bull Top Bar Size", type = input.float)

profitMultiplier = input(defval = 2.0, minval = 1.0, maxval = 100.0, title = "Profit Multiplier", type = input.float)

// ========== 3-Bar and 4-Bar Play Setup ==========
barSize = abs(high - low)
bodySize = abs(open - close)

gapBar = (barSize > (atr(1000) * garBarSetting1)) and (bodySize >= (barSize * garBarSetting2))  // find a wide ranging bar that is more than 2.5x the size of the average bar size and body is at least 65% of bar size

bullTop = close > close[1] + barSize[1] * TopSetting ? false : true  // check if top of bar is relatively equal to top of the gap bar (first collecting bull bar)
bullTop2 = close > close[2] + barSize[2] * TopSetting ? false : true  // check if top of bar is relatively equal to top of the gap bar (first collecting bear bar)
bearTop = close < close[1] - barSize[1] * TopSetting ? false : true  // check if top of bar is relatively equal to top of the gap bar (second collecting bull bar)
bearTop2 = close < close[2] - barSize[2] * TopSetting ? false : true  // check if top of bar is relatively equal to top of the gap bar (second collecting bear bar)

collectingBarBull = barSize < barSize[1] / 2 and low > close[1] - barSize[1] / 2 and bullTop  // find a collecting bull bar
collectingBarBear = barSize < barSize[1] / 2 and high < close[1] + barSize[1] / 2 and bearTop  // find a collecting bear bar
collectingBarBull2 = barSize < barSize[2] / 2 and low > close[2] - barSize[2] / 2 and bullTop2  // find a second collecting bull bar
collectingBarBear2 = barSize < barSize[2] / 2 and high < close[2] + barSize[2] / 2 and bearTop2  // find a second collecting bear bar

triggerThreeBarBull = close > close[1] and close > close[2] and high > high[1] and high > high[2]  // find a bull trigger bar in a 3 bar play
triggerThreeBarBear = close < close[1] and close < close[2] and high < high[1] and high < high[2]  // find a bear trigger bar in a 3 bar play
triggerFourBarBull = close > close[1] and close > close[2] and close > close[3] and high > high[1] and high > high[2] and high > high[3]  // find a bull trigger bar in a 4 bar play
triggerFourBarBear = close < close[1] and close < close[2] and close < close[3] and high < high[1] and high < high[2] and high < high[3]  // find a bear trigger bar in a 4 bar play

threeBarSetupBull = gapBar[2] and collectingBarBull[1] and triggerThreeBarBull  // find 3-bar Bull Setup
threeBarSetupBear = gapBar[2] and collectingBarBear[1] and triggerThreeBarBear  // find 3-bar Bear Setup
fourBarSetupBull = gapBar[3] and collectingBarBull[2] and 
   collectingBarBull2[1] and triggerFourBarBull  // find 4-bar Bull Setup
fourBarSetupBear = gapBar[3] and collectingBarBear[2] and 
   collectingBarBear2[1] and triggerFourBarBear  // find 4-bar Bear Setup

labels = input(title="Show Buy/Sell Labels?", type=input.bool, defval=true)

plotshape(threeBarSetupBull and labels, title="3-Bar Bull", text="3-Bar Play", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(threeBarSetupBear and labels, text="3-Bar Bear", title="3-Bar Play", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
plotshape(fourBarSetupBull and labels, title="4-Bar Bull", text="4-Bar Play", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
plotshape(fourBarSetupBear and labels, text="4-Bar Bear", title="4-Bar Play", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.red, textcolor=color.white, transp=0)

alertcondition(threeBarSetupBull or threeBarSetupBear or fourBarSetupBull or fourBarSetupBear, title="3-bar or 4-bar Play", message="Potential 3-bar or 4-bar Play")
float sl = na
float tp = na
sl := nz(sl[1], 0.0)
tp := nz(tp[1], 0.0)
plot(sl==0.0?na:sl,title='SL', color = color.red)
plot(tp==0.0?na:tp,title='TP', color = color.green)
if (true)
    if threeBarSetupBull and strategy.position_size <=0
        strategy.entry("3 Bar Long", strategy.long, when=threeBarSetupBull)
        sl :=low[1]
    if threeBarSetupBear and strategy.position_size >=0
        strategy.entry("3 Bar Short", strategy.short, when=threeBarSetupBull)
        sl :=high[1]
    if fourBarSetupBull and strategy.position_size <=0
        strategy.entry("4 Bar Long", strategy.long, when=fourBarSetupBull)
        sl :=min(low[1], low[2])
    if fourBarSetupBear and strategy.position_size >=0
        strategy.entry("4 Bar Short", strategy.short, when=fourBarSetupBear)
        sl :=max(high[1], high[2])

if sl !=0.0
    if strategy.position_size > 0
        tp := strategy.position_avg_price + ((strategy.position_avg_price - sl) * profitMultiplier)
        strategy.exit(id="Exit", limit=tp, stop=sl)

    if strategy.position_size < 0
        tp := strategy.position_avg_price - ((sl - strategy.position_avg_price) * profitMultiplier)
        strategy.exit(id="Exit", limit=tp, stop=sl)

Thêm nữa