Chiến lược thương mại rùa dựa trên các kênh Donchian

Tác giả:ChaoZhang, Ngày: 2024-02-26 14:35:02
Tags:

img

Tổng quan

Chiến lược giao dịch rùa Tang Anqi là một phiên bản rất đơn giản của chiến lược giao dịch rùa ban đầu. Nó rất khác với chiến lược rùa ban đầu. Chiến lược sử dụng hai kênh Donchian, một kênh nhanh và một kênh chậm. Thời gian kênh được thiết lập bởi người dùng, với giá trị mặc định là 20 thanh cho kênh nhanh và 50 thanh cho kênh chậm. Chiến lược sử dụng các băng tải trên và dưới của kênh chậm để tham gia giao dịch và băng tải giữa của kênh nhanh để thiết lập dừng lỗ.

Chiến lược logic

Logic cốt lõi của chiến lược này là:

  1. Tính toán kênh Donchian nhanh: Dải trên là mức cao nhất trên các thanh nhanh trước, dải dưới là mức thấp nhất, và dải giữa là mức trung bình của các dải trên và dưới.

  2. Tính toán kênh Donchian chậm: Dải trên là mức cao nhất trên các thanh chậm trước, dải dưới là mức thấp nhất.

  3. Khi không có vị trí, tín hiệu dài được kích hoạt khi giá chạm vào dải trên của kênh chậm, và tín hiệu ngắn được kích hoạt khi giá chạm vào dải dưới của kênh chậm.

  4. Sau khi mở một vị trí, dải giữa của kênh nhanh được sử dụng như là mức dừng lỗ.

  5. Đóng vị trí khi có tín hiệu ngược lại tín hiệu mở trong thời gian giữ.

Phân tích lợi thế

Những lợi thế của chiến lược này là:

  1. Các kênh Donchian và stop loss di chuyển rất dễ hiểu, phù hợp cho người mới bắt đầu.

  2. Các tham số có thể tùy chỉnh. Người dùng có thể điều chỉnh các tham số dựa trên các sản phẩm giao dịch và khung thời gian để thích nghi với các môi trường thị trường khác nhau.

  3. Một số tín hiệu giao dịch mâu thuẫn. chỉ dựa vào sự phá vỡ giá của các dải kênh, tránh các tín hiệu sai từ các chỉ số phổ biến.

  4. Quản lý dừng lỗ tự động. Việc dừng lỗ di chuyển dựa trên băng tần trung tâm kênh nhanh có thể hạn chế lỗ trên các giao dịch đơn.

Phân tích rủi ro

Những rủi ro đối với chiến lược này bao gồm:

  1. Thêm stop loss khi xu hướng không rõ ràng. Điều này ảnh hưởng đến lợi nhuận của chiến lược.

  2. Khi xu hướng đảo ngược, lợi nhuận lơ lửng theo hướng xu hướng trước sẽ biến thành lỗ.

  3. Các thiết lập tham số không chính xác dẫn đến tính hung hăng quá mức hoặc quá bảo thủ. Các giá trị thích hợp cần phải được tìm thấy thông qua kiểm tra ngược lặp đi lặp lại.

  4. Sự phụ thuộc cao vào giao dịch tự động. Tính ổn định của máy chủ rất quan trọng để tránh các ngoại lệ dẫn đến thất bại trong giao dịch tự động.

Để giảm các rủi ro trên, các thông số có thể được tối ưu hóa, kích thước vị trí có thể được giới hạn thích hợp và các mô-đun quản lý rủi ro có thể được thêm vào.

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

Các chiến lược có thể được cải thiện trong các khía cạnh sau:

  1. Thêm bộ lọc cho các tín hiệu đầu vào để tránh bắt tín hiệu đảo ngược xu hướng. Ví dụ, sử dụng các chỉ số xu hướng để xác định hướng xu hướng.

  2. Tối ưu hóa các thông số như thời gian kênh và kích thước vị trí để phù hợp hơn với các công cụ giao dịch khác nhau.

  3. Thêm các mô-đun quản lý rủi ro như giới hạn rút tiền tối đa và giới hạn lỗ hàng ngày để ngăn ngừa tổn thất quá mức trong các sự kiện cực đoan.

  4. Cải thiện các chiến lược dừng lỗ. Ví dụ, áp dụng dừng lỗ để làm cho dừng thích nghi hơn với xu hướng thị trường.

Kết luận

Tóm lại, Chiến lược giao dịch rùa Tang Anqi là một hệ thống theo xu hướng đơn giản. Ưu điểm của nó nằm trong sự dễ hiểu và tự động hóa của nó. Nhưng nó cũng mang lại một số rủi ro nhất định, và cần tối ưu hóa thêm các tham số và quản lý rủi ro để thực tế hơn. Với các biện pháp như điều chỉnh tham số, thêm bộ lọc và các mô-đun kiểm soát rủi ro, chiến lược có thể đạt được kết quả tốt hơn trong giao dịch trực tiếp.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-15 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2020

//@version=4
strategy("Noro's SimpleTurtle Strategy", shorttitle = "SimpleTurtle str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
sizelong  = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot long, %")
sizeshort = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot short, %")
fast      = input(20, minval=1)
slow      = input(50, minval=1)
showof    = input(true, defval = true, title = "Show offset")
showll    = input(true, defval = true, title = "Show lines")
showdd    = input(false, defval = true, title = "Show label (drawdown)")
showbg    = input(true, defval = true, title = "Show background")
fromyear  = input(1900, defval = 1900, 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")

//Donchian price channel fast
hf = highest(high, fast)
lf = lowest(low, fast)
center = (hf + lf) / 2

//Donchian price chennal slow
hs = highest(high, slow)
ls = lowest(low, slow)

//Lines
colorpc = showll ? color.blue : na
colorsl = showll ? color.red : na
offset = showof ? 1 : 0
plot(hs, offset = offset, color = colorpc)
plot(ls, offset = offset, color = colorpc)
plot(center, offset = offset, color = colorsl)

//Background
size = strategy.position_size
colorbg = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(colorbg, transp = 70)

//Orders
truetime = true
lotlong = 0.0
lotshort = 0.0
lotlong := size != size[1] ? strategy.equity / close * sizelong / 100 : lotlong[1]
lotshort := size != size[1] ? strategy.equity / close * sizeshort / 100 : lotshort[1]

//Orders
strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and truetime)
strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and truetime)
strategy.exit("Long", stop = center, when = needlong and strategy.position_size > 0)
strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0)
if true
    strategy.close_all()
    strategy.cancel("fast L")
    strategy.cancel("fast S")
    strategy.cancel("slow L")
    strategy.cancel("slow S")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Label
    min := round(min * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Thêm nữa