Chiến lược theo dõi xu hướng kênh Donchian


Ngày tạo: 2024-01-22 12:30:05 sửa đổi lần cuối: 2024-01-22 12:30:05
sao chép: 0 Số nhấp chuột: 645
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi xu hướng kênh Donchian

Tổng quan

Chiến lược theo dõi xu hướng kênh Donchian là một chiến lược theo dõi xu hướng dựa trên các 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 tín hiệu giao dịch khi giá vượt qua kênh.

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

Nguyên tắc chiến lược

  1. Tính toán giá đóng cửa cao nhất và giá đóng cửa thấp nhất trong một chu kỳ dài (ví dụ như 50 ngày) để xây dựng kênh Donchian. Khi giá phá vỡ đường dẫn lên đường dẫn, nó sẽ tăng và khi nó phá vỡ đường dẫn xuống, nó sẽ giảm. Đây là cơ sở để đánh giá xu hướng lớn.

  2. Tính toán giá đóng cửa cao nhất và giá đóng cửa thấp nhất trong một chu kỳ ngắn (ví dụ: 20 ngày) như là tiêu chuẩn cho việc nhập và dừng lỗ. Khi giá phá vỡ kênh đường dài, nếu giá đóng cửa cũng phá vỡ kênh đường ngắn, thì nhập vào.

  3. Khi giữ nhiều vị trí đầu, nếu giá giảm xuống đường ngắn thì sẽ bị dừng. Khi giữ vị trí đầu trống, nếu giá phá vỡ đường ngắn thì sẽ bị dừng.

  4. Điểm dừng lỗ được thiết lập là N lần ATR. Điều này có thể được điều chỉnh tự động theo biến động của thị trường, có lợi cho việc giảm khả năng dừng lỗ được kích hoạt.

  5. Bạn có thể chọn tháo lỗ trước khi giao dịch kết thúc hoặc giữ cho đến khi dừng lỗ. Điều này có thể được kiểm soát bằng một tham số đầu vào.

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

Phân tích lợi thế

  1. Hiệu quả nhận diện xu hướng đường dài, tránh bị nhiễu bởi tiếng ồn thị trường ngắn hạn.

  2. Hệ thống tự động ngăn chặn thiệt hại có thể hạn chế tổn thất đơn lẻ.

  3. ATR Stop có thể điều chỉnh khoảng cách Stop theo biến động của thị trường, giảm khả năng Stop bị ảnh hưởng.

  4. Có thể chọn tự động thanh toán khi không thể giao dịch, quản lý rủi ro giao dịch.

  5. Lập luận của chiến lược đơn giản, rõ ràng và dễ hiểu.

Phân tích rủi ro

  1. Trong thị trường không có xu hướng rõ ràng, chiến lược sẽ tạo ra nhiều giao dịch hơn, làm tăng chi phí giao dịch và khả năng thực hiện thua lỗ.

  2. Mặc dù có cơ chế dừng lỗ, nhưng trong trường hợp bất thường, khoảng cách giá có thể giảm xuống ngay lập tức và gây thiệt hại lớn.

  3. ATR được tính toán chỉ dựa trên dữ liệu lịch sử và không thể dự đoán chính xác xu hướng và biến động trong tương lai, khoảng cách dừng thực tế có thể quá lớn hoặc quá nhỏ.

  4. Trong thực tế, lệnh dừng lỗ không thể đảm bảo 100% rằng nó sẽ được thực hiện. Trong trường hợp cực đoan, nó có thể bị bỏ qua và gây thiệt hại.

Hướng tối ưu hóa

  1. Điều chỉnh tham số kênh Donchian để tối ưu hóa hiệu quả nhận diện xu hướng.

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

  3. Tăng mức dừng di chuyển để điểm dừng di chuyển cùng với giá, tiếp tục hạn chế tổn thất.

  4. Kiểm tra ảnh hưởng của thời gian giữ vị trí khác nhau đối với hiệu quả tổng thể, xác định chu kỳ giữ vị trí tối ưu.

  5. Xem xét động điều chỉnh quy mô vị trí, tăng vị trí trong tình huống xu hướng.

Tóm tắt

Chiến lược theo dõi xu hướng đường hầm Donchian tích hợp phán đoán xu hướng với kiểm soát rủi ro, thu được lợi nhuận dư thừa thông qua nhận dạng xu hướng, đồng thời kiểm soát rủi ro đuôi của cơ chế dừng lỗ. Chiến lược này phù hợp để nhận ra và nắm bắt xu hướng giá đường dài và dài, có thể thu được lợi nhuận tích cực ổn định sau khi tối ưu hóa tham số và bổ sung cơ chế.

Mã nguồn chiến lược
/*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
// =============================================================================