Chiến lược giao dịch thoát khỏi kênh Donchian

Tác giả:ChaoZhang, Ngày: 2023-11-08 12:31:56
Tags:

img

Tổng quan

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 logic

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à:

  1. boundup = high > yh để xác định xem đường sắt trên có bị gãy không

  2. bounddn = low < yl để xác định xem đường sắt dưới có bị gãy hay không

  3. 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

  4. 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

  5. exitup = dnsign breakout của đường ray trên tạo ra tín hiệu thoát

  6. exitdn = upsign breakout của đường ray dưới tạo ra tín hiệu thoát

  7. nếu dấu hiệu trên của đường ray dưới tạo ra tín hiệu dài

  8. 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.

Ưu điểm của Chiến lược

  1. Sử dụng kênh Donchian để xác định xu hướng, kết quả backtest tốt

  2. Có cả tín hiệu dài và ngắn, cho phép giao dịch hai chiều

  3. Sử dụng SMA để lọc tín hiệu và tránh giao dịch xấu

  4. Các loại cổ phiếu được tính theo mục 060 của mục 060

  5. Đặt thời gian bắt đầu và kết thúc giao dịch để tránh rủi ro qua đêm

Rủi ro của chiến lược

  1. 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

  2. Có thể tạo ra tín hiệu sai trong thị trường giới hạn phạm vi

  3. 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

  4. Không xem xét kích thước vị trí, rủi ro của các vị trí quá lớn

  5. Không xem xét quản lý tiền, cần vốn giao dịch hợp lý

Ý tưởng cải tiến

  1. Tối ưu hóa lịch sử và tham số %Dev cho các sản phẩm khác nhau

  2. Thêm bộ lọc để tránh tín hiệu sai trong các thị trường khác nhau

  3. Thêm mô-đun định kích thước vị trí để điều khiển kích thước vị trí duy nhất

  4. Thêm mô-đun quản lý tiền để giới hạn tổng kích thước vị trí

  5. Thêm quản lý lệnh để thực hiện lệnh tối ưu

Kết luận

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)

Thêm nữa