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: 2023-12-25 10:57:52
Tags:

img

Tổng quan

Tên của chiến lược này là Turtle Trading Strategy Based on Donchian Channels. Nó mượn ý tưởng chính từ Turtle Trading Rules nổi tiếng và sử dụng Donchian Channels để xác định xu hướng thị trường, kết hợp với đường trung bình động để lọc, thực hiện một chiến lược theo xu hướng tương đối đơn giản.

Nguyên tắc chiến lược

Chỉ số chính để đánh giá chiến lược này là kênh Donchian. Kênh Donchian bao gồm phạm vi biến động của giá cao nhất và thấp nhất trong khoảng thời gian N ngày. Nếu giá vượt qua đường ray trên của kênh, đó sẽ là một tín hiệu dài; nếu nó vượt qua đường ray dưới của kênh, đó sẽ là một tín hiệu ngắn. Chiến lược này sử dụng kênh Donchian nhanh (10 ngày) để phát ra tín hiệu và kênh Donchian chậm (20 ngày) để dừng lỗ.

Ngoài ra, chiến lược này cũng giới thiệu hai đường trung bình động (50 ngày và 125 ngày) để lọc tín hiệu. Chỉ khi đường trung bình động nhanh vượt qua đường trung bình động chậm, các vị trí dài sẽ được giao dịch; Chỉ khi đường trung bình động nhanh vượt qua đường trung bình động chậm, các vị trí ngắn sẽ được giao dịch. Điều này có thể lọc hiệu quả một số tín hiệu sai.

Các điều kiện mở của chiến lược này là: giá vượt qua đường ray trên của kênh Donchian, và đường trung bình chuyển động nhanh vượt qua đường trung bình chuyển động chậm. Khi cả hai điều kiện được đáp ứng, các vị trí dài sẽ được mở; Giá vượt qua đường ray dưới của kênh Donchian, và đường trung bình chuyển động nhanh vượt qua đường trung bình chuyển động chậm, sau đó mở các vị trí ngắn. Các điều kiện đóng là khi giá chạm vào ranh giới kênh Donchian chậm đối diện.

Phân tích lợi thế

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

  1. Sử dụng kênh Donchian để xác định hướng xu hướng, hiệu ứng backtest tốt hơn để nắm bắt thành công xu hướng lớn;

  2. Thêm bộ lọc trung bình động có thể lọc ra một số tín hiệu sai và tránh mất mát;

  3. Sự kết hợp giữa các kênh Donchain nhanh và chậm và đường trung bình động có thể cân bằng tần suất giao dịch và độ chính xác dừng lỗ;

  4. Rủi ro được kiểm soát tốt với cơ chế dừng lỗ để kiểm soát lỗ đơn.

Phân tích rủi ro

Một số rủi ro của chiến lược này:

  1. Trong thị trường sốc, có thể có nhiều lệnh thua lỗ nhỏ hơn;

  2. Khi sự đảo ngược xu hướng xảy ra, việc lọc các đường trung bình động sẽ làm tăng chi phí mở cửa;

  3. Trong các thị trường dốc, dừng lỗ có thể được theo đuổi.

Các biện pháp đối phó và giải pháp:

  1. Điều chỉnh các thông số thích hợp, rút ngắn chu kỳ Donchian, giảm chu kỳ trung bình động để thích nghi với các thị trường khác nhau.

  2. Tăng phán đoán về xu hướng chính để tránh xây dựng các vị trí chống lại xu hướng chính.

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

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tăng sức mạnh của đột phá. ví dụ, giới thiệu khối lượng, chỉ mở các vị trí khi khối lượng tăng;

  2. Tăng sự phán đoán của các khu vực nóng. kết hợp với hỗ trợ, áp lực, dải, mô hình vv để tránh các khu vực nóng khi mở các vị trí;

  3. Tối ưu hóa các chiến lược dừng lỗ. giới thiệu theo dõi dừng lỗ, dừng lỗ biến động, dừng lỗ thời gian vv để làm cho dừng lỗ thông minh hơn.

Tóm lại

Nói chung, chiến lược này là một chiến lược theo xu hướng rất điển hình và đơn giản. Nó nhận ra kết quả backtest tốt bằng cách xác định hướng thông qua Kênh Donchian và lọc tín hiệu thông qua đường trung bình động. Chiến lược này phù hợp với các nhà đầu tư theo đuổi xu hướng lớn, với kiểm soát rủi ro tốt và dễ thực hiện trong giao dịch thực. Bằng cách tối ưu hóa một số thông số và quy tắc, tỷ lệ thắng và lợi nhuận có thể được cải thiện hơn nữa.


/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// Coded by Vladkos
strategy("Donchian strategy with filter", overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 4,pyramiding=5)

fromyear = input(2017, defval = 2018, minval = 1800, 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(21, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
term = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))
ATR=input(20,minval=1)
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
needstoploss= input(true,defval=true,title="Stop LOSS")
///////////ATR
tra=atr(ATR)


////////////Переменные
Donchian_slow=input(20,minval=1)
Donchian_fast=input(10,minval=1)
Slow_EMA=input(125,minval=1)
Fast_EMA=input(50,minval=1)

/////////// Медленный Дончан
lower = lowest(Donchian_slow)
upper = highest(Donchian_slow)
basis = avg(upper, lower)
plot(lower,color=blue)
plot(upper,color=blue)

/////////// быстрый Дончан
lowerF = lowest(Donchian_fast)
upperF = highest(Donchian_fast)
basisF = avg(upperF, lowerF)
plot(lowerF,color=red)
plot(upperF,color=red)

////////// Скользящие средние
ema_S=ema(close,Slow_EMA)
ema_F=ema(close,Fast_EMA)
plot(ema_S,color=red)
plot(ema_F,color=green)

///////// Условия сделок
long_condition= close>=upper[1] and ema_F>ema_S  
long_exit= close<lowerF[1]

short_condition=close<=lower[1] and ema_F<ema_S
short_exit=close>upperF[1]

////////// Отправка ордеров
strategy.entry("Long",strategy.long,when=long_condition and term and needlong==true)
strategy.exit("stop loss","Long",stop=strategy.position_avg_price-(tra*2),when= (needstoploss==true))
strategy.close("Long",when=long_exit and (time < timestamp(toyear, tomonth, today, 23, 59)))
    
strategy.entry("Short",strategy.short,when=short_condition and term and (needshort==true))
strategy.exit("stoploss","Short",stop=strategy.position_avg_price+(tra*2),when= (needstoploss==true))
strategy.close("Short",when=short_exit and (time < timestamp(toyear, tomonth, today, 23, 59)))

if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()






Thêm nữa