Chiến lược này tạo ra các dải giá dựa trên sự biến động của giá, và tạo ra các tín hiệu giao dịch khi giá vượt qua các dải.
Chiến lược này đầu tiên tính toán phạm vi biến động trung bình của giá trong một khoảng thời gian nhất định, sau đó làm mịn phạm vi biến động bằng cách sử dụng một đường trung bình động theo cấp số nhân để tạo ra biến động mịn. Sự biến động mịn nhân với một hệ số cho ra phạm vi của các dải. Khi giá vượt qua dải trên, một tín hiệu mua được tạo ra. Khi giá vượt dưới dải dưới, một tín hiệu bán được tạo ra.
Cụ thể, biến động trơn tru (smrng) được tính bằng hàm trơn tru (smoothhrng). Băng hbăng trên và băng lbăng dưới của các dải giá sau đó được tính dựa trên smrng. Điều kiện dài longCondition và điều kiện ngắn shortCondition được thiết lập dựa trên điều đó. Khi longCondition được đáp ứng, một tín hiệu mua được tạo ra. Khi shortCondition được đáp ứng, một tín hiệu bán được tạo ra.
Những lợi thế của chiến lược này là:
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ả những thay đổi thị trường.
Làm mịn biến động với đường trung bình động theo cấp số nhân có thể lọc tiếng ồn và tạo ra các tín hiệu giao dịch đáng tin cậy hơn.
Phạm vi dải có thể được điều chỉnh thông qua hệ số biến động, làm cho chiến lược linh hoạt hơn.
Kết hợp với phán đoán đột phá, nó có thể nắm bắt các cơ hội giao dịch kịp thời khi xu hướng đảo ngược xảy ra.
Có một số rủi ro trong chiến lược này:
Trong sự biến động thị trường bất thường, sự biến động làm mịn có thể không phản ánh chính xác sự biến động thực tế, dẫn đến các tín hiệu sai. Các thông số có thể được tối ưu hóa để cải thiện mô hình.
Thiết lập phạm vi băng tần không chính xác có thể dẫn đến giao dịch quá mức hoặc tín hiệu không đủ. Các thông số khác nhau có thể được thử nghiệm để tìm phạm vi tối ưu.
Có sự chậm trễ trong tín hiệu đột phá, có thể gây ra việc nhập cảnh sớm hoặc nhập cảnh muộn.
Chiến lược có thể được tối ưu hóa thông qua:
Kiểm tra các chu kỳ dữ liệu giá khác nhau để tìm thời gian thích hợp nhất để tính biến động.
Thử các thuật toán trung bình động khác nhau như trung bình động cân nhắc.
Đưa ra khối lượng giao dịch hoặc các chỉ số khác để xác nhận tín hiệu đột phá.
Thiết lập stop loss hoặc trailing stop để kiểm soát lỗ cho mỗi giao dịch.
Tối ưu hóa hệ số biến động nhiều để xác định phạm vi băng tần tối ưu.
Lý thuyết tổng thể của chiến lược này là rõ ràng, sử dụng biến động giá để xây dựng các dải và đột phá giá để tạo ra các tín hiệu giao dịch, có thể theo dõi hiệu quả những thay đổi xu hướng thị trường.
/*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")