Chỉ số Động lực Stochastic và Chiến lược giao dịch lượng dựa trên RSI

Tác giả:ChaoZhang, Ngày: 2023-12-12 15:20:29
Tags:

img

Tổng quan

Chiến lược này chủ yếu dựa trên hai chỉ số - Stochastic Momentum Index (SMI) và Relative Strength Index (RSI). Nó cũng kết hợp bộ lọc màu sắc và bộ lọc thân nến như các điều kiện phán đoán phụ trợ.

Chiến lược logic

Chiến lược này dựa trên các chỉ số SMI và RSI để đánh giá. SMI chủ yếu đánh giá liệu một cổ phiếu có bị mua quá mức hay bán quá mức, trong khi RSI xác định sức mạnh tương đối của một cổ phiếu. Khi cả hai chỉ số cung cấp tín hiệu mua cùng một lúc, một hành động mua sẽ được kích hoạt.

  1. Khi SMI được bán quá mức (dưới giới hạn dưới), nó được coi là tín hiệu mua
  2. Khi RSI dưới ngưỡng, nó được coi là tín hiệu mua
  3. Khi cả SMI quá bán và RSI dưới ngưỡng tương ứng xảy ra, một tín hiệu mua được kích hoạt
  4. Logic tín hiệu bán cũng tương tự.

Ngoài ra, chiến lược này có chế độ tín hiệu kép. Chế độ này đòi hỏi cả tín hiệu SMI và RSI để kích hoạt bất kỳ giao dịch nào. Điều này có thể giảm hiệu quả các tín hiệu sai.

Ngoài ra, bộ lọc màu và bộ lọc thân nến được kết hợp. Các bộ lọc này đòi hỏi thân nến tương đối lớn và nến cuối cùng đóng cao hơn mở. Điều này có thể tránh thêm việc giao dịch phá vỡ sai.

Ưu điểm

  1. Sử dụng SMI cho quá mua / quá bán và RSI cho sức mạnh tương đối, xác nhận kép có thể giảm tín hiệu sai
  2. Chế độ tín hiệu kép có thể làm giảm đáng kể các giao dịch không hiệu quả
  3. Màu sắc và bộ lọc cơ thể có thể lọc ra các sự đột phá giả hiệu quả
  4. Chiến lược logic đơn giản và rõ ràng
  5. Hầu hết các tham số có thể tùy chỉnh

Rủi ro và tối ưu hóa

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

Tóm lại

Chiến lược này tích hợp các tín hiệu từ cả chỉ số SMI và RSI và tạo ra lệnh giao dịch thông qua xác nhận kép. Bộ lọc màu sắc và bộ lọc thân nến cũng được thực hiện để lọc ra các đột phá sai. Chiến lược có luồng logic đơn giản và sạch sẽ, và hầu hết các tham số có thể tùy chỉnh. Có thể đạt được lợi nhuận tốt hơn bằng cách điều chỉnh các tham số cho phù hợp.


/*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()

Thêm nữa