Chiến lược này sử dụng hai chỉ số động lực ngẫu nhiên ((SMI và RSI) để phán đoán nhiều khoảng trống, được hỗ trợ bởi bộ lọc Martingale và bộ lọc cơ thể để lọc tín hiệu giao dịch, nhằm mục đích nắm bắt xu hướng đường ngắn và theo dõi biến động giá.
Chiến lược này sử dụng hai chỉ số động lực ngẫu nhiên là SMI và RSI để đánh giá dư thừa. SMI được tính toán thông qua chênh lệch giá thực và giá đóng cửa của đường K và có thể xác định hiệu quả các điểm đảo ngược. RSI được so sánh thông qua tỷ lệ dư thừa để xác định quá mua quá bán. Chiến lược này mua nhiều hơn khi SMI thấp hơn 50 và RSI thấp hơn 20 và mua nhiều hơn khi SMI cao hơn 50 và RSI cao hơn 80.
Để lọc các đột phá giả mạo, chiến lược cũng sử dụng 1⁄3 đường trung bình cơ thể 10 chu kỳ làm điều kiện lọc đột phá. Khi thực thể vượt qua 1⁄3 đường trung bình, thì việc đột phá được coi là có hiệu lực.
Ngoài ra, chiến lược này sử dụng chiến lược Martingale tùy chọn, tức là đặt cược theo tỷ lệ khi giao dịch thua lỗ, với hy vọng thu lại lỗ trước đó.
Backtest tính năng đánh giá hiệu quả của chiến lược bằng cách nhập thời gian bắt đầu và kết thúc.
Chiến lược này sử dụng cả hai chỉ số ngẫu nhiên và bộ lọc để xác định hiệu quả các điểm đảo ngược, nắm bắt xu hướng đường ngắn và theo dõi biến động giá.
Có thể giảm tỷ lệ xác suất của các đợt giảm giá bằng cách tối ưu hóa các tham số SMI và RSI. Sử dụng chiến lược Martingale một cách hợp lý, kiểm soát tỷ lệ và số lần đặt cược. Tùy thuộc vào tình hình thị trường, chọn bật bộ lọc để giảm tỷ lệ tín hiệu valid.
Chiến lược tổng hợp sử dụng chỉ số ngẫu nhiên đôi để bắt điểm đảo ngược, hỗ trợ lọc và theo dõi tín hiệu giao dịch bằng bộ lọc và Martingale, có thể xác định hiệu quả xu hướng đường ngắn, theo dõi biến động giá, phù hợp với các nhà đầu tư theo đuổi tỷ lệ thắng cao. Khi sử dụng chỉ số, hãy chú ý đến rủi ro của thị trường trì trệ và biến động, có thể kiểm soát rủi ro bằng cách tối ưu hóa tham số và dừng lỗ.
/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
// strategy(title = "CS Basic Scripts - Stochastic Special (Strategy)", shorttitle = "Stochastic Special", 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")
//Backtesting Input Range
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 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > 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()