
Chiến lược này dựa trên phương pháp giao dịch biển nổi tiếng, sử dụng chỉ số kênh Donchian để xác định giá phá vỡ và kết hợp với chỉ số ATR để thiết lập điểm dừng lỗ, để theo dõi xu hướng. Ưu điểm của chiến lược là khả năng kiểm soát lùi mạnh mẽ, có thể kiểm soát hiệu quả mức dừng đơn và giảm khả năng mất mát liên tục.
Chiến lược này chủ yếu dựa trên hai chỉ số: kênh Donchian và ATR.
Đường Donchian được tính từ giá cao nhất và giá thấp nhất. Chiến lược đặt đường dẫn mặc định là 20 ngày, vẽ đường dẫn với giá cao nhất và giá thấp nhất trong vòng 20 ngày. Khi giá vượt qua đường dẫn trên, tạo ra tín hiệu mua; Khi giá vượt qua đường dẫn dưới, tạo ra tín hiệu bán.
Chỉ số ATR được sử dụng để đo lường mức độ biến động của thị trường và thiết lập điểm dừng. Chu kỳ ATR mặc định được thiết lập là 20 ngày. Chiến lược sử dụng hai lần ATR làm điểm dừng.
Các giao dịch được thực hiện theo các logic sau:
Khi giá phá vỡ đường dẫn, hãy tham gia nhiều hơn.
Điểm dừng là điểm thấp khi nhập cảnh trừ ATR hai lần.
Khi giá phá vỡ đường dẫn dưới, vị trí đầu tiên được mở rộng.
Khi giá phá vỡ đường dẫn dưới, hãy tháo vào.
Điểm dừng là điểm cao khi nhập cảnh cộng với hai lần ATR.
Khi giá phá vỡ đường dẫn, vị trí đầu trống.
Tóm lại, chiến lược này dựa vào kênh Donchian để xác định hướng xu hướng và thời gian nhập, kiểm soát rủi ro bằng cách thiết lập dừng lỗ ATR và theo dõi xu hướng.
Chiến lược này có những lợi thế chính như sau:
Khả năng kiểm soát rút lui mạnh mẽ. Sử dụng chỉ số ATR để thiết lập dừng lỗ, có thể kiểm soát hiệu quả lỗ đơn.
Theo dõi xu hướng được thực hiện. Các kênh Donchian có thể đánh giá hiệu quả các đợt phá vỡ giá và chỉ ra sự chuyển đổi xu hướng.
Thích hợp cho các giống biến động cao. Chỉ số ATR xem xét sự biến động của thị trường, thiết lập dừng lỗ phù hợp hơn với các đặc điểm của các giống khác nhau.
Chiến lược này đơn giản, rõ ràng và dễ hiểu.
Có thể viết và tối ưu hóa các chiến lược bằng ngôn ngữ Python.
Chiến lược này cũng có một số rủi ro cần lưu ý:
Các tham số kênh cần được tối ưu hóa. Đối với các giống và thời gian khác nhau, các tham số kênh cần được điều chỉnh để phù hợp với đặc điểm thị trường.
Rủi ro dừng liên tục. Trong trường hợp bất thường, có thể kích hoạt nhiều dừng trong thời gian ngắn, gây ra tổn thất lớn.
Các tham số ATR cần được thử nghiệm. Các tham số ATR ảnh hưởng trực tiếp đến hiệu quả dừng lỗ và cần được điều chỉnh theo các giống và môi trường dao động khác nhau.
Tần suất giao dịch có thể quá cao. Trong thị trường biến động không có xu hướng rõ ràng, có thể tạo ra quá nhiều tín hiệu chéo.
Lợi nhuận có thể bị hạn chế. Chiến lược này chủ yếu là dừng lỗ và không thể nắm bắt được toàn bộ sự gia tăng của xu hướng.
Trong một số trường hợp bất thường, giá tăng cao có thể trực tiếp gây ra tổn thất.
Chiến lược này có thể được tối ưu hóa bằng cách:
Tối ưu hóa các tham số đường dẫn, kiểm tra tính phù hợp của các tham số khác nhau đối với các giống khác nhau.
Tăng các điều kiện lọc để tránh quá nhiều tín hiệu trong tình huống chấn động.
Tối ưu hóa tham số chu kỳ ATR, kiểm tra ảnh hưởng của các tham số khác nhau đối với hiệu quả dừng lỗ.
Thêm chiến lược nhập cảnh kim tự tháp, thêm vị trí trong xu hướng, mở rộng không gian lợi nhuận.
Kết hợp với các chỉ số khác để tăng hiệu quả lọc. Các chỉ số như MACD, KD để đánh giá xu hướng, tránh giao dịch ngược.
Tối ưu hóa điểm dừng lỗ dựa trên chi phí giao dịch như điểm trượt, phí xử lý.
Kiểm tra sự thích nghi của các giống khác nhau, điều chỉnh các tham số để phù hợp với một giống cụ thể.
Chiến lược này là phiên bản mở đầu của luật giao dịch biển, nói chung là ý tưởng chiến lược đơn giản và rõ ràng, có khả năng kiểm soát rút lui mạnh mẽ, có thể xác minh hiệu quả các nguyên tắc của luật giao dịch biển. Tuy nhiên, chiến lược này có tính thích ứng yếu đối với các loại giao dịch, cần tối ưu hóa tham số cụ thể theo các loại khác nhau để có thể thực hiện hiệu quả của chiến lược. Với các cải tiến như tối ưu hóa tham số, điều kiện lọc, chiến lược này có thể trở thành một trong những chiến lược theo dõi xu hướng cơ bản của giao dịch định lượng.
/*backtest
start: 2022-10-10 00:00:00
end: 2023-10-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//Based on Turtle traders strategy: buy/sell on Donchian breakouts and stop loss on ATR 2x
// initial version considerations :
//// 1. Does not consider filter for avoiding new entries after winning trades (filtering rule from Turtle Strategy on 20 day breakout strategy)
//// 2. Does not consider pyramiding (aditional entries after 1N price movements)
strategy("Turtle trading strategy (Donchian/ATR)", overlay=true)
enter_period = input(20, minval=1, title="Enter Channel")
exit_period = input(10, minval=1, title="Exit Channel")
offset_bar = input(0,minval=0, title ="Offset Bars")
direction = input("Long",options=["Long","Short"],title="Direction")
max_length = max(enter_period,exit_period)
atrmult = input(2,title="ATR multiplier (Stop Loss)")
atrperiod = input(20,title="ATR Period")
closed_pos = false
dir_long = direction == "Long"? true : false
atr = atr(atrperiod)
upper = dir_long ? highest(enter_period): highest(exit_period)
lower = dir_long ? lowest(exit_period): lowest(enter_period)
atrupper = close + atr
atrlower = close - atr
plotted_atr = dir_long ? atrlower : atrupper
//basis = avg(upper, lower)
l = plot(lower, style=line, linewidth=3, color=lime, offset=1)
u = plot(upper, style=line, linewidth=3, color=lime, offset=1)
a = plot(plotted_atr, style=line,linewidth=2,color=red,offset=1)
//plot(basis, color=yellow, style=line, linewidth=1, title="Mid-Line Average")
//break upper Donchian (with 1 candle offset) (buy signal)
break_up = (close >= upper[1])
//break lower Donchian (with 1 candle offset) (sell signal)
break_down = (close <= lower[1])
stop_loss = dir_long ? (close<=plotted_atr[1]) : (close>=plotted_atr[1])
if break_up and dir_long
strategy.entry("buy", strategy.long, 1)
closed_pos :=false
if (break_down or stop_loss) and dir_long
strategy.close("buy")
if break_down and not dir_long
strategy.entry("sell", strategy.short, 1)
closed_pos :=false
if (break_up or stop_loss) and not dir_long
strategy.close("sell")
closed_pos :=true
losing_trade = strategy.equity[0]<strategy.equity[1]
//plotshape(losing_trade,text="Losing!")
plotshape(stop_loss,style=dir_long?shape.labeldown:shape.labelup,text="Stop!")
//plot(strategy.equity)