
Chiến lược đảo ngược phá vỡ ba hoặc bốn đường K bằng cách xác định ba hoặc bốn đường K có động lực lớn hơn trên đường K, sau đó một vài đường K nhỏ hơn tạo ra hỗ trợ hoặc áp lực, và giao dịch ngược khi đường K đảo ngược xảy ra, thuộc chiến lược giao dịch ngược.
Lịch lý nhận dạng cốt lõi của chiến lược bao gồm:
Xác định đường K tăng mạnh ((Gap Bar): vượt 1,5 lần ATR trung bình, phần thực thể lớn hơn 0,65.
Xác định các dòng K thu thập các mức thu nhỏ (Collecting Bar): Các dòng K đi theo các biến động nhỏ từ 1 đến 2 phía sau Gap Bar, điểm cao hoặc thấp gần Gap Bar. Các dòng K này đại diện cho sự chậm lại và thu thập xu hướng, tạo thành hỗ trợ hoặc áp lực.
Nhận biết tín hiệu K đường: Sau khi tổng hợp K đường, nếu một thực thể phá vỡ các điểm cao hoặc thấp của một số đường K trước đó, nó có thể được coi là một tín hiệu đảo ngược, tùy thuộc vào hướng của thực thể, hãy làm nhiều hoặc trống, và mở một vị trí trên đường K.
Hạn chế và dừng: Hạn chế được đặt dưới hoặc trên điểm thấp của Gap K; Hạn chế dựa trên điểm dừng nhân với tỷ lệ lỗ hổng được cấu hình.
Chiến lược này có một số ưu điểm chính:
Sử dụng các đặc điểm của đường K để đánh giá xu hướng và điểm đảo ngược, không phụ thuộc vào bất kỳ chỉ số nào, thực hiện chỉ số tự đeo.
Gap Bar và Collecting Bar có các điều kiện lọc nghiêm ngặt, có thể xác định được các xu hướng thực sự và tổng hợp.
Đánh giá tín hiệu đảo ngược dựa trên thực thể, giảm khả năng tín hiệu giả.
Chỉ cần 3-4 kết hợp dây K để thực hiện một giao dịch, thời gian ngắn, tần suất cao.
Cài đặt dừng lỗ rõ ràng, rút và tỷ lệ lỗ dễ kiểm soát.
Chiến lược này cũng có một số rủi ro:
Tùy thuộc vào chất lượng của các thiết lập tham số, nếu các tham số được thiết lập quá lỏng lẻo, nó sẽ làm tăng cơ hội cho tín hiệu giả và giao dịch mất tiền.
Dễ bị nhiễu bởi các đột phá giả tần số cao, không thể lọc hiệu quả tất cả các tín hiệu giả.
Có nguy cơ bị mắc kẹt, dễ bị điều chỉnh nếu không có đủ sự đảo ngược, do đó không thể dừng lỗ.
Giới hạn dừng lỗ lớn hơn, cá nhân có thể gây ra tổn thất lớn.
Để giảm thiểu những rủi ro này, có thể tối ưu hóa các khía cạnh sau:
Các tham số được tối ưu hóa để nhận dạng Gap Bar và Collecting Bar chính xác hơn.
Thêm bộ lọc, mở lệnh sau khi xác nhận lại đường K ngược.
Tối ưu hóa các thuật toán dừng lỗ để dừng lỗ gần hơn với giá và giảm lỗ hơn.
Chiến lược này cũng có một số ưu điểm chính:
Thêm bộ lọc tổng hợp để tránh nhiễu đột phá giả. Ví dụ: tăng chỉ số khối lượng giao dịch, chỉ xem xét tín hiệu giao dịch khi khối lượng giao dịch lớn hơn.
Kết hợp với chỉ số đường trung bình, chỉ xem xét tín hiệu giao dịch khi giá phá vỡ đường trung bình quan trọng (ví dụ như đường 20 ngày, đường 60 ngày).
Xác minh nhiều khung thời gian, chỉ mở lệnh khi có nhiều chu kỳ đồng thời.
Tối ưu hóa điều kiện dừng lỗ, điều chỉnh tỷ lệ lợi nhuận và lỗ theo biến động của thị trường và sở thích rủi ro.
Kết hợp với hệ thống đánh giá thị trường trống, chỉ sử dụng chiến lược này trong môi trường thị trường xu hướng.
Những cải tiến này có thể làm tăng thêm sự ổn định và khả năng lợi nhuận của chiến lược.
Chiến lược đảo ngược phá vỡ đường 3-4K được giao dịch bằng cách xác định các đoạn tiềm năng xu hướng chất lượng cao và tín hiệu đảo ngược. Chu kỳ hoạt động ngắn, tần suất cao, có khả năng thu được lợi nhuận vượt trội. Ngoài ra, cũng có một số rủi ro, cần phải tiếp tục tối ưu hóa để giảm rủi ro và tăng sự ổn định. Nói chung, chiến lược này đã sử dụng hiệu quả các xu hướng phán đoán và điểm đảo ngược đặc trưng của đường nét thị trường và đáng để 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)