Chiến lược giao dịch breakout ngắn hạn đảo ngược

Tác giả:ChaoZhang, Ngày: 2023-11-21 17:03:32
Tags:

img

Tổng quan

Chiến lược này nhằm mục đích nắm bắt các cơ hội giao dịch đảo ngược ngắn hạn. Nó sẽ mở vị trí ngắn sau N thanh tăng liên tiếp và đóng vị trí sau M thanh giảm liên tiếp. Nó cũng kết hợp bộ lọc khung thời gian và các tính năng dừng lỗ / lấy lợi nhuận.

Lý luận

  1. Các thông số đầu vào: Số thanh lên liên tiếp N, thanh xuống liên tiếp M
  2. Định nghĩa:
    • ups đếm số lượng up-bars, price>price[1] sau đó +1, nếu không được đặt lại thành 0
    • dns đếm số lượng các thanh xuống, giá
  3. Nhập: ngắn khi ups≥N; vị trí gần khi dns≥M
  4. Exit: fixed stop loss/take profit hoặc kết thúc khung thời gian

Ưu điểm

  1. Khám phá cơ hội giao dịch đảo ngược, phù hợp với giao dịch ngắn hạn
  2. Thiết lập khung thời gian linh hoạt phục vụ cho các kế hoạch giao dịch khác nhau
  3. Đặt lệnh dừng lỗ/lấy lợi nhuận để tạo điều kiện quản lý rủi ro

Rủi ro

  1. Việc đảo ngược ngắn hạn có thể thất bại và đảo ngược lại dẫn đến mất mát
  2. Các thông số N, M hợp lý cần thiết, quá lớn hoặc quá nhỏ không thuận lợi
  3. Thời gian dừng không chính xác có thể không thể ngăn chặn mất mát trong thời gian

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

  1. Kết hợp với chỉ số xu hướng để tránh giao dịch theo xu hướng
  2. Điều chỉnh động các thông số N, M
  3. Tối ưu hóa cơ chế dừng lỗ

Kết luận

Chiến lược này nắm bắt các cơ hội giao dịch ngắn hạn thông qua các mô hình đường K thống kê. Điều chỉnh tham số hợp lý và các biện pháp kiểm soát rủi ro rất quan trọng cho lợi nhuận ổn định.


/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-20 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Strategy
strategy("Up/Down Short Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.short)

consecutiveBarsUp = input(1, title='Consecutive Bars Up')
consecutiveBarsDown = input(1, title='Consecutive Bars Down')

price = close

ups = 0.0
ups := price > price[1] ? nz(ups[1]) + 1 : 0

dns = 0.0
dns := price < price[1] ? nz(dns[1]) + 1 : 0

// Strategy Backtesting
startDate  = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date')
finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date')

time_cond  = true

//Time Restriction Settings
startendtime = input("", title='Time Frame To Enter Trades')
enableclose = input(false, title='Enable Close Trade At End Of Time Frame')
timetobuy = (time(timeframe.period, startendtime))
timetoclose = na(time(timeframe.period, startendtime))

// Stop Loss & Take Profit Tick Based
enablesltp = input(false, title='Enable Take Profit & Stop Loss')
stopTick = input(5.0, title='Stop Loss Ticks', type=input.float) / 100
takeTick = input(10.0, title='Take Profit Ticks', type=input.float) / 100

longStop = strategy.position_avg_price - stopTick
shortStop = strategy.position_avg_price + stopTick
shortTake = strategy.position_avg_price - takeTick
longTake = strategy.position_avg_price + takeTick

plot(strategy.position_size > 0 and enablesltp ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 and enablesltp ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL")
plot(strategy.position_size > 0 and enablesltp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit")
plot(strategy.position_size < 0 and enablesltp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit")

// Alert messages
message_enterlong  = input("", title="Long Entry message")
message_entershort = input("", title="Short Entry message")
message_closelong = input("", title="Close Long message")
message_closeshort = input("", title="Close Short message")
message_takeprofit = input("", title="Take Profit message")
message_stoploss = input("", title="Stop Loss message")

// Strategy Execution
if (ups >= consecutiveBarsUp) and time_cond and timetobuy
    strategy.entry("Long", strategy.long, stop = high + syminfo.mintick, alert_message = message_enterlong)
    
if (dns >= consecutiveBarsDown) and time_cond and timetobuy
    strategy.entry("Short", strategy.short, stop = low + syminfo.mintick, alert_message = message_entershort)
    
if strategy.position_size > 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closelong)
if strategy.position_size < 0 and timetoclose and enableclose
    strategy.close_all(alert_message = message_closeshort)
    
if strategy.position_size > 0 and enablesltp and time_cond
    strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_takeprofit)
if strategy.position_size < 0 and enablesltp and time_cond
    strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_stoploss)






Thêm nữa