Chiến lược giao dịch hệ thống trung bình động nhiều khung thời gian

Tác giả:ChaoZhang, Ngày: 2023-12-12 16:07:18
Tags:

img

Tổng quan

Chiến lược này áp dụng một hệ thống trung bình động nhiều khung thời gian, kết hợp với chỉ số RSI và các chỉ số kỹ thuật khác, để đạt được chuyển đổi tự động giữa các vị trí dài và ngắn.

Nguyên tắc

Các chỉ số cốt lõi của chiến lược này là hệ thống trung bình động. Chiến lược sử dụng nhiều chỉ số trung bình động như JMA, TEMA, DEMA để tính xu hướng giá trong các khoảng thời gian khác nhau như 15min, 30min, 60min. Ví dụ, xu hướng MA được tính bởi JMA trong khung thời gian 15min đại diện cho phán đoán xu hướng giá trong khung thời gian đó. Sau đó, chiến lược so sánh xu hướng giá giữa các khung thời gian khác nhau để xác định sự khác biệt giữa xu hướng dài hơn và ngắn hơn. Nếu phát hiện sự khác biệt đáng kể, các tín hiệu giao dịch sẽ được tạo ra. Ngoài ra, chiến lược cũng kết hợp các chỉ số khác như RSI và Xu hướng sóng để đảm bảo độ tin cậy của tín hiệu giao dịch.

Cụ thể, các biến xu hướng, xu hướng2 và xu hướng3 trong chiến lược đại diện cho xu hướng giá của các khung thời gian 15 phút, 30 phút và 60 phút tương ứng. Nếu có sự đảo ngược giá 15 phút, trong khi 30 phút và 60 phút chưa đảo ngược, nó được đánh giá là sự khác biệt giữa xu hướng ngắn hơn và dài hơn, do đó tạo ra tín hiệu giao dịch. Không có tín hiệu nào sẽ được tạo ra nếu xu hướng của tất cả các khung thời gian là phù hợp.

Bằng cách so sánh các mối quan hệ giữa nhiều khung thời gian và lọc ra một số tín hiệu sai, các tín hiệu giao dịch đáng tin cậy hơn có thể được tạo ra đây là ý tưởng cốt lõi của chiến lược.

Phân tích lợi thế

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

  1. Tăng độ tin cậy tín hiệu thông qua phân tích nhiều khung thời gian và lọc các tín hiệu sai;
  2. Tránh các vấn đề với chỉ số duy nhất bằng cách kết hợp nhiều chỉ số để đánh giá toàn diện;
  3. Chuyển tự động giữa các vị trí dài và ngắn mà không cần can thiệp bằng tay, giảm khó khăn hoạt động.

Phân tích rủi ro

Một số rủi ro cũng tồn tại với chiến lược này:

  1. Phân tích nhiều khung thời gian mang lại sự không chắc chắn về thời gian nhập cảnh giao dịch có thể gây ra sự thiếu giá nhập cảnh tốt nhất;
  2. Các thiết lập tham số không phù hợp khi kết hợp nhiều chỉ số có thể dẫn đến chất lượng tín hiệu giao dịch xấu đi;
  3. Thay đổi vị trí tự động có nguy cơ tối ưu hóa quá mức và hiệu suất giao dịch thực tế yếu hơn so với backtests.

Chúng tôi có thể thực hiện các biện pháp sau đây để giảm thiểu các rủi ro trên:

  1. Điều chỉnh các thông số khung thời gian để đảm bảo thu thập các tín hiệu ngắn hạn để nhập vào kịp thời;
  2. Kiểm tra hậu quả rộng rãi để tối ưu hóa liên tục các thông số chỉ số;
  3. can thiệp hợp lý trong giao dịch thực tế để ngăn chặn giao dịch mù bởi các hệ thống tự động.

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

Có chỗ cho việc tối ưu hóa thêm chiến lược này:

  1. giới thiệu các thuật toán học máy để tự động tối ưu hóa các tham số trên nhiều chỉ số thông qua đào tạo mô hình;
  2. Thêm các thiết lập trượt thích nghi dựa trên mức độ biến động thị trường để cải thiện hiệu suất giao dịch thực tế;
  3. Tích hợp các cơ chế xác nhận giá-kích thước để tránh tổn thất từ sự đảo ngược xu hướng nhanh chóng.

