Chiến lược theo dõi động lượng lọc phạm vi thích ứng hai chiều


Ngày tạo: 2024-01-24 11:31:51 sửa đổi lần cuối: 2024-01-24 11:32:23
sao chép: 0 Số nhấp chuột: 605
1
tập trung vào
1617
Người theo dõi

Chiến lược theo dõi động lượng lọc phạm vi thích ứng hai chiều

Tổng quan

Chiến lược này là một chiến lược theo dõi lượng biến động của bộ lọc phạm vi tự điều chỉnh hai chiều. Nó sử dụng bộ lọc phạm vi tự điều chỉnh để theo dõi biến động giá, và kết hợp với số lượng có thể xác định hướng giá trị, để mua thấp và bán cao.

Nguyên tắc chiến lược

  1. Sử dụng bộ lọc phạm vi thích ứng để theo dõi biến động giá. Kích thước bộ lọc được điều chỉnh theo chu kỳ, số lượng và quy mô của phạm vi được thiết lập bởi người dùng.
  2. Bộ lọc được chia thành hai loại: Loại 1 và Loại 2. Loại 1 là loại theo dõi phạm vi tiêu chuẩn, Loại 2 là loại toàn bộ thang.
  3. Phương hướng biến động của giá được xác định dựa trên mối quan hệ giữa kích thước của bộ lọc và giá đóng cửa. Giá trên đường ray là giá lên, dưới đường ray là giá xuống.
  4. Kết hợp với giá đóng cửa so với ngày trước giảm giá, định hướng giá trị. Giá trị tăng lên nhiều đầu, giảm là đầu không.
  5. Giao thức mua được phát ra khi giá phá vỡ đường mòn và giá trị tăng; Giao thức bán được phát ra khi giá phá vỡ đường mòn và giá trị giảm.

Phân tích lợi thế

  1. Bộ lọc phạm vi thích ứng có thể nắm bắt chính xác sự biến động của thị trường.
  2. Hai loại bộ lọc có thể đáp ứng các sở thích giao dịch khác nhau.
  3. Chỉ số kết hợp có thể xác định hiệu quả hướng giá trị.
  4. Chiến lược linh hoạt, có thể điều chỉnh các tham số theo thị trường.
  5. Có thể Customize để chọn hợp lý điều kiện giao dịch.

Phân tích rủi ro

  1. Thiết lập tham số không đúng có thể dẫn đến giao dịch quá mức hoặc bỏ phiếu.
  2. Có một sự chậm trễ trong tín hiệu đột phá.
  3. Chỉ số năng lượng có một số rủi ro.
  4. Những vụ phá vỡ phạm vi dễ bị lừa.

Phòng ngừa rủi ro:

  1. Chọn các tham số phù hợp và điều chỉnh khi thích hợp.
  2. Kết hợp với các chỉ số khác để xác định xu hướng.
  3. Giao dịch thận trọng khi gần điểm quan trọng và khi xu hướng đảo ngược.

Hướng tối ưu hóa

  1. Kiểm tra các kích thước phạm vi khác nhau và kết hợp các tham số chu kỳ trơn để tìm ra sự kết hợp tốt nhất.
  2. Thử các loại bộ lọc khác nhau và chọn loại mà bạn thích.
  3. Thử các chỉ số định lượng khác hoặc các chỉ số kỹ thuật hỗ trợ.
  4. Tối ưu hóa và điều chỉnh logic điều kiện giao dịch để giảm giao dịch phi lý.
  5. Kết hợp với lý thuyết phân loại thị trường để thiết lập tỷ lệ điều chỉnh thích nghi.
