
Chiến lược này sử dụng chỉ số WaveTrend để đánh giá xu hướng giá và quá mua quá bán, kết hợp với các tín hiệu lọc của chỉ số RSI, sử dụng phương pháp theo dõi xu hướng để thực hiện hoạt động đảo ngược ở vị trí quá mua quá bán.
Chiến lược này sử dụng chỉ số WaveTrend để xác định xu hướng giá. Chỉ số WaveTrend dựa trên chỉ số Rainbow được cải thiện để xác định xu hướng giá bằng cách tính toán chênh lệch giữa đường trung bình Heikin-Ashi và giá trị tuyệt đối.
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 Heikin-Ashi được tính toán, d là giá trị trung bình của sự khác biệt giữa đường trung bình Heikin-Ashi và giá trị tuyệt đối.
Chỉ số RSI được sử dụng để đánh giá quá mua quá bán. Công thức tính toán RSI trong mã là:
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))
Mức tiêu chuẩn là 0-100; cao hơn 70 là vùng mua quá mức, thấp hơn 30 là vùng bán quá mức.
Kết hợp cả hai chỉ số này, khi RSI thấp hơn 25, WaveTrend thấp hơn 60 là vùng bán quá mức, báo hiệu nhiều; khi RSI cao hơn 75, WaveTrend cao hơn 60 là vùng mua quá mức, báo hiệu ngắn.
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Phản ứng:
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Thay thế chỉ số phán đoán hoặc tăng chỉ số phán đoán, tối ưu hóa độ chính xác của tín hiệu. Ví dụ như thêm các chỉ số phán đoán như MACD, KD.
Tối ưu hóa các thiết lập tham số để phù hợp với các loại giao dịch khác nhau. Ví dụ: điều chỉnh chu kỳ mài mòn để tìm kiếm sự kết hợp tham số tốt nhất.
Tham gia theo dõi chiến lược dừng lỗ để kiểm soát hiệu quả các tổn thất đơn lẻ. Ví dụ như dừng phần trăm số dư, dừng di chuyển, v.v.
Xem xét các chiến lược đặt hàng khác nhau. Ví dụ: sử dụng đặt hàng Martingale thay vì đặt hàng số lượng cố định ban đầu.
Tối ưu hóa các tham số trong phạm vi thích ứng, tìm các tham số tối ưu để tăng độ chính xác phán đoán.
Chiến lược này có tư duy tổng thể rõ ràng, sử dụng chỉ số cường độ dao động để đánh giá xu hướng giá và lọc hiệu quả tín hiệu giao dịch tiếng ồn. Có nhiều không gian để tối ưu hóa chiến lược, có thể cải thiện từ nhiều góc độ, làm cho chiến lược ổn định và đáng tin cậy hơn. Có thể tối ưu hóa thông qua điều chỉnh tham số, thích ứng với các loại giao dịch khác nhau, đáng để kiểm tra thực tế 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()