Chiến lược chỉ số hai động lượng Stochastic

Tác giả:ChaoZhang, Ngày: 2023-10-07 16:45:25
Tags:

Tổng quan

Chiến lược này sử dụng các chỉ số động lực stochastic kép (SMI và RSI) cho các tín hiệu dài và ngắn, cùng với bộ lọc martingale và cơ thể để lựa chọn tín hiệu giao dịch, nhằm nắm bắt xu hướng trung hạn và biến động giá.

Chiến lược logic

Chiến lược đánh giá dài và ngắn sử dụng hai chỉ số ngẫu nhiên SMI và RSI. SMI được tính dựa trên trung bình động của phạm vi thanh và giá đóng, tốt trong việc xác định các điểm đảo ngược. RSI so sánh sức mạnh bò và gấu để xác định tình trạng mua quá mức và bán quá mức. Chiến lược dài khi SMI dưới -50 và RSI dưới 20; ngắn khi SMI trên 50 và RSI trên 80.

Để lọc các đột phá giả, chiến lược cũng sử dụng 1/3 của SMA cơ thể 10 giai đoạn như điều kiện lọc đột phá.

Ngoài ra, chiến lược sử dụng martingale tùy chọn, đó là mở rộng số lượng giao dịch thua lỗ, cố gắng phục hồi lỗ trước đó.

Chức năng kiểm tra lại kiểm tra lại chiến lược bằng cách nhập một phạm vi ngày.

Phân tích lợi thế

Chiến lược kết hợp hai chỉ số và bộ lọc ngẫu nhiên, có khả năng xác định hiệu quả các điểm đảo ngược, nắm bắt xu hướng trung hạn và theo dõi biến động giá.

  • SMI có khả năng nhận diện điểm đảo ngược mạnh mẽ và có thể xác định các điều kiện mua quá mức và bán quá mức một cách hiệu quả.
  • Thêm RSI tránh bỏ lỡ giao dịch.
  • Bộ lọc cơ thể sẽ loại bỏ các sự đột phá giả và cải thiện độ chính xác tín hiệu.
  • Chiến lược martingale tùy chọn cho phép khôi phục một phần tổn thất.

Phân tích rủi ro

  • Là các chỉ số tụt hậu, SMI và RSI có rủi ro theo đuổi mức cao và giết chết mức thấp.
  • Martingale mang lại rủi ro tăng lỗ.
  • Các bộ lọc có thể lọc ra một số tín hiệu hợp lệ trong các thị trường khác nhau.

Rủi ro có thể được giảm thiểu bằng cách tối ưu hóa các thông số SMI và RSI để giảm xác suất truy đuổi / giết người, sử dụng martingale một cách chiến lược bằng cách kiểm soát tỷ lệ và thời gian mở rộng quy mô và cho phép lọc theo quyết định dựa trên điều kiện thị trường.

Hướng dẫn tối ưu hóa

  • Tối ưu hóa các thông số SMI và RSI để có hiệu quả đánh giá tốt nhất.
  • Điều chỉnh các thông số bộ lọc để giảm xác suất lọc tín hiệu hợp lệ.
  • Tối ưu hóa thời gian và tỷ lệ mở rộng Martingale.
  • Bao gồm các chỉ số xu hướng để tránh giao dịch chống lại xu hướng.
  • Thêm stop loss để giới hạn lỗ trên các giao dịch đơn.

Tóm lại

Chiến lược này kết hợp các chỉ số chứng khoán kép để nắm bắt các điểm đảo ngược, với các bộ lọc và martingale để lựa chọn và theo đuổi tín hiệu giao dịch. Nó có thể xác định hiệu quả xu hướng trung hạn và 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. Chú ý đến rủi ro thị trường chậm trễ và dao động, quản lý 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()

Thêm nữa