Mã nguồn chiến lược
/*backtest
start: 2023-01-17 00:00:00
end: 2024-01-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Range Filter [DW] & Labels", shorttitle="RF [DW] & Labels", overlay=true)


//Conditional Sampling EMA Function 
Cond_EMA(x, cond, n)=>
    var val     = array.new_float(0)
    var ema_val = array.new_float(1)
    if cond
        array.push(val, x)
        if array.size(val) > 1
            array.remove(val, 0)
        if na(array.get(ema_val, 0))
            array.fill(ema_val, array.get(val, 0))
        array.set(ema_val, 0, (array.get(val, 0) - array.get(ema_val, 0))*(2/(n + 1)) + array.get(ema_val, 0))
    EMA = array.get(ema_val, 0)
    EMA

//Conditional Sampling SMA Function
Cond_SMA(x, cond, n)=>
    var vals = array.new_float(0)
    if cond
        array.push(vals, x)
        if array.size(vals) > n
            array.remove(vals, 0)
    SMA = array.avg(vals)
    SMA

//Standard Deviation Function
Stdev(x, n)=>
    sqrt(Cond_SMA(pow(x, 2), 1, n) - pow(Cond_SMA(x, 1, n), 2))

//Range Size Function
rng_size(x, scale, qty, n)=> 
    ATR      = Cond_EMA(tr(true), 1, n)
    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    SD       = Stdev(x, n)
    rng_size = scale=="Pips" ? qty*0.0001 : scale=="Points" ? qty*syminfo.pointvalue : scale=="% of Price" ? close*qty/100 : scale=="ATR" ? qty*ATR :
               scale=="Average Change" ? qty*AC : scale=="Standard Deviation" ? qty*SD : scale=="Ticks" ? qty*syminfo.mintick : qty   

//Two Type Range Filter Function
rng_filt(h, l, rng_, n, type, smooth, sn, av_rf, av_n)=>
    rng_smooth = Cond_EMA(rng_, 1, sn)
    r          = smooth ? rng_smooth : rng_
    var rfilt  = array.new_float(2, (h + l)/2)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if type=="Type 1"
        if h - r > array.get(rfilt, 1)
            array.set(rfilt, 0, h - r)
        if l + r < array.get(rfilt, 1)
            array.set(rfilt, 0, l + r)
    if type=="Type 2"
        if h >= array.get(rfilt, 1) + r
            array.set(rfilt, 0, array.get(rfilt, 1) + floor(abs(h - array.get(rfilt, 1))/r)*r)
        if l <= array.get(rfilt, 1) - r
            array.set(rfilt, 0, array.get(rfilt, 1) - floor(abs(l - array.get(rfilt, 1))/r)*r)
    rng_filt1 = array.get(rfilt, 0)
    hi_band1  = rng_filt1 + r
    lo_band1  = rng_filt1 - r
    rng_filt2 = Cond_EMA(rng_filt1, rng_filt1 != rng_filt1[1], av_n)
    hi_band2  = Cond_EMA(hi_band1, rng_filt1 != rng_filt1[1], av_n)
    lo_band2  = Cond_EMA(lo_band1, rng_filt1 != rng_filt1[1], av_n)
    rng_filt  = av_rf ? rng_filt2 : rng_filt1
    hi_band   = av_rf ? hi_band2 : hi_band1
    lo_band   = av_rf ? lo_band2 : lo_band1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Type
f_type = input(defval="Type 1", options=["Type 1", "Type 2"], title="Filter Type")

//Movement Source
mov_src = input(defval="Close", options=["Wicks", "Close"], title="Movement Source")

//Range Size Inputs
rng_qty   = input(defval=2.618, minval=0.0000001, title="Range Size")
rng_scale = input(defval="Average Change", options=["Points", "Pips", "Ticks", "% of Price", "ATR", "Average Change", "Standard Deviation", "Absolute"], title="Range Scale")

//Range Period
rng_per = input(defval=14, minval=1, title="Range Period (for ATR, Average Change, and Standard Deviation)")

//Range Smoothing Inputs
smooth_range = input(defval=true, title="Smooth Range")
smooth_per   = input(defval=27, minval=1, title="Smoothing Period")

//Filter Value Averaging Inputs
av_vals    = input(defval=true, title="Average Filter Changes")
av_samples = input(defval=2, minval=1, title="Number Of Changes To Average")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//High And Low Values
h_val = mov_src=="Wicks" ? high : close
l_val = mov_src=="Wicks" ? low : close

//Range Filter Values
[h_band, l_band, filt] = rng_filt(h_val, l_val, rng_size((h_val + l_val)/2, rng_scale, rng_qty, rng_per), rng_per, f_type, smooth_range, smooth_per, av_vals, av_samples)

//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

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (close > filt) ? (close > close[1] ? #05ff9b : #00b36b) :
             downward and (close < filt) ? (close < close[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=0, linewidth=3,  title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=#05ff9b, transp=100, title="High Band")
l_band_plot = plot(l_band, color=#ff0583, transp=100, title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=#00b36b, transp=85, title="High Band Fill")
fill(l_band_plot, filt_plot, color=#b8005d, transp=85, title="Low Band Fill")

//Bar Color
barcolor(bar_color)

//External Trend Output
plot(fdir, transp=100, editable=false, display=display.none, title="External Output - Trend Signal")

// Trading Conditions Logic
longCond = close > filt and close > close[1] and upward > 0 or close > filt and close < close[1] and upward > 0 
shortCond = close < filt and close < close[1] and downward > 0 or close < filt and close > close[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

// Strategy Entry and Exit
strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

strategy.close("Buy", when = shortCondition)
strategy.close("Sell", when = longCondition)

// 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.green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.red, transp = 0)

// Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")