
Chiến lược này là một hệ thống giao dịch theo dõi xu hướng kết hợp các kênh trung bình di chuyển có trọng lượng cao và chỉ số tương đối mạnh ngẫu nhiên (Stochastic RSI). Chiến lược này xây dựng các kênh giá bằng phương pháp có trọng lượng cao và kết hợp các tín hiệu chéo của chỉ số RSI ngẫu nhiên để xác định thời điểm vào và ra, để xác nhận sự nắm bắt và động lực của xu hướng. Chiến lược này có nền tảng toán học tốt, có thể lọc tiếng ồn thị trường một cách hiệu quả và nắm bắt xu hướng chính.
Chiến lược này bao gồm hai phần chính:
Hệ thống đường Gaussian: xây dựng đường giá bằng cách sử dụng đường trung bình chuyển động có trọng lượng Gaussian ((GWMA) và chênh lệch tiêu chuẩn có trọng lượng Gaussian ((GWSD)). GWMA trao trọng lượng lớn hơn cho dữ liệu gần đây, làm cho đường trung bình nhạy cảm hơn với sự thay đổi giá.
Hệ thống RSI ngẫu nhiên: xử lý ngẫu nhiên các chỉ số RSI truyền thống để tính toán giá trị K và giá trị D. Cách xử lý này có thể xác định tốt hơn các khu vực quá mua quá bán và cung cấp tín hiệu động lực chính xác hơn.
Các tín hiệu giao dịch được tạo ra dựa trên các điều kiện sau:
Chiến lược này xây dựng một hệ thống theo dõi xu hướng có nền tảng toán học vững chắc bằng cách kết hợp các đường Gaussian và chỉ số RSI ngẫu nhiên. Chiến lược hoạt động tốt trong thị trường có xu hướng rõ ràng, nhưng cần chú ý đến việc tối ưu hóa các tham số và thích ứng với môi trường thị trường. Bằng cách thực hiện các biện pháp tối ưu hóa được đề xuất, bạn có thể nâng cao hơn nữa sự ổn định và lợi nhuận của chiến lược.
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=5
strategy("Gaussian Channel + Stoch RSI Strategy", overlay=true, margin_long=100, margin_short=100, initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=1)
// User Inputs
length = input.int(20, "Gaussian Length", minval=5)
multiplier = input.float(2.0, "Channel Multiplier", step=0.1)
rsiLength = input.int(14, "RSI Length", minval=1)
stochLength= input.int(14, "Stoch RSI Length", minval=1)
kLength = input.int(3, "Stoch K Smoothing", minval=1)
dLength = input.int(3, "Stoch D Smoothing", minval=1)
// Gaussian Weighted Moving Average Function
f_gaussian(source, length) =>
half = (length - 1) / 2.0
sum = 0.0
norm = 0.0
// Gaussian standard deviation chosen as length/6 for a smooth curve
denom = (length / 6.0) * (length / 6.0)
for i = 0 to length - 1
x = i - half
w = math.exp(-(x * x) / (2 * denom))
sum += source[i] * w
norm += w
sum / norm
// Gaussian Weighted Standard Deviation Function
f_gaussian_std(source, length) =>
half = (length - 1) / 2.0
gavg = f_gaussian(source, length)
sum = 0.0
norm = 0.0
denom = (length / 6.0) * (length / 6.0)
for i = 0 to length - 1
x = i - half
w = math.exp(-(x * x)/(2*denom))
diff = source[i] - gavg
sum += diff * diff * w
norm += w
math.sqrt(sum/norm)
// Compute Gaussian Channel
gaussMid = f_gaussian(close, length)
gaussStd = f_gaussian_std(close, length)
gaussUpper = gaussMid + gaussStd * multiplier
gaussLower = gaussMid - gaussStd * multiplier
// Stochastic RSI Calculation
rsi = ta.rsi(close, rsiLength)
rsiLowest = ta.lowest(rsi, stochLength)
rsiHighest = ta.highest(rsi, stochLength)
stoch = 100 * (rsi - rsiLowest) / math.max(rsiHighest - rsiLowest, 1e-10)
k = ta.sma(stoch, kLength)
d = ta.sma(k, dLength)
// Conditions
// Long entry: Price closes above upper Gaussian line AND Stoch RSI K > D (stochastic is "up")
longCondition = close > gaussUpper and k > d
// Exit condition: Price closes below upper Gaussian line
exitCondition = close < gaussUpper
// Only trade in the specified date range
inDateRange = time >= timestamp("2018-01-01T00:00:00") and time < timestamp("2069-01-01T00:00:00")
// Submit Orders
if inDateRange
if longCondition and strategy.position_size <= 0
strategy.entry("Long", strategy.long)
if exitCondition and strategy.position_size > 0
strategy.close("Long")
// Plot Gaussian Channel
plot(gaussMid, "Gaussian Mid", color=color.new(color.yellow, 0))
plot(gaussUpper, "Gaussian Upper", color=color.new(color.green, 0))
plot(gaussLower, "Gaussian Lower", color=color.new(color.red, 0))