Chiến lược động lượng ngẫu nhiên xếp chồng ba


Ngày tạo: 2024-01-26 12:15:20 sửa đổi lần cuối: 2024-01-26 12:15:20
sao chép: 2 Số nhấp chuột: 768
1
tập trung vào
1617
Người theo dõi

Chiến lược động lượng ngẫu nhiên xếp chồng ba

Tổng quan

Chiến lược động cơ ngẫu nhiên chồng ba là một chiến lược giao dịch ngắn hạn điển hình. Nó tạo ra tín hiệu giao dịch bằng cách tính toán ba chỉ số động cơ ngẫu nhiên với các thiết lập tham số khác nhau và được chồng lên nhau nhiều lần. Khi ba chỉ số động cơ ngẫu nhiên đồng thời hiển thị tín hiệu quá mua hoặc quá bán, mua hoặc bán được thực hiện. Chiến lược này kết hợp lợi thế của phân tích nhiều chu kỳ thời gian, có thể lọc hiệu quả tiếng ồn thị trường và cải thiện chất lượng tín hiệu.

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

Chỉ số trung tâm của chiến lược này là chỉ số động lực ngẫu nhiên (SMI). Công thức tính toán của chỉ số SMI như sau:

SMI = 100 * EMA(EMA(收盘价-最高价和最低价的中点,N1),N2) / 0.5 * EMA(EMA(最高价-最低价,N1),N2)

Trong đó, N1 và N2 là chiều dài của tham số. SMI có phạm vi từ -100 đến 100, khi SMI cao hơn 0 nghĩa là giá đóng cửa nằm ở nửa trên phạm vi giá trong ngày, và khi thấp hơn 0 nghĩa là giá đóng cửa nằm ở nửa dưới phạm vi giá.

Tương tự như chỉ số stoch truyền thống, chỉ số SMI có thể tạo ra tín hiệu đảo ngược khi vượt qua đường mua quá mức (như 40) và đường bán quá mức (như 40). Khi SMI vượt qua đường trung bình di chuyển của nó, nó tạo ra tín hiệu mua; khi SMI vượt qua đường trung bình di chuyển của nó, nó tạo ra tín hiệu bán.

Chiến lược này sử dụng ba nhóm chỉ số SMI với các thiết lập tham số khác nhau được xếp chồng lên nhau, được thiết lập thành:

  • SMI1: K% độ dài 10 chu kỳ, K% chu kỳ mịn 3 chu kỳ
  • SMI2: %K dài 20 chu kỳ,%K chu kỳ mịn 3 chu kỳ
  • SMI3: %K dài 5 chu kỳ, %K chu kỳ mịn 3 chu kỳ

Khi ba chỉ số SMI đồng thời hiển thị quá mua hoặc quá bán, tín hiệu giao dịch được phát ra. Điều này có thể lọc hiệu quả các tín hiệu giả và cải thiện chất lượng tín hiệu.

Lợi thế chiến lược

  • Phân tích nhiều chu kỳ thời gian, đánh giá tổng hợp, lọc tiếng ồn hiệu quả
  • Chỉ số SMI tăng cường tính dễ sử dụng của chỉ số Stoch
  • Sử dụng chồng ba, độ tin cậy cao hơn chỉ số đơn
  • Thiết lập tham số linh hoạt và có thể điều chỉnh
  • Thích hợp cho giao dịch tần số cao

Rủi ro chiến lược

  • Nhiều chỉ số chồng lên nhau, có sự chậm trễ nhất định
  • Hành động ngắn gọn thường xuyên, chi phí giao dịch cao
  • Rủi ro của dữ liệu khớp
  • Rủi ro thất bại của các tham số sau khi cấu trúc thị trường thay đổi

Các biện pháp giảm thiểu rủi ro:

  • Tối ưu hóa tham số, giảm chậm trễ
  • Điều chỉnh thời gian nắm giữ để giảm chi phí giao dịch
  • Tăng kiểm tra thống kê, kiểm tra sức khỏe
  • Động thái điều chỉnh tham số

Tối ưu hóa chiến lược

  • Kiểm tra các tổ hợp tham số SMI khác nhau
  • Tăng các chỉ số thống kê để đánh giá tính ổn định của các tham số
  • Kết hợp với các chỉ số phụ trợ khác như số lượng giao dịch, và Blink
  • Các tham số chuyển đổi động theo môi trường thị trường
  • Tối ưu hóa chiến lược dừng lỗ

Tóm tắt

Chiến lược động lực ngẫu nhiên ba lần được sử dụng để tạo ra tín hiệu giao dịch mua bán vượt trội chất lượng cao bằng cách sử dụng ba nhóm các chỉ số SMI với các tham số khác nhau, được đánh giá tổng hợp trong nhiều chu kỳ thời gian. Chiến lược này có thể lọc nhiều tiếng ồn hơn so với chỉ số đơn lẻ, tăng sự ổn định.

Mã nguồn chiến lược
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("Stochastic Momentum multi strategy", "Stochastic Momentum Index multi strategy", overlay=false)

q = input(10, title="%K Length")
r = input(3, title="%K Smoothing Length")
s = input(3, title="%K Double Smoothing Length")
nsig = input(10, title="Signal Length")
matype = input("ema", title="Signal MA Type")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought = input(40, title="Overbought Level", type=float)
oversold = input(-40, title="Oversold Level", type=float)

trima(src, length) => sma(sma(src,length),length)
hma(src, length) => wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
dema(src, length) => 2*ema(src,length) - ema(ema(src,length),length)
tema(src, length) => (3*ema(src,length) - 3*ema(ema(src,length),length)) + ema(ema(ema(src,length),length),length)
zlema(src, length) => ema(src,length) + (ema(src,length) - ema(ema(src,length),length))

