Chiến lược dừng mất mát theo dõi ATR động

Tác giả:ChaoZhang, Ngày: 2023-12-11 14:24:18
Tags:

img

Tổng quan

Chiến lược này dựa trên cơ chế dừng lỗ kéo dài động được thiết kế với chỉ số ATR để điều chỉnh dừng lỗ trong thời gian thực trong khi đảm bảo dừng lỗ hiệu quả để tối đa hóa lợi nhuận.

Chiến lược logic

Chiến lược này sử dụng thời gian ATR nhanh 5 và thời gian ATR chậm 10 để xây dựng một stop loss theo dõi động hai lớp. Khi giá chạy theo hướng thuận lợi, lớp nhanh sẽ kích hoạt stop trailing đầu tiên để thắt chặt stop loss; khi có một pullback ngắn hạn, stop loss lớp chậm có thể tránh stop out sớm. Trong khi đó, sự chéo giữa các lớp nhanh và chậm phục vụ như một tín hiệu giao dịch.

Cụ thể, khoảng cách dừng lỗ của lớp nhanh là 0,5 lần ATR 5 giai đoạn, và khoảng cách dừng lỗ của lớp chậm là 3 lần ATR 10 giai đoạn. Một tín hiệu mua được tạo ra khi lớp nhanh vượt qua lớp chậm, và một tín hiệu bán được tạo ra khi lớp nhanh vượt qua lớp chậm. Đường dừng lỗ cũng được cập nhật trong thời gian thực và được vẽ dưới đường cong giá.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó có thể điều chỉnh động vị trí dừng lỗ để tối đa hóa lợi nhuận trong khi đảm bảo dừng lỗ hiệu quả. So với khoảng cách dừng lỗ cố định, đường dừng lỗ ATR động có thể thực hiện điều chỉnh dựa trên biến động của thị trường để giảm xác suất dừng lỗ được kích hoạt.

Ngoài ra, thiết kế ATR hai lớp cân bằng độ nhạy của stop loss. Lớp nhanh phản ứng nhanh và lớp chậm có thể lọc ra tiếng ồn ngắn hạn để tránh stop loss sớm.

Phân tích rủi ro

Rủi ro chính của chiến lược này nằm ở việc thiết lập khoảng cách dừng lỗ có hợp lý hay không. Nếu nhân ATR được đặt quá cao, phạm vi dừng lỗ sẽ không theo kịp với biến động giá. Nếu nhân ATR quá nhỏ, nó có xu hướng bị dừng bởi tiếng ồn ngắn hạn. Do đó, các tham số cần phải được điều chỉnh theo đặc điểm của các giống khác nhau.

Ngoài ra, trong một thị trường giới hạn phạm vi, giá trị ATR nhỏ hơn và đường dừng lỗ gần hơn, điều này có thể dễ dàng dẫn đến dừng lỗ thường xuyên.

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

Các kết hợp khác nhau của các tham số chu kỳ ATR có thể được thử để tìm ra sự cân bằng tối ưu. Nó cũng có thể xem xét kết hợp với các chỉ số khác, chẳng hạn như các chỉ số xu hướng để đánh giá giai đoạn thị trường, để điều chỉnh động kích thước của nhân ATR.

Cũng có thể nghiên cứu các lựa chọn thay thế cho chỉ số ATR, thay thế ATR bằng DKVOL, HRANGE hoặc ATR Percentage, vv có thể đạt được hiệu ứng dừng lỗ tốt hơn.

Tóm lại

Chiến lược này thiết kế một cơ chế theo dõi năng động hai lớp dựa trên chỉ số ATR để tối đa hóa lợi nhuận trong khi tránh mất lỗ dừng quá mức. Nó phù hợp với người dùng có yêu cầu cao hơn đối với lỗ dừng. Chiến lược này có thể điều chỉnh các tham số linh hoạt theo đặc điểm thị trường và đa dạng để đạt được hiệu ứng dừng lỗ tối ưu.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("ATR Trailing Stop Strategy by ceyhun", overlay=true)

/////////notes////////////////////////////////////////
// This is based on the ATR trailing stop indicator //
// width addition of two levels of stops and        //
// different interpretation.                        //
// This is a fast-reacting system and is better     //
// suited for higher volatility markets             //
//////////////////////////////////////////////////////

SC = input(close, "Source", input.source)

// Fast Trail //
AP1 = input(5, "Fast ATR period", input.integer)  // ATR Period
AF1 = input(0.5, "Fast ATR multiplier", input.float)  // ATR Factor
SL1 = AF1 * atr(AP1)  // Stop Loss
Trail1 = 0.0
Trail1 := iff(SC > nz(Trail1[1], 0) and SC[1] > nz(Trail1[1], 0), max(nz(Trail1[1], 0), SC - SL1), iff(SC < nz(Trail1[1], 0) and SC[1] < nz(Trail1[1], 0), min(nz(Trail1[1], 0), SC + SL1), iff(SC > nz(Trail1[1], 0), SC - SL1, SC + SL1)))

// Slow Trail //
AP2 = input(10, "Slow ATR period", input.integer)  // ATR Period
AF2 = input(3, "Slow ATR multiplier", input.float)  // ATR Factor
SL2 = AF2 * atr(AP2)  // Stop Loss
Trail2 = 0.0
Trail2 := iff(SC > nz(Trail2[1], 0) and SC[1] > nz(Trail2[1], 0), max(nz(Trail2[1], 0), SC - SL2), iff(SC < nz(Trail2[1], 0) and SC[1] < nz(Trail2[1], 0), min(nz(Trail2[1], 0), SC + SL2), iff(SC > nz(Trail2[1], 0), SC - SL2, SC + SL2)))

// Bar color for trade signal //
Green = Trail1 > Trail2 and close > Trail2 and low > Trail2
Blue = Trail1 > Trail2 and close > Trail2 and low < Trail2
Red = Trail2 > Trail1 and close < Trail2 and high < Trail2
Yellow = Trail2 > Trail1 and close < Trail2 and high > Trail2

// Signals //
Bull = barssince(Green) < barssince(Red)

Buy = crossover(Trail1, Trail2)
Sell = crossunder(Trail1, Trail2)

TS1 = plot(Trail1, "Fast Trail", style=plot.style_line, color=Trail1 > Trail2 ? color.blue : color.yellow, linewidth=2, display=display.none)
TS2 = plot(Trail2, "Slow Trail", style=plot.style_line, color=Trail1 > Trail2 ? color.green : color.red, linewidth=2)
fill(TS1, TS2, Bull ? color.new(color.green, 90) : color.new(color.red, 90))

plotcolor = input(true, "Paint color on chart", input.bool)

bcl = iff(plotcolor == 1, Blue ? color.blue : Green ? color.lime : Yellow ? color.yellow : Red ? color.red : color.white, na)
barcolor(bcl)

if Buy
    strategy.entry("Buy", strategy.long, comment="Buy")

if Sell
    strategy.close("Buy")


Thêm nữa