Chiến lược này tạo ra các tín hiệu giao dịch dựa trên phạm vi biến động lịch sử của giá. Nó tính toán sự khác biệt giữa giá cao nhất và thấp nhất trong một khoảng thời gian nhất định, và tạo thành một phạm vi biến động bằng cách sử dụng đường trung bình động.
Chỉ số cốt lõi là sự biến động lịch sử của giá.
Tính toán sự khác biệt giữa giá cao nhất và giá thấp nhất trong N thanh trước đây, được gọi là HL
Tính toán trung bình của giá cao nhất và thấp nhất trên N thanh, trung bình (H, L)
Độ biến động = HL / trung bình ((H, L)
N là tham số
Sau khi lấy biến động, các dải được tính như sau:
Dải trên = Khóa hiện tại + Khóa hiện tại * Sự biến động
Phạm vi dưới = Khóa hiện tại - Khóa hiện tại * Sự biến động
Các dải sau đó được làm mịn bởi WMA với khoảng thời gian được đặt là
Khi giá phá vỡ trên dải trên, đi dài. Khi giá phá vỡ dưới dải dưới, đi ngắn.
Các tín hiệu thoát được xác định bằng
Nếu loại thoát là MA biến động, thoát khi giá vượt xuống dưới WMA.
Nếu loại Exit là Range Crossover, thoát khi giá vượt xuống dưới các dải.
Các rủi ro có thể được giảm bằng cách:
Chiến lược có thể được cải thiện bằng cách:
Kiểm tra các giá trị Length khác nhau để tìm kết hợp tối ưu.
Ví dụ, khi giá phá vỡ trên dải trên, hãy kiểm tra xem MACD cũng có chéo vàng không.
Tối ưu hóa để dừng lại sau thay vì dừng lại đơn giản.
Thiết lập các quy tắc nhập lại để bắt lại xu hướng sau khi dừng lại.
Điều chỉnh động kích thước dựa trên biến động thị trường.
Chiến lược này hoạt động tốt cho các thị trường xu hướng nói chung bằng cách sử dụng các băng tần dựa trên biến động để đánh giá sức mạnh xu hướng và WMA để tạo ra các phạm vi giao dịch đáng tin cậy cho các tín hiệu đột phá.
/*backtest start: 2023-09-13 00:00:00 end: 2023-09-20 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © wbburgin //@version=5 strategy("Volatility Range Breakout Strategy [wbburgin]", shorttitle = "VRB Strategy [wbburgin]", overlay=true, pyramiding=20,max_bars_back=2000,initial_capital=10000) wma(float priceType,int length,float weight) => norm = 0.0 sum = 0.0 for i = 0 to length - 1 norm := norm + weight sum := sum + priceType[i] * weight sum / norm // This definition of volatility uses the high-low range divided by the average of that range. volatility(source,length) => h = ta.highest(source,length) l = ta.lowest(source,length) vx = 2 * (h - l) / (h + l) vx vm1 = input.int(100,"Average Length") volLen = input.int(100,"Volatility Length") vsrc = input.source(close,"Volatility Source") cross_type = input.source(close,"Exit Source") exit_type = input.string("Volatility MA",options=["Volatility MA","Range Crossover"],title="Exit Type") volatility = volatility(vsrc,volLen) highband1 = close + (close * volatility) lowband1 = close - (close * volatility) hb1 = wma(highband1,vm1,volatility) lb1 = wma(lowband1,vm1,volatility) hlavg = math.avg(hb1,lb1) upcross = ta.crossover(high,hb1) //Crossing over the high band of historical volatility signifies a bullish breakout dncross = ta.crossunder(low,lb1) //Crossing under the low band of historical volatility signifies a bearish breakout vlong = upcross vshort = dncross vlong_exit = switch exit_type == "Volatility MA" => ta.crossunder(cross_type,hlavg) exit_type == "Range Crossover" => ta.crossunder(cross_type,hb1) vshort_exit = switch exit_type == "Volatility MA" => ta.crossover(cross_type,hlavg) exit_type == "Range Crossover" => ta.crossover(cross_type,lb1) if vlong strategy.entry("Long",strategy.long) if vlong_exit strategy.close("Long") if vshort strategy.entry("Short",strategy.short) if vshort_exit strategy.close("Short") plot(hlavg,color=color.white,title="Weighted Volatility Moving Average") t = plot(hb1,color=color.new(color.red,50),title="Volatility Reversal Band - Top") b = plot(lb1,color=color.new(color.green,50),title="Volatility Reversal Band - Bottom") alertcondition(vlong,"Volatility Long Entry Signal") alertcondition(vlong_exit,"Volatility Long Exit Signal") alertcondition(vshort,"Volatility Short Entry Signal") alertcondition(vshort_exit,"Volatility Short Exit Signal") fill(t,b,color=color.new(color.aqua,90))