Kỹ thuật theo dõi xu hướng trung bình động của TSI và CCI Hull

Tác giả:ChaoZhang, Ngày: 2023-11-28 15:53:03
Tags:

img

Tổng quan

Chiến lược này tích hợp các chỉ số Tỉ số sức mạnh tương đối (TSI), Chỉ số kênh hàng hóa (CCI) và Chỉ số trung bình chuyển động Hull (Hull MA) để tạo thành một chiến lược giao dịch theo dõi xu hướng. Nó có thể thực hiện các giao dịch theo dõi dài hạn trên bất kỳ loại giao dịch nào trong khung thời gian hàng giờ hoặc cao hơn.

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

Chiến lược chủ yếu sử dụng các chỉ số TSI và CCI để đánh giá hướng xu hướng và tình huống mua quá mức / bán quá mức của thị trường, cũng như Hull MA để xác định xu hướng trung gian của giá, và ba điều kiện được kết hợp như là các điều kiện cơ bản để mở các vị trí.

Cụ thể, khi đường nhanh của TSI vượt qua trên đường chậm, chỉ số CCI vượt qua trên +20 && n1 tăng, đi dài; khi đường nhanh của TSI vượt qua dưới đường chậm, chỉ số CCI vượt qua dưới -20 && n1 giảm, đi ngắn. Hull MA được sử dụng để lọc xu hướng trung gian, chỉ đi dài khi giá dưới Hull MA và đi ngắn khi giá trên Hull MA.

Bằng cách xác nhận với các chỉ số trên các chu kỳ khác nhau, các sự đột phá sai có thể được lọc hiệu quả để theo dõi xu hướng trung bình và dài hạn.

Phân tích lợi thế

Đây là một chiến lược theo dõi xu hướng tương đối ổn định và hiệu quả, với những lợi thế chính sau:

  1. Sử dụng TSI để đánh giá hướng xu hướng dài hạn là đáng tin cậy hơn, tránh sự can thiệp từ tiếng ồn thị trường ngắn hạn;

  2. Việc bổ sung chỉ số CCI có thể xác nhận hiện tượng mua quá mức / bán quá mức và lọc một số tín hiệu sai;

  3. Phán quyết của Hull MA làm cho các điểm đầu vào chính xác hơn, cải thiện đáng kể xác suất lợi nhuận;

  4. Việc tích hợp các chỉ số với các tham số khác nhau có thể cải thiện độ tin cậy của tín hiệu và giảm xác suất nhiễu.

  5. Cài đặt tham số linh hoạt của chiến lược có thể được tối ưu hóa cho các chu kỳ thị trường khác nhau.

Phân tích rủi ro

Mặc dù chiến lược tương đối ổn định, vẫn có một số rủi ro cần lưu ý:

  1. Thị trường có thể trải qua những sự đảo ngược mạnh mẽ mà không thể nhanh chóng dừng lại cho tổn thất, gây ra tổn thất tương đối lớn;

  2. Chỉ số TSI Diff và CCI có thể có tín hiệu sai và chậm trễ, thiếu một số điểm đầu vào;

  3. Cài đặt tham số không chính xác cũng có thể dẫn đến tần suất giao dịch quá cao hoặc giảm chất lượng tín hiệu.

Các biện pháp đối phó:

  1. Điều chỉnh stop loss phù hợp để kiểm soát single loss;

  2. Xác nhận bằng các chỉ số khác nếu thích hợp để cải thiện độ chính xác tín hiệu;

  3. Điều chỉnh các thông số theo thị trường để đảm bảo tính ổn định của chiến lược.

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

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

  1. Thử các kết hợp khác nhau của các chỉ số tham số để tìm sự phù hợp tốt nhất;

  2. Đưa ra các thuật toán học máy để đạt được tối ưu hóa thích nghi của các thông số;

  3. Tăng mô-đun quản lý vốn để có lợi nhuận ổn định hơn;

  4. Kết hợp nhiều bộ lọc hơn để tăng tỷ lệ chiến thắng chiến lược.

