Chiến lược sàng lọc chỉ báo động lượng ngẫu nhiên kép


Ngày tạo: 2023-10-07 16:45:25 sửa đổi lần cuối: 2023-10-07 16:45:25
sao chép: 0 Số nhấp chuột: 736
1
tập trung vào
1617
Người theo dõi

Tổng quan

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á.

Nguyên tắc chiến lược

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 13 đườ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 13 đườ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.

Phân tích lợi thế

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á.

  • SMI có khả năng nhận diện điểm đảo chiều, có thể xác định hiệu quả quá mua quá bán
  • RSI được sử dụng để ngăn chặn sự thiếu hụt
  • Bộ lọc cơ thể loại bỏ đột phá giả, cải thiện độ chính xác tín hiệu
  • Có thể chọn chiến lược truy đuổi Martingale, có thể thu hồi một phần tổn thất

Phân tích rủi ro

  • SMI và RSI là các chỉ số bị tụt hậu, có nguy cơ bị chậm tín hiệu
  • Martingale có nguy cơ tăng tốc lỗ
  • Trong một thị trường chấn động lớn, bộ lọc sẽ lọc ra một số tín hiệu hợp lệ.

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.

Hướng tối ưu hóa

  • Tối ưu hóa sự kết hợp của các tham số SMI và RSI để tìm ra kết quả quyết định tốt nhất
  • Điều chỉnh tham số bộ lọc để giảm khả năng của tín hiệu valid
  • Tối ưu hóa số lần và tỷ lệ đặt cược của Martingale
  • Kết hợp các chỉ số xu hướng để tránh đảo ngược
  • Tăng chiến lược dừng lỗ, kiểm soát lỗ đơn

Tóm tắt

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ỗ.

Mã nguồn chiến lược
/*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()