Chiến lược đa chu kỳ kênh Gaussian thích ứng động lượng

ATR RSI HLC3 TR
Ngày tạo: 2025-02-08 14:49:15 sửa đổi lần cuối: 2025-02-08 14:49:15
sao chép: 1 Số nhấp chuột: 360
1
tập trung vào
1617
Người theo dõi

Chiến lược đa chu kỳ kênh Gaussian thích ứng động lượng

Tổng quan

Chiến lược này là một hệ thống giao dịch động dựa trên Gauss Channel và chỉ số RSI ngẫu nhiên, kết hợp với lọc theo mùa và quản lý biến động. Chiến lược này nhận ra xu hướng thị trường bằng cách tự điều chỉnh Gauss Channel, sử dụng RSI ngẫu nhiên để xác nhận động lực và thực hiện giao dịch trong một cửa sổ theo mùa cụ thể. Hệ thống cũng tích hợp quản lý vị trí dựa trên ATR để kiểm soát lỗ hổng rủi ro cho mỗi giao dịch.

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

Cốt lõi của chiến lược là một kênh giá được xây dựng dựa trên bộ lọc Gaussian đa cực. Cổng này tạo ra một quỹ đạo lên xuống động bằng cách tính toán giá Gaussian của giá HLC3 và kết hợp kết quả của sự dao động của độ dao động thực sự (TR). Tạo ra tín hiệu giao dịch cần đáp ứng các điều kiện sau:

  1. Giá vượt lên đường và xu hướng tăng trưởng của sóng chính
  2. Chỉ số RSI ngẫu nhiên cho thấy tình trạng mua quá mức
  3. Thời gian hiện tại trong cửa sổ theo mùa mặc định
  4. Kích thước vị trí dựa trên tính toán động ATR

Các tín hiệu đồng bằng được kích hoạt bởi giá giảm xuống đường. Toàn bộ hệ thống thông qua nhiều cơ chế lọc, tăng sự ổn định của giao dịch.

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

  1. Bộ lọc cao cấp có khả năng lọc tiếng ồn tuyệt vời, có thể nắm bắt được xu hướng thị trường thực tế một cách hiệu quả
  2. Thiết kế đa cực cung cấp ranh giới kênh giá chính xác hơn
  3. Kết hợp động lượng và chỉ số xu hướng để tăng độ tin cậy của tín hiệu
  4. Bộ lọc theo mùa giúp tránh môi trường thị trường bất lợi
  5. Quản lý vị thế động đảm bảo tính nhất quán về rủi ro
  6. Các tham số hệ thống có thể được tối ưu hóa theo các điều kiện thị trường khác nhau

Rủi ro chiến lược

  1. Tính toán phức tạp của bộ lọc Gaussian có thể gây ra sự chậm trễ trong quá trình thực hiện
  2. Điều kiện lọc nhiều lần có thể bỏ lỡ cơ hội giao dịch quan trọng
  3. Hệ thống nhạy cảm với các thiết lập tham số, cần tối ưu hóa cẩn thận
  4. Cài đặt cố định của cửa sổ theo mùa có thể không thích nghi với môi trường thị trường thay đổi
  5. Kiểm soát vị trí dựa trên ATR có thể quá bảo thủ trong thời gian biến động cao

Hướng tối ưu hóa chiến lược

  1. Tiến hành các cửa sổ theo mùa tự điều chỉnh để điều chỉnh thời gian giao dịch theo điều kiện thị trường
  2. Tối ưu hóa hiệu quả tính toán của bộ lọc Gaussian, giảm độ trễ thực hiện
  3. Tham gia cơ chế điều chỉnh biến động thị trường, điều chỉnh điều kiện lọc theo môi trường thị trường khác nhau
  4. Phát triển hệ thống quản lý vị trí linh hoạt hơn, cân bằng rủi ro và lợi nhuận
  5. Thêm phân tích nhiều khung thời gian, tăng độ tin cậy tín hiệu

Tóm tắt

Đây là một hệ thống theo dõi xu hướng được xây dựng tốt, tăng sự ổn định của giao dịch thông qua các cơ chế lọc và quản lý rủi ro nhiều lớp. Mặc dù có một số không gian tối ưu hóa, nhưng khái niệm thiết kế tổng thể phù hợp với yêu cầu của giao dịch định lượng hiện đại.

Mã nguồn chiến lược
/*backtest
start: 2024-02-08 00:00:00
end: 2025-02-06 08:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"DIA_USDT"}]
*/

//@version=6
strategy("Demo GPT - Gold Gaussian Strategy", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1)

// ====== INPUTS ======
// Gaussian Channel
lengthGC = input.int(144, "Gaussian Period", minval=20)
poles = input.int(4, "Poles", minval=1, maxval=9)
multiplier = input.float(1.414, "Volatility Multiplier", minval=1)

// Stochastic RSI
smoothK = input.int(3, "Stoch K", minval=1)
lengthRSI = input.int(14, "RSI Length", minval=1)
lengthStoch = input.int(14, "Stoch Length", minval=1)
overbought = input.int(80, "Overbought Level", minval=50)

// Seasonal Filter (corrected)
startMonth = input.int(9, "Start Month (1-12)", minval=1, maxval=12)
endMonth = input.int(2, "End Month (1-12)", minval=1, maxval=12)

// Volatility Management
atrLength = input.int(22, "ATR Length", minval=5)
riskPercent = input.float(0.5, "Risk per Trade (%)", minval=0.1, step=0.1)

