Xu hướng kênh Donchian theo chiến lược

Tác giả:ChaoZhang, Ngày: 2024-01-22 12:30:05
Tags:

img

Tổng quan

Chiến lược theo xu hướng kênh Donchian là một chiến lược theo xu hướng dựa trên chỉ số kênh Donchian. Nó sử dụng các kênh Donchian có chiều dài khác nhau để xác định xu hướng giá và tạo ra các tín hiệu giao dịch khi giá vượt qua các kênh.

Ý tưởng chính của chiến lược này là sử dụng một kênh Donchian dài hạn để xác định hướng xu hướng chính và kênh Donchian ngắn hạn như tín hiệu cho bước vào và dừng lỗ. Nó nhằm mục đích nắm bắt xu hướng giá trung bình đến dài hạn mà không bị đánh lừa bởi biến động ngắn hạn trên thị trường.

Chiến lược logic

  1. Tính toán giá đóng cửa cao nhất và giá đóng cửa thấp nhất trong một khoảng thời gian dài (ví dụ: 50 ngày) để xây dựng kênh Donchian. Một sự đột phá trên dải trên cho thấy xu hướng tăng trong khi một sự đột phá dưới dải dưới cho thấy xu hướng giảm. Điều này xác định hướng xu hướng chính.

  2. Sử dụng giá đóng cửa cao nhất và giá đóng cửa thấp nhất trong một khoảng thời gian ngắn (ví dụ: 20 ngày) làm tiêu chí để vào và dừng lỗ.

  3. Khi giữ một vị trí dài, nếu giá giảm xuống dưới dải dưới ngắn hạn, dừng lại với lỗ. Khi giữ một vị trí ngắn, nếu giá vượt qua dải trên ngắn hạn, dừng lại với lỗ.

  4. Stop loss được thiết lập ở N lần ATR. Điều này tự động điều chỉnh dựa trên biến động thị trường, làm cho nó ít có khả năng để stop loss bị tấn công.

  5. Có một tùy chọn để đóng các vị trí trước khi phiên giao dịch kết thúc hoặc giữ các vị trí cho đến khi đạt được lệnh dừng lỗ.

Chiến lược này xem xét cả xác định xu hướng và dừng lỗ lợi nhuận. Nó có thể nắm bắt xu hướng giá trong khi kiểm soát rủi ro. Nó phù hợp với giao dịch trung và dài hạn.

Phân tích lợi thế

  1. Xác định hiệu quả xu hướng trung bình đến dài hạn mà không bị can thiệp bởi tiếng ồn thị trường ngắn hạn.

  2. Cơ chế dừng lỗ tự động giới hạn mỗi lỗ giao dịch.

  3. ATR dựa trên stop loss điều chỉnh khoảng cách dừng dựa trên biến động thị trường, làm giảm khả năng stop loss bị tấn công.

  4. Tự động đóng các vị trí khi giao dịch không thể quản lý rủi ro.

  5. Đơn giản và rõ ràng chiến lược logic dễ hiểu.

Phân tích rủi ro

  1. Trong các thị trường không có xu hướng, chiến lược có thể tạo ra nhiều giao dịch hơn, làm tăng chi phí giao dịch và cơ hội thua lỗ.

  2. Mặc dù có cơ chế dừng lỗ, các khoảng cách giá trong điều kiện biến động có thể xâm nhập vào điểm dừng lỗ trực tiếp gây ra tổn thất lớn.

  3. Tính toán ATR chỉ dựa trên dữ liệu lịch sử và không thể dự đoán chính xác các biến động và biến động giá trong tương lai.

  4. Các lệnh dừng lỗ có thể không phải lúc nào cũng được thực hiện trong giao dịch trực tiếp. Chúng có thể bị bỏ qua trong các điều kiện biến động cực kỳ gây mất mát.

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

  1. Điều chỉnh các thông số kênh Donchian để tối ưu hóa hiệu suất xác định xu hướng.

  2. Kết hợp các chỉ số khác như MACD, KDJ để xác nhận tín hiệu giao dịch và cải thiện sự ổn định chiến lược.

  3. Thêm stop loss để di chuyển điểm stop loss cùng với giá, hạn chế thêm lỗ.

  4. Kiểm tra tác động của các thời gian giữ khác nhau để tìm ra kết quả tổng thể tối ưu.

  5. Xem xét điều chỉnh kích thước vị trí năng động, mở rộng vị trí trong điều kiện xu hướng.

