Chiến lược này sử dụng chỉ số WaveTrend để xác định xu hướng giá và tình huống mua quá mức / bán quá mức. Nó kết hợp chỉ số RSI để lọc tín hiệu và áp dụng phương pháp theo dõi xu hướng để thực hiện các hoạt động chống xu hướng ở mức mua quá mức / bán quá mức.
Chiến lược này sử dụng chỉ số WaveTrend để xác định hướng xu hướng giá. Chỉ số WaveTrend được cải thiện dựa trên chỉ số Rainbow. Nó đánh giá hướng xu hướng giá bằng cách tính toán sự khác biệt giữa đường trung bình động Heikin-Ashi và giá trị tuyệt đối của giá. Nó tạo ra các tín hiệu giao dịch bằng cách kết hợp chỉ số RSI để xác định tình huống mua quá mức / bán quá mức.
Cụ thể, công thức WaveTrend trong chiến lược là:
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)
Trong đó esa là đường trung bình di chuyển Heikin-Ashi được tính toán, d là trung bình của sự khác biệt giữa đường trung bình di chuyển Heikin-Ashi và giá trị tuyệt đối của giá. ci là cái gọi là phạm vi thích nghi, phản ánh sự biến động của giá. wt là đường trung bình di chuyển của ci, xác định hướng xu hướng giá và là chỉ số chính cho dài và ngắn.
Chỉ số RSI được sử dụng để xác định các tình huống mua quá mức / bán quá mức.
rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))
Giá trị tiêu chuẩn của nó là 0-100. trên 70 là mua quá mức và dưới 30 là bán quá mức.
Kết hợp với hai chỉ số này, khi RSI dưới 25 và WaveTrend dưới -60, nó được bán quá để mua dài. Khi RSI trên 75 và WaveTrend trên 60, nó được mua quá để mua ngắn.
Những lợi thế của chiến lược này bao gồm:
Ngoài ra còn có một số rủi ro:
Giải pháp:
Chiến lược có thể được tối ưu hóa theo các hướng sau:
Thay đổi hoặc thêm các chỉ số đánh giá để cải thiện độ chính xác tín hiệu, ví dụ như MACD, KD v.v.
Tối ưu hóa cài đặt tham số để điều chỉnh các sản phẩm khác nhau, ví dụ: điều chỉnh thời gian trơn tru.
Thêm các chiến lược dừng lỗ theo dõi để kiểm soát lỗ duy nhất, ví dụ: tỷ lệ dừng lỗ phần trăm, dừng lỗ kéo dài, v.v.
Xem xét các chiến lược kim tự tháp khác nhau, ví dụ: Martingale thay vì số lượng cố định.
Tối ưu hóa các tham số phạm vi thích nghi để cải thiện độ chính xác phán đoán.
Ý tưởng tổng thể của chiến lược là rõ ràng, sử dụng các chỉ số biến động để xác định xu hướng giá và lọc tiếng ồn một cách hiệu quả. Có không gian tối ưu hóa trong nhiều khía cạnh để làm cho chiến lược mạnh mẽ hơn. Thông qua điều chỉnh tham số, nó có thể được điều chỉnh cho các sản phẩm khác nhau và đáng để thử nghiệm trực tiếp hơn nữa.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's WaveTrender Strategy v1.0", shorttitle = "WaveTrender str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10) //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, %") showarr = input(true, defval = true, title = "Show Arrows") fromyear = input(2018, defval = 2018, 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") //RSI rsiup = rma(max(change(close), 0), 14) rsidown = rma(-min(change(close), 0), 14) rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown)) //WaveTrend esa = ema(hlc3, 10) d = ema(abs(hlc3 - esa), 10) ci = (hlc3 - esa) / (0.015 * d) wt = ema(ci, 21) //Body body = abs(close - open) abody = sma(body, 10) //Signals bar = close > open ? 1 : close < open ? -1 : 0 overs = rsi < 25 and wt < -60 overb = rsi > 75 and wt > 60 up1 = (strategy.position_size == 0 or close < strategy.position_avg_price) and overs and bar == -1 dn1 = (strategy.position_size == 0 or close > strategy.position_avg_price) and overb and bar == 1 exit = (strategy.position_size > 0 and overs == false) or (strategy.position_size < 0 and overb == false) //Arrows col = exit ? black : up1 or dn1 ? blue : na needup = up1 needdn = dn1 needexitup = exit and strategy.position_size < 0 needexitdn = exit and strategy.position_size > 0 plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0) plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0) plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0) plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0) //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 if strategy.position_size < 0 strategy.close_all() strategy.entry("Long", strategy.long, needlong == false ? 0 : lot) if dn1 if strategy.position_size > 0 strategy.close_all() strategy.entry("Short", strategy.short, needshort == false ? 0 : lot) if exit strategy.close_all()