Đây là một chiến lược đột phá dựa trên kênh giá, kết hợp với các chỉ số trung bình động và dừng lại / lấy lợi nhuận để vào và ra. Nó sử dụng trung bình động của giá cao / thấp để xây dựng kênh giá, và đi dài / ngắn khi giá vượt qua kênh, với lệnh dừng lỗ cố định hoặc lệnh dừng để kiểm soát rủi ro.
Chiến lược này tính toán các đường trung bình động của giá cao / thấp để tạo thành một kênh giá. Cụ thể, nó tính toán chiều dài 10 SMA của giá cao / thấp để vẽ dải trên và dưới của kênh. Khi giá vượt qua dải dưới vào dải trên, nó đi vào dài. Khi giá phá vỡ từ dải trên xuống dải dưới, nó đi vào ngắn.
Sau khi vào, chiến lược sử dụng hoặc dừng lỗ cố định hoặc dừng kéo theo để thoát ra. Việc dừng kéo theo bao gồm hai thông số: mức lợi nhuận cố định và chuyển đổi kích hoạt. Khi giá đạt mức chuyển đổi kích hoạt, mức lợi nhuận bắt đầu theo sau giá. Điều này cho phép khóa lợi nhuận trong khi giữ một khoảng trống.
Chiến lược cũng kết hợp bộ lọc phạm vi thời gian, chỉ chạy backtest trong khung thời gian lịch sử được chỉ định, để kiểm tra hiệu suất trên các giai đoạn thị trường khác nhau.
Chiến lược này khai thác kênh giá và xu hướng theo sau với trailing stop, cho phép nó nắm bắt các hướng xu hướng trung hạn đến dài hạn. So với các chiến lược trung bình động đơn giản, nó tránh các giao dịch không hiệu quả do biến động giá.
Nhìn chung, chiến lược có logic rõ ràng, chỉ số và tham số tối thiểu, dễ dàng kiểm tra lại, phù hợp với giao dịch xu hướng trung và dài hạn và có thể kiếm lợi từ xu hướng mạnh.
Chiến lược có xu hướng bị dừng dễ dàng trong các thị trường biến động, không thể duy trì lợi nhuận.
Việc điều chỉnh tham số là khá chủ quan, đòi hỏi phải điều chỉnh trên các giai đoạn thị trường khác nhau.
Các chỉ số khác như khối lượng, Bollinger Bands có thể được kết hợp để lọc tín hiệu nhập cảnh, tránh bẫy.
Các quy tắc thoát có thể được nâng cấp thành Trailing Stop hoặc Chandelier Exit. Các mục tiêu lợi nhuận một phần có thể được xem xét khi giá quay trở lại kênh. Tối ưu hóa các bộ lọc vào và các quy tắc ra có thể cải thiện đáng kể sự ổn định của chiến lược.
Tóm lại, đây là một chiến lược định lượng dựa trên kênh giá, theo xu hướng, quản lý dừng lỗ / lợi nhuận. Nó có luồng logic rõ ràng, cấu trúc tham số đơn giản, dễ hiểu và kiểm tra lại. Nó phù hợp để học các khái niệm giao dịch thuật toán. Chiến lược có thể được nâng cao theo nhiều khía cạnh để cải thiện sự ổn định và lợi nhuận. Ý tưởng cốt lõi là nắm bắt hướng xu hướng và quản lý rủi ro thông qua dừng lỗ và lấy lợi nhuận. Nó có thể được áp dụng cho các sản phẩm khác nhau trong các khung thời gian khác nhau.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-21 23:59:59 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true ) // Generalized SSL: // This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. // It is based on moving averages of the highs and lows. // Similar channel indicators can be found, whereas // this one implements the persistency inside the channel, which is rather tricky. // The green line is the base line which decides entries and exits, possibly with trailing stops. // With respect to the original version, here one can play with different moving averages. // The default settings are (10,SMA) // // Vitelot/Yanez/Vts March 2019 lb = input(10, title="Lb", minval=1) maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"]) fixedSL = input(title="SL Activation", defval=300) trailSL = input(title="SL Trigger", defval=1) fixedTP = input(title="TP Activation", defval=150) trailTP = input(title="TP Trigger", defval=1) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2017) ToMonth = input(defval = 6, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 19, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2020, title = "To Year", minval = 2017) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window startTimeOk() => true // create function "within window of time" if statement true // QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain // QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap hma(sig, n) => // Hull moving average definition wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n))) mcg(sig,length) => // Mc Ginley MA definition mg = 0.0 mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4)) tenkan(sig,len) => 0.5*(highest(sig,len)+lowest(sig,len)) ma(t,sig,len) => sss=na if t =="SMA" sss := sma(sig,len) if t == "EMA" sss := ema(sig,len) if t == "HMA" sss := hma(sig,len) if t == "McG" // Mc Ginley sss := mcg(sig,len) if t == "Tenkan" sss := tenkan(sig,len) if t == "WMA" sss := wma(sig,len) sss base(mah, mal) => bbb = na inChannel = close<mah and close>mal belowChannel = close<mah and close<mal bbb := inChannel? bbb[1]: belowChannel? -1: 1 uuu = bbb==1? mal: mah ddd = bbb==1? mah: mal [uuu, ddd] maH = ma(maType, high, lb) maL = ma(maType, low, lb) [up, dn] = base(maH,maL) plot(up, title="High MA", color=lime, linewidth=3) plot(dn, title="Low MA", color=orange, linewidth=3) long = crossover(dn,up) short = crossover(up,dn) // === STRATEGY - LONG POSITION EXECUTION === strategy.entry("Long", strategy.long, when= long and startTimeOk()) strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) strategy.exit("Exit", when= short) // === STRATEGY - SHORT POSITION EXECUTION === strategy.entry("Short", strategy.short, when= short and startTimeOk()) strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) strategy.exit("Exit", when= long)