Chiến lược tín hiệu mua bán lọc phạm vi là một chiến lược giao dịch định lượng rất thực tế. Nó sử dụng phạm vi biến động giá để lọc tín hiệu mua và bán, giảm tín hiệu sai trong thị trường biến động thấp và cải thiện chất lượng tín hiệu trong thị trường biến động cao. Tên chiến lược tóm tắt chính xác chức năng chính của chiến lược.
Chiến lược đầu tiên tính toán phạm vi biến động của giá tài sản trong một khoảng thời gian nhất định. Cụ thể, nó tính toán sự khác biệt giữa giá cao nhất và giá thấp nhất trong khoảng thời gian được chỉ định để xác định mức biến động giá.
Sau đó, nó sẽ tạo ra tín hiệu mua và bán. Tuy nhiên, không phải tất cả các tín hiệu sẽ kích hoạt nhập cảnh, nhưng cần đáp ứng các điều kiện lọc phạm vi biến động giá. Ví dụ, tín hiệu mua chỉ được phát hành khi giá vượt qua phạm vi biến động.
Bằng cách này, chiến lược lọc ra hầu hết các tín hiệu sai trong môi trường thị trường biến động thấp, tránh nhập cảnh không cần thiết. Trong khi biến động cao, nó nắm bắt các động thái hướng lớn hơn để kiếm lợi nhuận.
Ưu điểm lớn nhất của chiến lược này là nó có thể điều chỉnh năng động sức mạnh lọc của tín hiệu. Trong biến động thấp, nó chỉ chọn tín hiệu chất lượng cao; trong khi biến động cao, nó có thể nắm bắt nhiều cơ hội hơn được cung cấp bởi thị trường.
So với bộ lọc tham số cố định, chiến lược này thông minh hơn và thích nghi hơn.
Ngoài ra, so với một điều kiện hoạt động duy nhất, chiến lược này kết hợp phán đoán theo hướng xu hướng để cung cấp các tín hiệu giao dịch đáng tin cậy hơn.
Rủi ro chính của chiến lược nằm trong việc thiết lập các tham số phạm vi biến động. Nếu phạm vi đặt quá lớn hoặc quá nhỏ, nó sẽ ảnh hưởng tiêu cực đến chất lượng tín hiệu và cơ hội lợi nhuận.
Ngoài ra, chiến lược có tương đối ít cơ hội lợi nhuận trong các thị trường có xu hướng dao động ngắn hạn mạnh.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Sử dụng các thuật toán tham số thích nghi để tự động tối ưu hóa các tham số phạm vi biến động để làm cho chúng thông minh và năng động hơn.
Tăng các quy tắc lọc dựa trên xu hướng chu kỳ lớn để tránh bẫy hợp nhất.
Kết hợp các chu kỳ khác nhau của chiến lược để tạo thành một hệ thống và cải thiện sự ổn định tổng thể.
Thêm thuật toán học máy để cải thiện hiệu quả của cài đặt tham số và các quy tắc lọc.
Chiến lược tín hiệu mua bán lọc phạm vi là một chiến lược giao dịch định lượng rất thực tế và hiệu quả. Nó có thể điều chỉnh năng động cường độ lọc và cung cấp phần thưởng rủi ro vượt trội trong các môi trường thị trường khác nhau. Đồng thời, vẫn có tiềm năng lớn trong việc tối ưu hóa chiến lược này, đặc biệt là trong tối ưu hóa tham số và tối ưu hóa quy tắc. Nhìn chung, chiến lược này cung cấp một giải pháp cơ sở tuyệt vời cho các nhà giao dịch định lượng theo đuổi lợi nhuận dư thừa ổn định.
/*backtest start: 2023-03-02 00:00:00 end: 2024-03-07 00:00:00 period: 1d basePeriod: 1h 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/ // Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/ // This version is the old version of the Range Filter with less settings to tinker with //@version=5 strategy(title='Range Filter - B&S Signals', shorttitle='[Doan]_RF-B&S Signals', overlay=true) //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Functions //----------------------------------------------------------------------------------------------------------------------------------------------------------------- longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01 shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01 longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01 shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01 emaLength = input.int(200, title="EMA Length") // Determine stop loss price //Range Size Function rng_size(x, qty, n) => wper = n * 2 - 1 avrng = ta.ema(math.abs(x - x[1]), n) AC = ta.ema(avrng, wper) * qty rng_size = AC //Range Filter Function rng_filt(x, rng_, n) => r = rng_ var rfilt = array.new_float(2, x) array.set(rfilt, 1, array.get(rfilt, 0)) if x - r > array.get(rfilt, 1) array.set(rfilt, 0, x - r) if x + r < array.get(rfilt, 1) array.set(rfilt, 0, x + r) rng_filt1 = array.get(rfilt, 0) hi_band = rng_filt1 + r lo_band = rng_filt1 - r rng_filt = rng_filt1 [hi_band, lo_band, rng_filt] //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Inputs //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Range Source rng_src = input(defval=close, title='Swing Source') //Range Period rng_per = input.int(defval=20, minval=1, title='Swing Period') //Range Size Inputs rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier') //Bar Colors use_barcolor = input(defval=false, title='Bar Colors On/Off') //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Definitions //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Range Filter Values [h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per) //Direction Conditions var fdir = 0.0 fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir upward = fdir == 1 ? 1 : 0 downward = fdir == -1 ? 1 : 0 //Trading Condition longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0 CondIni = 0 CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1] longCondition = longCond and CondIni[1] == -1 shortCondition = shortCond and CondIni[1] == 1 //Colors filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc ema = ta.ema(close, emaLength) //----------------------------------------------------------------------------------------------------------------------------------------------------------------- //Outputs //----------------------------------------------------------------------------------------------------------------------------------------------------------------- longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) longTakePrice = strategy.position_avg_price * (1 + longTakePerc) shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc) //Filter Plot filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67) //Band Plots h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band') l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band') //Band Fills fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill') fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill') //Bar Color barcolor(use_barcolor ? bar_color : na) // Entry strategy.entry("Long", strategy.long, when=longCondition) strategy.entry("Short", strategy.short, when=shortCondition) plot(ema) //Plot Buy and Sell Labels plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0)) plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0)) //Alerts alertcondition(longCondition, title='Buy Alert', message='BUY') alertcondition(shortCondition, title='Sell Alert', message='SELL')