Chiến lược giao dịch đột phá kênh Donchian đánh giá xu hướng giá hiện tại bằng cách tính toán kênh giá cao nhất và thấp nhất trong một khoảng thời gian nhất định và giao dịch dài và ngắn dựa trên sự đột phá kênh.
Chiến lược này xây dựng một kênh bằng cách tính toán giá cao nhất pcmax và giá thấp nhất pcmin trong các giai đoạn lịch sử gần đây.
Đường sắt trên yh = pcmax - (pcmax - pcmin) * (100 - phần trămDev)/100
Đường sắt dưới yl = pcmin + (pcmax - pcmin) * phần trămDev/100
nơi %Dev mặc định là 13.
Một tín hiệu dài được tạo ra khi giá vượt qua đường ray trên. Một tín hiệu ngắn được tạo ra khi giá vượt qua đường ray dưới.
Lý thuyết cụ thể để tạo ra tín hiệu giao dịch là:
boundup = high > yh để xác định xem đường sắt trên có bị gãy không
bounddn = low < yl để xác định xem đường sắt dưới có bị gãy hay không
upsign = sma(bounddn, 2) == 1 sử dụng sma của bounddn để xác định sự phá vỡ liên tục của đường ray dưới
dnsign = sma(boundup, 2) == 1 sử dụng sma của boundup để xác định sự phá vỡ liên tục của đường ray trên
exitup = dnsign breakout của đường ray trên tạo ra tín hiệu thoát
exitdn = upsign breakout của đường ray dưới tạo ra tín hiệu thoát
nếu dấu hiệu trên của đường ray dưới tạo ra tín hiệu dài
nếu dnsign breakout của đường ray trên tạo ra tín hiệu ngắn
Chiến lược cũng thiết lập thời gian bắt đầu và kết thúc giao dịch để tránh các vị trí qua đêm không cần thiết.
Sử dụng kênh Donchian để xác định xu hướng, kết quả backtest tốt
Có cả tín hiệu dài và ngắn, cho phép giao dịch hai chiều
Sử dụng SMA để lọc tín hiệu và tránh giao dịch xấu
Các loại cổ phiếu được tính theo mục 060 của mục 060
Đặt thời gian bắt đầu và kết thúc giao dịch để tránh rủi ro qua đêm
Nhạy cảm với lịch sử và các tham số %Dev, cần tối ưu hóa cho các sản phẩm khác nhau
Có thể tạo ra tín hiệu sai trong thị trường giới hạn phạm vi
Không xem xét quản lý lệnh, có thể ảnh hưởng đến lợi nhuận trong giao dịch trực tiếp
Không xem xét kích thước vị trí, rủi ro của các vị trí quá lớn
Không xem xét quản lý tiền, cần vốn giao dịch hợp lý
Tối ưu hóa lịch sử và tham số %Dev cho các sản phẩm khác nhau
Thêm bộ lọc để tránh tín hiệu sai trong các thị trường khác nhau
Thêm mô-đun định kích thước vị trí để điều khiển kích thước vị trí duy nhất
Thêm mô-đun quản lý tiền để giới hạn tổng kích thước vị trí
Thêm quản lý lệnh để thực hiện lệnh tối ưu
Chiến lược đột phá kênh Donchian sử dụng đột phá kênh để xác định xu hướng và tín hiệu giao dịch, với kết quả backtest tốt và khả năng giao dịch cả dài và ngắn. Tuy nhiên, có những rủi ro liên quan đến tối ưu hóa tham số, bộ lọc, kích thước vị trí, quản lý tiền, quản lý lệnh v.v. Cần cải tiến đúng cách trong các lĩnh vực này trước khi giao dịch trực tiếp ổn định. Nhìn chung, đây là một chiến lược theo xu hướng truyền thống, và với các tối ưu hóa có thể trở thành một chiến lược giao dịch định lượng đáng tin cậy.
/*backtest start: 2023-10-31 00:00:00 end: 2023-11-07 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //////////////////////////////////////////////////////////// // Copyright by AlexInc v1.0 02/07/2018 @aav_1980 // PriceChannel strategy // If you find this script helpful, you can also help me by sending donation to // BTC 16d9vgFvCmXpLf8FiKY6zsy6pauaCyFnzS // LTC LQ5emyqNRjdRMqHPHEqREgryUJqmvYhffM //////////////////////////////////////////////////////////// //@version=3 strategy("AlexInc PriceChannel Str", overlay=false) history = input(20) percentDev = input(13) capital = input(100) needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usestoploss = input(true, defval = true, title = "Stop Loss") stoplossmult = input(3.8, defval = 3.8, minval = 1, maxval = 10, title = "Stop loss multiplicator") fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") bodymin = min( open, close) bodymax = max(open, close) pcmax = highest(bodymax, history) pcmin = lowest(bodymin, history) yh = ((pcmax - pcmin) / 100 * (100 - percentDev)) + pcmin yl = ((pcmax - pcmin) / 100 * percentDev) + pcmin plot(pcmax) plot(pcmin) plot(yh) plot(yl) //1 bounddn = low < yl ? 1 : 0 boundup = high > yh ? 1 : 0 upsign = sma(bounddn, 2) == 1 dnsign = sma(boundup, 2) == 1 //2 //upsign = crossover(bodymin, yl) //dnsign = crossunder(bodymax , yh) exitup = dnsign exitdn = upsign lot = strategy.equity / close * capital / 100 xATR = atr(history) nLoss = usestoploss ? stoplossmult * xATR : na stop_level_long = 0.0 stop_level_long := nz(stop_level_long[1]) stop_level_short = 0.0 stop_level_short := nz(stop_level_short[1]) pos = strategy.position_size if pos >0 and pos[1] <= 0 //crossover(pos, 0.5) stop_level_long = strategy.position_avg_price - nLoss if pos < 0 and pos[1] >= 0 //crossunder(pos, -0.5) stop_level_short = strategy.position_avg_price + nLoss if pos == 0 stop_level_long = bodymin - nLoss stop_level_short = bodymax + nLoss //plot(bodymax + nLoss, color=red) //plot(bodymin - nLoss, color=red) plot(stop_level_long, color=red) plot(stop_level_short, color=red) if upsign strategy.entry("Long", strategy.long, needlong == false ? 0 : lot) if dnsign strategy.entry("Short", strategy.short, needshort == false ? 0 : na) if true strategy.close_all() //if strategy.position_size != 0 // strategy.exit("Exit Long", from_entry = "Long", stop = stop_level_long) // strategy.exit("Exit Short", from_entry = "Short", stop = stop_level_short)