Tóm lại

Chiến lược theo xu hướng kênh Donchian tích hợp xác định xu hướng và kiểm soát rủi ro. Nó nhằm mục đích tạo ra lợi nhuận dư thừa bằng cách xác định xu hướng trong khi kiểm soát rủi ro đuôi với cơ chế dừng lỗ. Chiến lược này phù hợp với việc xác định và nắm bắt xu hướng giá trung và dài hạn. Với tối ưu hóa tham số và cải tiến cơ chế, nó có thể đạt được kết quả tích cực ổn định.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Donchian", overlay=true, calc_on_every_tick=true)

// =============================================================================
// VARIABLES
// =============================================================================

donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10')
permit_long  = input.bool(title = 'Permit long', defval = true)
permit_short  = input.bool(title = 'Permit short', defval = true)
risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25)
stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5)
atrLen = input.int(title="ATR Length", defval=20)
close_in_end  = input.bool(title = 'Close in end', defval = true)
permit_stop  = input.bool(title = 'Permit stop', defval = true)


// =============================================================================
// CALCULATIONS
// =============================================================================

donch_len_big = 
 donch_string == '50/20' ? 50 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 20 : 
 donch_string == '100/100' ? 100 : 
 na
donch_len_small = 
 donch_string == '50/20' ? 20 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 10 : 
 donch_string == '100/100' ? 100 : 
 na

big_maxclose = ta.highest(close, donch_len_big)
big_minclose = ta.lowest(close, donch_len_big)

small_maxclose = ta.highest(close, donch_len_small)
small_minclose = ta.lowest(close, donch_len_small)

atrValue = ta.atr(atrLen)[1]

tradeWindow  = true

// =============================================================================
// NOTOPEN QTY
// =============================================================================

risk_usd     = (risk_percent / 100) * strategy.equity
atr_currency = (atrValue * syminfo.pointvalue)
notopen_qty  = risk_usd / (stopOffset * atr_currency)

// =============================================================================
// LONG STOP
// =============================================================================

long_stop_price = 0.0
long_stop_price := 
 strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : 
 strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price:
 strategy.position_size > 0 ? long_stop_price[1] : 
 na

// =============================================================================
// SHORT STOP
// =============================================================================

short_stop_price = 0.0
short_stop_price := 
 strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : 
 strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price :
 strategy.position_size < 0 ? short_stop_price[1] : 
 na

// =============================================================================
// PLOT BG VERTICAL COLOR
// =============================================================================

cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
cross_dn =  strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
bg_color = cross_up ? color.green : cross_dn ? color.red : na
bg_color := color.new(bg_color, 70)
bgcolor(bg_color)

// =============================================================================
// PLOT HORIZONTAL LINES
// =============================================================================

s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na
s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na
s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : 
 strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na

plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black")
plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black")

plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow")
plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red")
plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia")

// =============================================================================
// ENTRY ORDERS
// =============================================================================

if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
    strategy.entry("Long", strategy.long, qty=notopen_qty)

if (strategy.position_size >= 0) and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
    strategy.entry("Short", strategy.short, qty=notopen_qty)

// =============================================================================
// EXIT ORDERS
// =============================================================================

if strategy.position_size > 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price)

if strategy.position_size < 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price)

// ==========

if strategy.position_size > 0 and close == small_minclose and not barstate.islast
    strategy.close(id="Long", comment='Donch')

if strategy.position_size < 0 and close == small_maxclose and not barstate.islast
    strategy.close(id="Short", comment='Donch')

// ==========

if close_in_end
    if not tradeWindow
        strategy.close_all(comment='In end')

// =============================================================================
// END
// =============================================================================

Thêm nữa