// ====== GAUSSIAN CHANNEL ======
f_filt9x(alpha, source, iterations) =>
    float f = 0.0
    float x = 1 - alpha
    int m2 = iterations == 9 ? 36 : iterations == 8 ? 28 : iterations == 7 ? 21 : 
           iterations == 6 ? 15 : iterations == 5 ? 10 : iterations == 4 ? 6 : 
           iterations == 3 ? 3 : iterations == 2 ? 1 : 0
    
    int m3 = iterations == 9 ? 84 : iterations == 8 ? 56 : iterations == 7 ? 35 : 
           iterations == 6 ? 20 : iterations == 5 ? 10 : iterations == 4 ? 4 : 
           iterations == 3 ? 1 : 0
    
    int m4 = iterations == 9 ? 126 : iterations == 8 ? 70 : iterations == 7 ? 35 : 
           iterations == 6 ? 15 : iterations == 5 ? 5 : iterations == 4 ? 1 : 0
    
    int m5 = iterations == 9 ? 126 : iterations == 8 ? 56 : iterations == 7 ? 21 : 
           iterations == 6 ? 6 : iterations == 5 ? 1 : 0
    
    int m6 = iterations == 9 ? 84 : iterations == 8 ? 28 : iterations == 7 ? 7 : 
           iterations == 6 ? 1 : 0
    
    int m7 = iterations == 9 ? 36 : iterations == 8 ? 8 : iterations == 7 ? 1 : 0
    
    int m8 = iterations == 9 ? 9 : iterations == 8 ? 1 : 0
    int m9 = iterations == 9 ? 1 : 0
    
    f := math.pow(alpha, iterations) * nz(source) +
      iterations * x * nz(f[1]) -
      (iterations >= 2 ? m2 * math.pow(x, 2) * nz(f[2]) : 0) +
      (iterations >= 3 ? m3 * math.pow(x, 3) * nz(f[3]) : 0) -
      (iterations >= 4 ? m4 * math.pow(x, 4) * nz(f[4]) : 0) +
      (iterations >= 5 ? m5 * math.pow(x, 5) * nz(f[5]) : 0) -
      (iterations >= 6 ? m6 * math.pow(x, 6) * nz(f[6]) : 0) +
      (iterations >= 7 ? m7 * math.pow(x, 7) * nz(f[7]) : 0) -
      (iterations >= 8 ? m8 * math.pow(x, 8) * nz(f[8]) : 0) +
      (iterations == 9 ? m9 * math.pow(x, 9) * nz(f[9]) : 0)
    f

f_pole(alpha, source, iterations) =>
    float fn = na
    float f1 = f_filt9x(alpha, source, 1)
    float f2 = iterations >= 2 ? f_filt9x(alpha, source, 2) : na
    float f3 = iterations >= 3 ? f_filt9x(alpha, source, 3) : na
    float f4 = iterations >= 4 ? f_filt9x(alpha, source, 4) : na
    float f5 = iterations >= 5 ? f_filt9x(alpha, source, 5) : na
    float f6 = iterations >= 6 ? f_filt9x(alpha, source, 6) : na
    float f7 = iterations >= 7 ? f_filt9x(alpha, source, 7) : na
    float f8 = iterations >= 8 ? f_filt9x(alpha, source, 8) : na
    float f9 = iterations == 9 ? f_filt9x(alpha, source, 9) : na
    
    fn := iterations == 1 ? f1 : 
         iterations == 2 ? f2 : 
         iterations == 3 ? f3 : 
         iterations == 4 ? f4 : 
         iterations == 5 ? f5 : 
         iterations == 6 ? f6 : 
         iterations == 7 ? f7 : 
         iterations == 8 ? f8 : 
         iterations == 9 ? f9 : na
    [fn, f1]

beta = (1 - math.cos(4 * math.asin(1) / lengthGC)) / (math.pow(1.414, 2 / poles) - 1)
alpha = -beta + math.sqrt(math.pow(beta, 2) + 2 * beta)
lag = int((lengthGC - 1) / (2 * poles))

srcAdjusted = hlc3 + (hlc3 - hlc3[lag])
[mainFilter, filt1] = f_pole(alpha, srcAdjusted, poles)
[trFilter, tr1] = f_pole(alpha, ta.tr(true), poles)

upperBand = mainFilter + trFilter * multiplier
lowerBand = mainFilter - trFilter * multiplier

// ====== STOCHASTIC RSI ======
rsiValue = ta.rsi(close, lengthRSI)
k = ta.sma(ta.stoch(rsiValue, rsiValue, rsiValue, lengthStoch), smoothK)
stochSignal = k >= overbought

// ====== SEASONAL FILTER (FIXED) ======
currentMonth = month(time)
inSeason = (currentMonth >= startMonth and currentMonth <= 12) or 
         (currentMonth >= 1 and currentMonth <= endMonth)

// ====== VOLATILITY MANAGEMENT ======
atr = ta.atr(atrLength)
positionSize = math.min((strategy.equity * riskPercent/100) / atr, strategy.equity * 0.5 / close)

// ====== TRADING LOGIC ======
trendUp = mainFilter > mainFilter[1]
priceAbove = close > upperBand
longCondition = trendUp and priceAbove and stochSignal and inSeason

exitCondition = ta.crossunder(close, lowerBand)

// ====== EXECUTION ======
if longCondition
    strategy.entry("Long", strategy.long, qty=positionSize)
    
if exitCondition
    strategy.close("Long")

// ====== VISUALIZATION ======
plot(upperBand, "Upper Band", color=color.new(#00FF00, 0))
plot(lowerBand, "Lower Band", color=color.new(#FF0000, 0))
bgcolor(inSeason ? color.new(color.blue, 90) : na, title="Season Filter")