Ý tưởng chính của chiến lược này là sử dụng bộ lọc Ehlers SuperSmoother để xử lý chỉ số RSI Chứng khoán, lọc ra nhiều tín hiệu sai và có được các tín hiệu giao dịch đáng tin cậy hơn. Nguyên tắc cơ bản là đầu tiên tính toán chỉ số RSI Chứng khoán, sau đó sử dụng bộ lọc Ehlers SuperSmoother để làm mịn nó, và cuối cùng đi dài hoặc ngắn dựa trên sự chéo giữa nó và đường trung bình động của nó.
Các hướng tối ưu hóa chính cho chiến lược này là:
Tối ưu hóa các thiết lập tham số. Tối ưu hóa các tham số như chiều dài và ổn định mịn của Stochastic RSI thông qua backtesting rộng rãi.
Thêm cơ chế dừng lỗ. Thiết lập lệnh dừng hoặc lệnh chờ để khóa lợi nhuận và giảm rút tiền.
Kết hợp với các chỉ số hoặc mô hình khác. Xem xét kết hợp với các chỉ số biến động, đường trung bình động vv để thêm nhiều điều kiện lọc và giảm thêm rủi ro.
Điều chỉnh kích thước vị trí dựa trên phân tích khung thời gian dài hơn. Điều chỉnh động kích thước vị trí của mỗi giao dịch dựa trên kết quả phân tích xu hướng từ khung thời gian dài hơn.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("ES Stoch RSI Strategy [krypt]", overlay=true, calc_on_order_fills=true, calc_on_every_tick=true, initial_capital=10000, currency='USD') //Backtest Range FromMonth = input(defval = 06, title = "From Month", minval = 1) FromDay = input(defval = 1, title = "From Day", minval = 1) FromYear = input(defval = 2018, title = "From Year", minval = 2014) ToMonth = input(defval = 7, title = "To Month", minval = 1) ToDay = input(defval = 30, title = "To Day", minval = 1) ToYear = input(defval = 2018, title = "To Year", minval = 2014) PI = 3.14159265359 drop1st(src) => x = na x := na(src[1]) ? na : src xlowest(src, len) => x = src for i = 1 to len - 1 v = src[i] if (na(v)) break x := min(x, v) x xhighest(src, len) => x = src for i = 1 to len - 1 v = src[i] if (na(v)) break x := max(x, v) x xstoch(c, h, l, len) => xlow = xlowest(l, len) xhigh = xhighest(h, len) 100 * (c - xlow) / (xhigh - xlow) Stochastic(c, h, l, length) => rawsig = xstoch(c, h, l, length) min(max(rawsig, 0.0), 100.0) xrma(src, len) => sum = na sum := (src + (len - 1) * nz(sum[1], src)) / len xrsi(src, len) => msig = nz(change(src, 1), 0.0) up = xrma(max(msig, 0.0), len) dn = xrma(max(-msig, 0.0), len) rs = up / dn 100.0 - 100.0 / (1.0 + rs) EhlersSuperSmoother(src, lower) => a1 = exp(-PI * sqrt(2) / lower) coeff2 = 2 * a1 * cos(sqrt(2) * PI / lower) coeff3 = -pow(a1, 2) coeff1 = (1 - coeff2 - coeff3) / 2 filt = na filt := nz(coeff1 * (src + nz(src[1], src)) + coeff2 * filt[1] + coeff3 * filt[2], src) smoothK = input(7, minval=1, title="K") smoothD = input(2, minval=1, title="D") lengthRSI = input(10, minval=1, title="RSI Length") lengthStoch = input(3, minval=1, title="Stochastic Length") showsignals = input(true, title="Buy/Sell Signals") src = input(close, title="Source") ob = 80 os = 20 midpoint = 50 price = log(drop1st(src)) rsi1 = xrsi(price, lengthRSI) rawsig = Stochastic(rsi1, rsi1, rsi1, lengthStoch) sig = EhlersSuperSmoother(rawsig, smoothK) ma = sma(sig, smoothD) plot(sig, color=#0094ff, title="K", transp=0) plot(ma, color=#ff6a00, title="D", transp=0) lineOB = hline(ob, title="Upper Band", color=#c0c0c0) lineOS = hline(os, title="Lower Band", color=#c0c0c0) fill(lineOB, lineOS, color=purple, title="Background") // Buy/Sell Signals // use curvature information to filter out some false positives mm1 = change(change(ma, 1), 1) mm2 = change(change(ma, 2), 2) ms1 = change(change(sig, 1), 1) ms2 = change(change(sig, 2), 2) sellsignals = showsignals and (mm1 + ms1 < 0 and mm2 + ms2 < 0) and crossunder(sig, ma) and sig[1] > ob buysignals = showsignals and (mm1 + ms1 > 0 and mm2 + ms2 > 0) and crossover(sig, ma) and sig[1] < os ploff = 4 plot(buysignals ? sig[1] - ploff : na, style=circles, color=#008fff, linewidth=3, title="Buy Signal", transp=0) plot(sellsignals ? sig[1] + ploff : na, style=circles, color=#ff0000, linewidth=3, title="Sell Signal", transp=0) longCondition = buysignals if (longCondition) strategy.entry("L", strategy.long, comment="Long", when=(buysignals)) shortCondition = sellsignals if (shortCondition) strategy.entry("S", strategy.short, comment="Short", when=(sellsignals))