Kết luận

Chiến lược này so sánh xu hướng giá nhiều khung thời gian để xác định các mối quan hệ dài hạn so với ngắn hạn và tạo ra các tín hiệu giao dịch thông qua việc phân tích nhiều chỉ số đạt được chuyển đổi tự động giữa dài và ngắn với kết quả backtest tốt. Chúng tôi cũng xác định một số lĩnh vực cải tiến thông qua các phương pháp như học máy, trượt thích nghi và xác nhận khối lượng để tăng cường hiệu suất giao dịch thực hơn nữa.


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

//@version=2
strategy("Drexel Strategy", overlay=true )
Length1=7
Length2=9
Multiplier=input(1.5,"Multiplier")
jma(src,length) =>
    beta = 0.45*(length-1)/(0.45*(length-1)+2)
    alpha = beta
    tmp0 = (1-alpha)*src + alpha*nz(tmp0[1])
    tmp1 = (src - tmp0[0])*(1-beta) + beta*nz(tmp1[1])
    tmp2 = tmp0[0] + tmp1[0]
    tmp3 = (tmp2[0] - nz(tmp4[1]))*((1-alpha)*(1-alpha)) + (alpha*alpha)*nz(tmp3[1])
    tmp4 = nz(tmp4[1]) + tmp3[0]
    JMA = tmp4
    JMA
rsx(src,length) =>
    f90_ = (nz(f90_[1]) == 0.0) ? 1.0 : (nz(f88[1]) <= nz(f90_[1])) ? nz(f88[1])+1 : nz(f90_[1])+1
    f88 = (nz(f90_[1]) == 0.0) and (length-1 >= 5) ? length-1.0 : 5.0 
    f8 =  100.0*(src) 
    f18 = 3.0 / (length + 2.0) 
    f20 = 1.0 - f18 
    f10 = nz(f8[1])
    v8 = f8 - f10 
    f28 = f20 * nz(f28[1]) + f18 * v8 
    f30 = f18 * f28 + f20 * nz(f30[1])
    vC = f28 * 1.5 - f30 * 0.5 
    f38 = f20 * nz(f38[1]) + f18 * vC 
    f40 = f18 * f38 + f20 * nz(f40[1])
    v10 = f38 * 1.5 - f40 * 0.5 
    f48 = f20 * nz(f48[1]) + f18 * v10 
    f50 = f18 * f48 + f20 * nz(f50[1])
    v14 = f48 * 1.5 - f50 * 0.5 
    f58 = f20 * nz(f58[1]) + f18 * abs(v8) 
    f60 = f18 * f58 + f20 * nz(f60[1])
    v18 = f58 * 1.5 - f60 * 0.5
    f68 = f20 * nz(f68[1]) + f18 * v18 
    f70 = f18 * f68 + f20 * nz(f70[1])
    v1C = f68 * 1.5 - f70 * 0.5 
    f78 = f20 * nz(f78[1]) + f18 * v1C 
    f80 = f18 * f78 + f20 * nz(f80[1])
    v20 = f78 * 1.5 - f80 * 0.5
    f0 = ((f88 >= f90_) and (f8 != f10)) ? 1.0  : 0.0
    f90 = ((f88 == f90_) and (f0 == 0.0))  ? 0.0  : f90_
    v4_ = ((f88 < f90) and (v20 > 0.0000000001)) ? (v14 / v20 + 1.0) * 50.0 : 50.0
    rsx = ((v4_ > 100.0) ? 100.0 : (v4_ < 0.0) ? 0.0 : v4_)-50
    rsx