Đây sẽ là trọng tâm cho các tối ưu hóa trong tương lai.

Tóm lại

Chiến lược này sử dụng toàn diện các chỉ số TSI, CCI và Hull MA để hình thành một chiến lược theo dõi xu hướng tương đối ổn định và hiệu quả. Nó tận dụng thành công những lợi thế của các chỉ số đa chu kỳ để cải thiện chất lượng tín hiệu. Bước tiếp theo sẽ là tăng cường tính ổn định và lợi nhuận của chiến lược thông qua tối ưu hóa tham số, tăng cường bộ lọc và các phương tiện khác.


/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="TSI CCI Hull", shorttitle="TSICCIHULL", default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills= false, calc_on_every_tick=true, pyramiding=0)
long = input(title="Long Length", type=input.integer, defval=50)
short = input(title="Short Length", type=input.integer, defval=50)
signal = input(title="Signal Length", type=input.integer, defval=25)
price=input(title="Source",type=input.source,defval=open)
Period=input(25, minval=1)
lineupper = input(title="Upper Line", type=input.integer, defval=100)
linelower = input(title="Lower Line", type=input.integer, defval=-100)
p=price
length= Period
double_smooth(src, long, short) =>
    fist_smooth = ema(src, long)
    ema(fist_smooth, short)
pc = change(price)
double_smoothed_pc = double_smooth(pc, long, short)
double_smoothed_abs_pc = double_smooth(abs(pc), long, short)
tsi_value = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
keh = tsi_value*5 > linelower ? color.red : color.lime
teh = ema(tsi_value*5, signal*5) > lineupper ? color.red : color.lime
meh = ema(tsi_value*5, signal*5) > tsi_value*5 ? color.red : color.lime
i1=plot(tsi_value*5, title="TSI Value", color=color.black, linewidth=1,transp=100)
i2=plot(ema(tsi_value*5, signal*5), title="TSI Signal", color=color.black, linewidth=1,transp=100)
fill(i1,i2,color=meh,transp=85)
plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=color.white, linewidth=8,transp=0)
plot(cross(tsi_value*5, ema(tsi_value*5, signal*5)) ? tsi_value*5 : na, style=plot.style_circles, color=meh, linewidth=5)
n2ma = 2 * wma(p, round(length / 2))
nma = wma(p, length)
diff = n2ma - nma
sqn = round(sqrt(length))
n1 = wma(diff, sqn)
cci = (p - n1) / (0.015 * dev(p, length))
c = cci > 0 ? color.lime : color.red
c1 = cci > 20 ? color.lime : color.silver
c2 = cci < -20 ? color.red : color.silver
cc=plot(cci, color=c, title="CCI Line", linewidth=2)
cc2=plot(cci[1], color=color.gray, linewidth=1,transp=100)
fill(cc,cc2,color=c,transp=85)
plot(cross(20, cci) ? 20 : na, style=plot.style_cross,title="CCI cross UP",  color=c1, linewidth=2,transp=100,offset=-2)
plot(cross(-20, cci) ? -20 : na, style=plot.style_cross,title="CCI cross down",  color=c2, linewidth=2,transp=100,offset=-2)

TSI1=ema(tsi_value*5, signal*5)
TSI2=ema(tsi_value*5, signal*5)[2]

hullma_smoothed = wma(2*wma(n1, Period/2)-wma(n1, Period), round(sqrt(Period)))
//plot(hullma_smoothed*200)

longCondition = TSI1>TSI2 and hullma_smoothed<price and cci>0
if (longCondition and cci>cci[1] and cci > 0 and n1>n1[1])
    strategy.entry("Buy Here", strategy.long)

shortCondition = TSI1<TSI2 and hullma_smoothed>price and cci<0
if (shortCondition and cci<cci[1] and cci < 0 and n1<n1[1])
    strategy.entry("Sell Here", strategy.short)

Thêm nữa