Chiến lược Động lực Chế độ Stochastic là một chiến lược giao dịch định lượng kết hợp Chỉ số Động lực Chế độ Stochastic (SMI) và Chỉ số Sức mạnh Tương đối (RSI). Nó sử dụng SMI để xác định các khu vực mua quá nhiều và bán quá nhiều trên thị trường, với chỉ số RSI nhanh hoạt động như một bộ lọc tín hiệu. Nó cũng thực hiện bộ lọc cơ thể để lựa chọn tín hiệu đáng tin cậy hơn.
Chỉ số Động lực Stochastic (SMI) là một chỉ số kỹ thuật phổ biến được sử dụng trong giao dịch định lượng kết hợp sức mạnh của các chỉ số động lực và dao động.
Cụ thể, SMI được tính như sau:
SMI = (Close - (HH + LL) /2)/(0.5*(HH - LL)) * 100
nơi HH là giá cao nhất trong N ngày qua và LL là giá thấp nhất.
Vì vậy, SMI kết hợp cả phán quyết theo xu hướng của động lực và phán quyết đảo ngược của dao động. Giá trị trên 80 được coi là mua quá mức, trong khi giá trị dưới 20 là bán quá mức. Chiến lược tạo ra tín hiệu giao dịch khi SMI đạt đến mức mua quá mức hoặc bán quá mức này.
Chỉ số sức mạnh tương đối (RSI) là một chỉ số tiêu chuẩn mua quá mức / bán quá mức. Chiến lược này sử dụng chỉ số RSI nhanh với khoảng thời gian 7 để đánh giá các điều kiện mua quá mức / bán quá mức ngắn hạn.
Các bài đọc dưới 20 được coi là đã bán quá mức, trong khi những người trên 80 được coi là đã mua quá mức theo chỉ số RSI nhanh.
Chiến lược này cũng thực hiện bộ lọc cơ thể bằng cách kiểm tra kích thước cơ thể nến để lọc các tín hiệu nhất định.
Điều này lọc ra một số tín hiệu sai và tăng độ tin cậy.
Cách tiếp cận này kết hợp SMI, RSI nhanh và bộ lọc cơ thể thành một hệ thống 3 phần mạnh mẽ. Sử dụng nhiều tín hiệu tích hợp cải thiện độ chính xác và tăng tính ổn định.
Cả SMI và chỉ số RSI nhanh đều rất tốt để phát hiện xu hướng cạn kiệt. Bằng cách giao dịch đảo ngược trung bình từ các khu vực bị kéo dài quá mức này, chiến lược tuân thủ mua thấp và bán cao.
Khả năng mua cả giảm và tăng ngắn tối đa hóa cơ hội trong các điều kiện thị trường.
Bộ lọc cơ thể tránh chém bằng cách từ chối tín hiệu ít thuyết phục trong các điều kiện hỗn độn.
Chuyển đổi thường xuyên dài / ngắn mang lại rủi ro whipsaw. tối ưu hóa logic có thể giảm thiểu điều này.
Các tín hiệu có thể tập hợp các thành viên thị trường và thúc đẩy sự đảo ngược nhanh chóng khi nhập cảnh.
Các sự kiện cực đoan có thể đảo ngược tất cả các mô hình.
Thử nghiệm các khoảng thời gian SMI / RSI khác nhau và ngưỡng bộ lọc cơ thể có thể tiết lộ các giá trị tối ưu cho lợi nhuận cao hơn.
Việc kết hợp các điểm dừng dựa trên biến động hoặc ATR sẽ chứa tốt hơn rủi ro vị trí và danh mục đầu tư.
Các mô hình dự đoán mức chỉ số trong tương lai có thể xác định các bước ngoặt sớm hơn. Điều này sẽ tăng cường sức dự đoán.
Tóm lại, bằng cách tích hợp SMI, RSI nhanh và bộ lọc cơ thể, chiến lược này đã tạo ra một hệ thống mua quá mức / bán quá mức khá toàn diện. Cách tiếp cận đa tín hiệu cải thiện độ chính xác, trong khi khả năng giao dịch hai chiều và kiểm soát rủi ro góp phần cân bằng. Với tối ưu hóa tham số và mô hình liên tục, nó cho thấy hứa hẹn để nắm bắt lợi nhuận trong dài hạn.
/*backtest start: 2023-12-22 00:00:00 end: 2024-01-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0) //Settings needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usemar = input(false, defval = false, title = "Use Martingale") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %") usesmi = input(true, defval = true, title = "Use SMI Strategy") usersi = input(true, defval = true, title = "Use RSI Strategy") usebod = input(true, defval = true, title = "Use Body-Filter") a = input(5, "SMI Percent K Length") b = input(3, "SMI Percent D Length") limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit") fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") //Fast RSI fastup = rma(max(change(close), 0), 7) fastdown = rma(-min(change(close), 0), 7) fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown)) //Stochastic Momentum Index ll = lowest (low, a) hh = highest (high, a) diff = hh - ll rdiff = close - (hh+ll)/2 avgrel = ema(ema(rdiff,b),b) avgdiff = ema(ema(diff,b),b) SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0 SMIsignal = ema(SMI,b) //Lines plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index") plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line") plot(limit, color = black, title = "Over Bought") plot(-1 * limit, color = black, title = "Over Sold") plot(0, color = blue, title = "Zero Line") //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Signals up1 = SMIsignal < -1 * limit and close < open and body and usesmi dn1 = SMIsignal > limit and close > open and body and usesmi up2 = fastrsi < 20 and close < open and body and usersi dn2 = fastrsi > 80 and close > open and body and usersi exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //Trading profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1] mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1 lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1] if up1 or up2 if strategy.position_size < 0 strategy.close_all() strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if dn1 or dn2 if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59))) if time > timestamp(toyear, tomonth, today, 23, 59) or exit strategy.close_all()