
Chiến lược này dựa trên sự biến động trơn của giá, tạo ra các vùng mục tiêu giá và tạo ra tín hiệu giao dịch khi giá vượt qua vùng mục tiêu.
Chiến lược này bắt đầu bằng cách tính toán độ dao động trung bình của giá trong một chu kỳ nhất định, sau đó xử lý độ dao động bằng các đường trung bình di chuyển theo chỉ số để tạo ra tỷ lệ dao động trơn. Tỷ lệ dao động trơn nhân với một hệ số, sẽ có phạm vi của vùng mục tiêu. Khi giá phá vỡ mục tiêu, tạo ra tín hiệu mua; Khi giá phá vỡ mục tiêu, tạo ra tín hiệu bán.
Cụ thể, trong chiến lược tính toán tỷ lệ biến động mịn smrng thông qua hàm smoothrng, sau đó tính toán hband và lband theo đường ray trên và dưới của vùng mục tiêu dựa trên giá trị smrng. Trên cơ sở này, thiết lập điều kiện longCondition và điều kiện shortCondition. Khi điều kiện dài được đáp ứng, tạo ra tín hiệu mua; Khi điều kiện ngắn được đáp ứng, tạo ra tín hiệu bán.
Chiến lược này có những ưu điểm sau:
Sử dụng biến động giá để xây dựng tín hiệu giao dịch, có thể theo dõi hiệu quả sự thay đổi của thị trường.
Thông qua chỉ số biến động trung bình di chuyển, có thể lọc tiếng ồn, tạo ra tín hiệu giao dịch đáng tin cậy hơn.
Phạm vi mục tiêu có thể được điều chỉnh thông qua hệ số dao động, làm cho chiến lược linh hoạt hơn.
Kết hợp với sự phá vỡ giá, bạn có thể nắm bắt cơ hội giao dịch kịp thời khi xu hướng thay đổi.
Chiến lược này cũng có một số rủi ro:
Khi thị trường biến động bất thường, tỷ lệ biến động trơn có thể không phản ánh chính xác sự biến động thực tế, dẫn đến tín hiệu sai. Mô hình có thể được tối ưu hóa bằng cách điều chỉnh tham số.
Phạm vi mục tiêu nếu thiết lập không đúng, có thể dẫn đến tần số giao dịch quá cao hoặc tín hiệu không đầy đủ. Các tham số khác nhau có thể được thử nghiệm để tìm phạm vi tối ưu.
Đánh giá tín hiệu đột phá có sự trễ thời gian, có thể dẫn đến nhập cảnh quá sớm hoặc quá muộn. Có thể được xác nhận kết hợp với các chỉ số khác.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Kiểm tra các chu kỳ dữ liệu giá khác nhau để tìm các tham số chu kỳ phù hợp nhất để tính toán tỷ lệ dao động.
Thử các thuật toán trung bình di chuyển khác nhau, chẳng hạn như trung bình di chuyển có trọng lượng tuyến tính.
Ghi lại số lượng giao dịch hoặc các chỉ số khác để xác nhận tín hiệu phá vỡ.
Cài đặt điểm dừng hoặc trailing stop để kiểm soát lỗ hổng đơn.
Tối ưu hóa giá trị của hệ số biến động mult để xác định phạm vi băng tần mục tiêu tối ưu.
Chiến lược này có ý tưởng tổng thể rõ ràng, xây dựng vùng mục tiêu thông qua biến động giá, sử dụng đột phá giá để tạo tín hiệu giao dịch, có thể theo dõi hiệu quả xu hướng thay đổi thị trường. Tuy nhiên, cũng có một số không gian cải tiến, có thể làm cho chiến lược ổn định và đáng tin cậy hơn thông qua các phương tiện tối ưu hóa tham số, giới thiệu các chỉ số xác nhận.
/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)
// Source
src = input(defval=close, title="Source")
// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")
// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")
// Smooth Average Range
smoothrng(x, t, m) =>
wper = (t * 2) - 1
avrng = ema(abs(x - x[1]), t)
smoothrng = ema(avrng, wper) * m
smoothrng
smrng = smoothrng(src, per, mult)
// Range Filter
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
rngfilt
filt = rngfilt(src, smrng)
// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
// Target Bands
hband = filt + smrng
lband = filt - smrng
// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)
strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)
// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")
// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")
// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)
// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")