xPrice=open
emaA = ema(xPrice, Length2)  
Xprice = rsx(open,14)
XPrice = high, xprice = low
xe1 = jma(xPrice, Length1)
xe11 = jma(Xprice[1],Length1)
xe111 = jma(XPrice[1],Length1)
xe1111=jma(xprice[1],Length1)
xe2 = jma(xe1, Length1)
xe21 = jma(xe111, Length1)
xe3 = jma(xe2, Length1)
xe31 = jma(xe1111,Length2)
xe3a = jma(xe2,Length1)
xe4 = jma(xe3, Length1)
xe5 = jma(xe4, Length1)
xe6 = jma(xe5, Length1)
b = 0.7
c1 = -b*b*b
c2 = 3*b*b+3*b*b*b
c3 = -6*b*b-3*b-3*b*b*b
c3a = nz(c3a[1])
c4 = 1+3*b+b*b*b+3*b*b
TEMA = c1 * xe6 + c2 * xe5 + c3 * xe4 + c4 * xe3
DEMA = 2 * emaA - ema(emaA, Length2)
Length(mod)=>(mod*c3a)+Length2
Trend1=TEMA/DEMA
a=rsx(open,Length(2))
b1=rsx(open,Length(3))
c=rsx(open,Length(5))
d=rsx(open,Length(8))
e=rsx(open,Length(13))
f=rsx(open,Length(21))
g=rsx(open,Length(34))
h=rsx(open,Length(55))
i=rsx(open,Length(89))
j=rsx(open,Length(144))
trend1 = (((a-b1)+(c-d)+(e-f)+(g-h)+(i-j))/10)
trend = trend1>0?avg(a,b,c4,c2):trend1==0?XPrice:avg(rsx(open,24),jma(open,24),rsx(jma(open,24),24))
trend2 = trend1>0?avg(d,e,c2,c1):trend1==0?XPrice:avg(rsx(open,48),jma(open,48),rsx(jma(open,48),48))
trend3 = trend1>0?avg(d,e,c2,c1):trend1==0?xprice:avg(rsx(open,96),jma(open,96),rsx(jma(open,96),96))
bc=request.security(syminfo.tickerid,'15',trend)
bc1=request.security(syminfo.tickerid,'15',trend2)
bc2=request.security(syminfo.tickerid,'15',trend3)
bd=request.security(syminfo.tickerid,'30',trend)
bd1=request.security(syminfo.tickerid,'30',trend2)
bd2=request.security(syminfo.tickerid,'30',trend3)
be=request.security(syminfo.tickerid,'60',trend)
be1=request.security(syminfo.tickerid,'60',trend2)
be2=request.security(syminfo.tickerid,'60',trend3)
bf=request.security(syminfo.tickerid,'120',trend)
bf1=request.security(syminfo.tickerid,'120',trend2)
bf2=request.security(syminfo.tickerid,'120',trend3)
bg=request.security(syminfo.tickerid,'240',trend)
bg1=request.security(syminfo.tickerid,'240',trend2)
bg2=request.security(syminfo.tickerid,'240',trend3)
bh=request.security(syminfo.tickerid,'D',trend)
bh1=request.security(syminfo.tickerid,'D',trend2)
bh2=request.security(syminfo.tickerid,'D',trend3)
Trend=((bc-bc1)+(bd-bd1)+(be-be1)+(bf-bf1)+(bg-bg1)+(bh))
Trend11=((bc-bc1)+(bd-bd1)+(be-be1)+(bf-bf1)+(bg-bg1)+(bh1))
Trend33 = max(min(min(min(bc2,bd2),min(be2,bf2)),bg2),bh2)
AverageTrend=sma(Trend1,1000)
StdDev=Multiplier*stdev(Trend1,1000)
TopBand=AverageTrend+StdDev
BotBand=AverageTrend-StdDev
ap=open
n1=10
n2=21
esa1 = jma(ap, n1)
d1 = jma(abs(ap - esa1), n1)
x1 = trend3==Trend33
y1 = trend2==Trend11 
ci = (ap - esa1) / (0.015 * d1)
tci = jma(ci, n2)
wt1=tci
wt2=sma(wt1,4)
fast=jma(open,5)
slow=jma(open,13)
macd=fast-slow
signal=sma(macd,4)
WaveTrend1=wt1-wt2
JMACD1=macd-signal
rsi = (((rsi(open,6))-50)*3)
g1=rsi>Trend1 and WaveTrend1>Trend1 and JMACD1>Trend1
h1=g1?tci*c3a:nz(h[1])
strategy.entry("Long",true,when=x1)
strategy.close("Long",y1)
strategy.entry("Short",false,when=y1)
strategy.close("Short",x1)

Thêm nữa