Chiến lược định lượng dựa trên chỉ số Stochastic Momentum và RSI


Ngày tạo: 2023-12-12 15:20:29 sửa đổi lần cuối: 2023-12-12 15:20:29
sao chép: 0 Số nhấp chuột: 1174
1
tập trung vào
1621
Người theo dõi

Chiến lược định lượng dựa trên chỉ số Stochastic Momentum và RSI

Tổng quan

Chiến lược này chủ yếu dựa trên Stochastic Momentum Index ((SMI) và chỉ số tương đối yếu ((RSI). Ngoài ra, bộ lọc màu và bộ lọc thực thể K-line được thêm vào như là các yếu tố phán đoán phụ. Dựa trên tín hiệu đa phẳng của chỉ số SMI và RSI, kết hợp với các điều kiện lọc phát ra tín hiệu giao dịch.

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

Trọng tâm của chiến lược này dựa vào hai chỉ số SMI và RSI để phán đoán. Trong đó, SMI chủ yếu đánh giá xem cổ phiếu có bị mua quá mức hay không, RSI đánh giá mức tương đối mạnh của cổ phiếu.

  1. SMI bán quá mức (< giới hạn thấp), được coi là tín hiệu mua
  2. RSI thấp hơn ngưỡng, được coi là tín hiệu mua
  3. Giao thức mua được tạo ra khi SMI bán quá mức và RSI đồng thời thấp hơn ngưỡng tương ứng
  4. Các tín hiệu đầu rỗng phán đoán logic tương tự như

Ngoài ra, chiến lược này cũng đặt chế độ hai tín hiệu. Mô hình này yêu cầu cả SMI và RSI phải phát tín hiệu đồng thời để giao dịch. Điều này có thể làm giảm hiệu quả tín hiệu giả.

Ngoài ra, chiến lược này cũng bổ sung một bộ lọc màu và bộ lọc thực thể K-line. Hai bộ lọc này yêu cầu thực thể K-line lớn hơn và giá đóng cửa của K-line cuối cùng cao hơn giá mở cửa. Điều này có thể tránh thêm các vụ phá vỡ giả mạo giao dịch.

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

  1. Sử dụng SMI để đánh giá xem có quá mua hay quá bán, đánh giá RSI tương đối mạnh, xác nhận kép có thể làm giảm tín hiệu sai
  2. Thiết lập chế độ hai tín hiệu, có thể giảm đáng kể các giao dịch vô hiệu
  3. Bộ lọc màu và bộ lọc thực thể K-đường có thể lọc hiệu quả xuyên qua giả
  4. Chiến lược vận hành logic rõ ràng và đơn giản
  5. Hầu hết các tham số đều có thể được tùy chỉnh

Chiến lược rủi ro và tối ưu hóa

  1. SMI và RSI có thể tạo ra nhiều tín hiệu giả khi được sử dụng như các chỉ số riêng lẻ và cần thận trọng
  2. Trong chế độ hai tín hiệu, nếu các tham số được đặt không đúng, bạn có thể bỏ lỡ cơ hội giao dịch tốt hơn
  3. Có thể kiểm tra lợi nhuận chiến lược theo các tham số khác nhau của chu kỳ để tìm kiếm sự kết hợp tốt nhất của tham số
  4. Cài đặt các tham số mốc cụ thể có thể được đánh giá thông qua mô phỏng hoặc đánh giá lại
  5. Có thể xem xét kết hợp nhiều chiến lược tối ưu hóa bộ lọc

Tóm tắt

Chiến lược này tích hợp các tín hiệu của cả hai chỉ số SMI và RSI để phát lệnh giao dịch thông qua xác nhận kép. Đồng thời, bộ lọc màu và bộ lọc thực thể K-line có thể lọc các đột phá giả.

Mã nguồn chiến lược
/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", 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")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(2018, defval = 2018, 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), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
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)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(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(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//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]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    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)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    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()