
Chiến lược dao động động là một chiến lược giao dịch định lượng kết hợp các chỉ số động cơ ngẫu nhiên và các chỉ số tương đối mạnh. Chiến lược này sử dụng các chỉ số động cơ ngẫu nhiên để xác định khu vực quá mua quá bán của thị trường, kết hợp với các tín hiệu lọc RSI nhanh, sau đó chọn tín hiệu giao dịch đáng tin cậy hơn bằng cách lọc thực thể.
Chỉ số động lực ngẫu nhiên (SMI) là một chỉ số kỹ thuật thường được sử dụng trong giao dịch định lượng, nó kết hợp các ưu điểm của chỉ số động lực và chỉ số dao động.
Cụ thể, công thức tính toán của SMI là:
SMI = (Close - (HH + LL)/2)/(0.5*(HH - LL)) * 100
Trong đó, HH là giá cao nhất trong vòng N ngày và LL là giá thấp nhất trong vòng N ngày.
Bằng cách này, SMI kết hợp sự phán đoán xu hướng động lực và sự phán đoán đảo ngược của chấn động. Khi SMI cao hơn 80 là mua quá mức và thấp hơn 20 là bán quá mức. Chiến lược sẽ phát ra tín hiệu giao dịch trong khu vực mua quá mức.
Chỉ số tương đối mạnh (RSI) là một chỉ số bán tháo thường được sử dụng. Chiến lược này sử dụng RSI nhanh với chu kỳ 7 để đánh giá tình trạng mua tháo trong thời gian ngắn.
Khi RSI nhanh thấp hơn 20 là bán quá mức, cao hơn 80 là mua quá mức. Chiến lược sẽ phát ra tín hiệu giao dịch ở khu vực mua quá mức.
Chiến lược này cũng thêm vào bộ lọc thực thể, để lọc một phần tín hiệu bằng cách tính toán kích thước của thực thể K-line. Chỉ khi thực thể K-line vượt quá một ngưỡng nhất định, tín hiệu giao dịch sẽ được phát ra.
Điều này có thể lọc ra một số tín hiệu giả và tăng độ tin cậy của tín hiệu.
Chiến lược này kết hợp ba phần: chỉ số động cơ ngẫu nhiên, chỉ số RSI nhanh và bộ lọc thực thể. Bằng cách kết hợp nhiều chỉ số, bạn có thể cải thiện độ chính xác của tín hiệu và tăng cường sự ổn định của chiến lược.
Các chỉ số động cơ ngẫu nhiên và chỉ số RSI nhanh có thể xác định chính xác tình trạng quá mua quá bán của thị trường, chiến lược mở vị trí trong khu vực quá mua quá bán, tuân theo nguyên tắc giao dịch mua thấp, bán cao.
Chiến lược này cho phép giao dịch hai chiều với nhiều đầu và đầu trống, để nắm bắt tối đa các cơ hội giao dịch trên thị trường.
Thêm bộ lọc vật lý, có thể lọc ra hầu hết tiếng ồn, tránh bị mắc kẹt trong các trường hợp rung động.
Chiến lược giao dịch hai chiều, chuyển đổi nhiều đầu trống thường xuyên là một điểm rủi ro tiềm ẩn. Lập luận mở vị trí tối ưu hóa thích hợp có thể làm giảm rủi ro này.
Khi chỉ số đưa ra tín hiệu, có thể tập hợp một lượng lớn các nhà giao dịch theo dõi trong một thời gian ngắn, dẫn đến rủi ro đảo ngược thị trường. Bạn có thể giảm rủi ro này bằng cách tối ưu hóa các tham số chỉ số.
Trong trường hợp cực đoan, tất cả các mô hình có thể bị hỏng. Điều này cần phải kiểm soát rủi ro này bằng cách thiết lập lỗ hổng hợp lý.
Bạn có thể thử nghiệm các kết hợp các tham số khác nhau, chẳng hạn như chu kỳ SMI, chu kỳ RSI, ngưỡng lọc thực thể, để tìm các tham số tối ưu để tăng tỷ lệ lợi nhuận của chiến lược.
Thiết lập cơ chế dừng động dựa trên ATR hoặc biến động có thể kiểm soát tốt hơn rủi ro cá nhân và tổng thể.
Tiếp theo, đưa ra thuật toán học máy để dự đoán xu hướng tương lai của giá trị chỉ số thông qua mô hình. Điều này có thể xác định trước điểm biến đổi của chỉ số, tăng cường tính tiên tiến của chiến lược.
Nói chung, chiến lược này kết hợp các chỉ số động cơ ngẫu nhiên, các chỉ số RSI nhanh và bộ lọc thực thể, để thực hiện một hệ thống phán đoán mua quá mức và bán quá mức. Sự kết hợp nhiều chỉ số làm tăng độ chính xác của tín hiệu, giao dịch hai chiều và cơ chế kiểm soát rủi ro cũng làm cho chiến lược cân bằng hơn. Bằng cách tiếp tục tối ưu hóa các tham số và mô hình, chiến lược này có khả năng thu được tỷ lệ lợi nhuận tốt 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()