smi = 100 * ema(ema(close-0.5*(highest(q)+lowest(q)),r),s) / (0.5 * ema(ema(highest(q)-lowest(q),r),s))
sig = matype=="ema" ? ema(smi,nsig) : matype=="sma" ? sma(smi,nsig) : matype=="wma" ? wma(smi,nsig) : matype=="trima" ? trima(smi,nsig) : matype=="hma" ? hma(smi,nsig) : matype=="dema" ? dema(smi,nsig) : matype=="tema" ? tema(smi,nsig) : matype=="zlema" ? zlema(smi,nsig) : ema(smi,nsig)

p_smi = plot(smi, title="SMI", color=aqua)
p_sig = plot(sig, title="Signal", color=red)

// plotchar(crossover(smi, sig), title= "low", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi, sig), title= "high", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////2
q2 = input(20, title="%K Length 2")
r2 = input(3, title="%K Smoothing Length 2")
s2 = input(3, title="%K Double Smoothing Length 2")
nsig2 = input(10, title="Signal Length 2")
matype2 = input("ema", title="Signal MA Type 2")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought2 = input(40, title="Overbought Level 2", type=float)
oversold2 = input(-40, title="Oversold Level 2", type=float)

trima2(src2, length2) => sma(sma(src2,length2),length2)
hma2(src2, length2) => wma(2*wma(src2, length2/2)-wma(src2, length2), round(sqrt(length2)))
dema2(src2, length2) => 2*ema(src2,length2) - ema(ema(src2,length2),length2)
tema2(src2, length2) => (3*ema(src2,length2) - 3*ema(ema(src2,length2),length2)) + ema(ema(ema(src2,length2),length2),length2)
zlema2(src2, length2) => ema(src2,length2) + (ema(src2,length2) - ema(ema(src2,length2),length2))

smi2 = 100 * ema(ema(close-0.5*(highest(q2)+lowest(q2)),r2),s2) / (0.5 * ema(ema(highest(q2)-lowest(q2),r2),s2))
sig2 = matype2=="ema" ? ema(smi2,nsig2) : matype2=="sma 2" ? sma(smi2,nsig2) : matype2=="wma 2" ? wma(smi2,nsig2) : matype2=="trima 2" ? trima2(smi2,nsig2) : matype2=="hma 2" ? hma2(smi2,nsig2) : matype=="dema 2" ? dema2(smi2,nsig2) : matype2=="tema 2" ? tema2(smi2,nsig2) : matype2=="zlema 2" ? zlema2(smi2,nsig2) : ema(smi2,nsig2)

p_smi2 = plot(smi2, title="SMI 2", color=aqua)
p_sig2 = plot(sig2, title="Signal2", color=red)

// plotchar(crossover(smi2, sig2), title= "low2", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi2, sig2), title= "high2", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////3
q3 = input(5, title="%K Length 3")
r3 = input(3, title="%K Smoothing Length 3")
s3 = input(3, title="%K Double Smoothing Length 3")
nsig3 = input(10, title="Signal Length 3")
matype3 = input("ema", title="Signal MA Type 3")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought3 = input(40, title="Overbought Level 3", type=float)
oversold3 = input(-40, title="Oversold Level 3", type=float)

trima3(src3, length3) => sma(sma(src3,length3),length3)
hma3(src3, length3) => wma(2*wma(src3, length3/2)-wma(src3, length3), round(sqrt(length3)))
dema3(src3, length3) => 2*ema(src3,length3) - ema(ema(src3,length3),length3)
tema3(src3, length3) => (3*ema(src3,length3) - 3*ema(ema(src3,length3),length3)) + ema(ema(ema(src3,length3),length3),length3)
zlema3(src3, length3) => ema(src3,length3) + (ema(src3,length3) - ema(ema(src3,length3),length3))

smi3 = 100 * ema(ema(close-0.5*(highest(q3)+lowest(q3)),r3),s3) / (0.5 * ema(ema(highest(q3)-lowest(q3),r3),s3))
sig3 = matype3=="ema" ? ema(smi3,nsig3) : matype3=="sma 3" ? sma(smi3,nsig3) : matype3=="wma 3" ? wma(smi3,nsig3) : matype3=="trima 3" ? trima3(smi3,nsig3) : matype3=="hma 3" ? hma3(smi3,nsig3) : matype=="dema 3" ? dema3(smi3,nsig3) : matype3=="tema 3" ? tema3(smi3,nsig3) : matype3=="zlema 3" ? zlema3(smi3,nsig3) : ema(smi3,nsig3)

p_smi3 = plot(smi3, title="SMI 3", color=aqua)
p_sig3 = plot(sig3, title="Signal3", color=red)

// plotchar(crossover(smi3, sig3) and crossover(smi2, sig2) and crossover(smi, sig), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi3, sig3) and crossunder(smi2, sig2) and crossunder(smi, sig), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)
plotchar (((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
plotchar (((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)

// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

longCondition = ((smi3 < sig3) and (smi2 < sig2) and (smi < sig))
shortCondition = ((smi3 > sig3) and (smi2 > sig2) and (smi > sig))

// buy = longCondition == 1 and longCondition[1] == 1 ? longCondition : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// === ALERTS ===
strategy.entry("L", strategy.long, when=buy)

strategy.entry("S", strategy.short, when=sell)

alertcondition(((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title='Low Fib.', message='Low Fib. Buy')
alertcondition(((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title='High Fib.', message='High Fib. Low')