Chiến lược theo dõi xu hướng đa chỉ số

Tác giả:ChaoZhang, Ngày: 2023-12-27 17:15:45
Tags:

img

Tổng quan

Chiến lược được đặt tên làChiến lược theo dõi xu hướng đa chỉ sốNó sử dụng nhiều chỉ số bao gồm Fisher Transform, Weighted Moving Average (WMA), Relative Strength Index (RSI) và On-Balance Volume (OBV) để xác định hướng xu hướng của thị trường và theo dõi xu hướng giao dịch.

Chiến lược logic

  1. Fisher Transform để phát hiện xu hướng thay đổi giá và động lực. Các tín hiệu giao dịch được tạo ra khi bốn đường Fisher thay đổi màu đồng bộ.
  2. WMA để xác định hướng xu hướng chính. RSI lọc ra các tín hiệu giả.
  3. OBV để xác nhận xu hướng.

Đặc biệt, Fisher Transform chứa bốn đường - 1x, 2x, 4x và 8x. Khi bốn đường chuyển sang màu xanh lá cây đồng thời, một tín hiệu dài được tạo ra. Khi bốn đường chuyển sang màu đỏ đồng thời, một tín hiệu ngắn được tạo ra. WMA xác định xu hướng chính là tăng hay giảm. OBV xác nhận hướng xu hướng. RSI lọc ra các tín hiệu sai.

Phân tích lợi thế

Những lợi thế của chiến lược này:

  1. Biến đổi Fisher nhạy cảm với động lượng, khi bốn đường Fisher thay đổi màu đồng bộ, nó đảm bảo xác suất đảo ngược xu hướng cao.
  2. WMA xác định xu hướng chính để tránh giao dịch chống lại xu hướng.
  3. OBV xác nhận xu hướng thực sự, tránh sự phá vỡ sai trong thị trường không có xu hướng.
  4. RSI lọc ra các tín hiệu sai để đảm bảo độ tin cậy của các tín hiệu giao dịch.

Thông qua sự kết hợp của nhiều chỉ số, nó đảm bảo độ chính xác và độ tin cậy của tín hiệu giao dịch và có khả năng bắt được xu hướng, dẫn đến hiệu suất chiến lược tốt.

Phân tích rủi ro

Rủi ro của chiến lược này:

  1. Các đường Fisher có thể tạo ra các tín hiệu sai nếu thị trường đang hợp nhất.
  2. Cài đặt tham số WMA không chính xác có thể ảnh hưởng đến độ chính xác của xu hướng.
  3. Fisher Transform không hoạt động tốt trong xu hướng cực ngắn hạn.
  4. Sự suy giảm thác nước có thể dẫn đến tổn thất rất lớn.

Để giảm thiểu rủi ro, tham số RSI có thể được điều chỉnh phù hợp. Thời gian WMA có thể được tối ưu hóa. Đặt dừng lỗ cũng có thể được thiết lập để tránh tổn thất lớn.

Hướng dẫn tối ưu hóa

Chiến lược này có thể được tối ưu hóa thêm từ các khía cạnh sau:

  1. Kiểm tra hiệu quả trên các khung thời gian khác nhau để tìm ra sự kết hợp các tham số tối ưu.
  2. Thêm cơ chế dừng lỗ. Đặt dừng lỗ khi lỗ đạt đến một mức nhất định.
  3. Điều chỉnh thêm các tham số biến đổi Fisher dựa trên kết quả backtest để tìm ra sự kết hợp tham số tối ưu với độ chính xác tốt nhất.
  4. Cố gắng thêm các chỉ số lọc khác như chỉ số sức mạnh, chỉ số thiên vị v.v.
  5. Kiểm tra các chiến lược khác nhau để thiết lập kích thước vị trí.

Kết luận

Chiến lược này tích hợp Fisher Transform, WMA, OBV và RSI để xác định hướng xu hướng. Nó tạo ra các tín hiệu giao dịch chính xác với khả năng xác nhận mạnh mẽ, cho phép khóa lợi nhuận hiệu quả dọc theo xu hướng. Với tối ưu hóa tham số hơn nữa, yếu tố lợi nhuận có thể được cải thiện.


/*backtest
start: 2022-12-20 00:00:00
end: 2023-12-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//author Sdover0123
strategy(title='FTR, WMA, OBV & RSI Strat', shorttitle='FTR WMA, OBV, RSI',overlay=false, default_qty_type=strategy.percent_of_equity, initial_capital = 100, default_qty_value=100, commission_value = 0.06, pyramiding = 3)
Len = input.int(10, minval=1, group ="Fisher Transform")
mult1 = input.int(1, minval=1, group ="Fisher Transform")
mult2 = input.int(2, minval=1, group ="Fisher Transform")
mult3 = input.int(4, minval=1, group ="Fisher Transform")
mult4 = input.int(8, minval=1, group ="Fisher Transform")
fish(Length, timeMultiplier) =>
    var nValue1 = 0.0
    var nValue2 = 0.0
    var nFish = 0.0
    xHL2 = hl2
    xMaxH = ta.highest(xHL2, Length * timeMultiplier)
    xMinL = ta.lowest(xHL2, Length * timeMultiplier)
    nValue1 := 0.33 * 2 * ((xHL2 - xMinL) / (xMaxH - xMinL) - 0.5) + 0.67 * nz(nValue1[1])
    if nValue1 > .99
        nValue2 := .999
        nValue2
    else if nValue1 < -.99
        nValue2 := -.999
        nValue2
    else
        nValue2 := nValue1
        nValue2
    nFish := 0.5 * math.log((1 + nValue2) / (1 - nValue2)) + 0.5 * nz(nFish[1])
    nFish
Fisher1 = fish(Len, mult1)
Fisher2 = fish(Len, mult2)
Fisher4 = fish(Len, mult3)
Fisher8 = fish(Len, mult4)

rsiLength = input.int(14, minval=1, group ="Moving Averages")
rsiVal = (ta.rsi(close, rsiLength) - 50) / 10
avg = strategy.position_avg_price

wma(source, length) =>
    sum = 0.0
    for i = 0 to length - 1
        sum := sum + source[i] * (length - i)
    wma = sum / (length * (length + 1) / 2)
    wma

wmaLength = input.int(10, "WMA Length", minval=1, group ="Moving Averages")
wmaClose = wma(close, wmaLength)
// Determine if WMA is bullish or bearish
isWmaBullish = wmaClose > wmaClose[1]
isWmaBearish = wmaClose < wmaClose[1]

//OBV 
src = close
length = input.int(20, title="OBV Length", group="On-Balance Volume")
obv1(src) =>
    change_1 = ta.change(src)
    ta.cum(ta.change(src) > 0 ? volume : change_1 < 0 ? -volume : 0 * volume)*0.01
os = obv1(src)
obv_osc = os - ta.ema(os, length)
obc_color = (obv_osc > 0 ? color.rgb(0, 255, 8) : color.rgb(255, 0, 0))
plot(obv_osc, color=obc_color, style=plot.style_line, title='OBV-Points', linewidth=2)
plot(obv_osc, color=color.new(#b2b5be, 70), title='OBV', style=plot.style_area)
obvBullFilter = input.float(0.1, minval = 0, maxval = 5, step = 0.01, title ="OBV Bullish minimum value", group="On-Balance Volume")
obvBearFilter = input.float(-0.1, minval = -5, maxval = 0, step = 0.01, title ="OBV Bearish minimum value", group="On-Balance Volume")
obvBull = obv_osc > obvBullFilter
obvBear = obv_osc < obvBearFilter

// Add buy/sell signals
ReversalFilterDown = input.float(-0.7, 'Reversal Down TP Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. When all Fisher lines are changing colour, this will SL/TP the long")
ReversalFilterUp = input.float(0.7, 'Reversal Up TP Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. When all Fisher lines are changing colour, this will SL/TP the short")
RSILevelBuyFilter = input.float(1.66, 'RSI Level Buy Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. Consider negative values")
RSILevelSellFilter = input.float(1, 'RSI Level Sell Filter', -4, 4, step = 0.01, group = "RSI Level Filters", tooltip = "This is defined by taking the RSI value -50 and /10. Consider negative values")
//buys - if breaking out and all Fisher are green and RSI filter value is met 
buySignal = Fisher1 > Fisher1[1] and Fisher2 > Fisher2[1] and Fisher4 > Fisher4[1] and Fisher8 > Fisher8[1] and rsiVal > RSILevelBuyFilter and isWmaBullish and obvBull
ReversalUp = Fisher1 > Fisher1[1] and Fisher2 > Fisher2[1] and Fisher4 > Fisher4[1] and Fisher8 > Fisher8[1] and rsiVal > ReversalFilterUp
//sells - if breaking down and all Fisher are green and RSI filter value is met 
sellSignal = Fisher1 < Fisher1[1] and Fisher2 < Fisher2[1] and Fisher4 < Fisher4[1] and Fisher8 < Fisher8[1] and rsiVal < RSILevelSellFilter and isWmaBearish and obvBear
ReversalDown = Fisher1 < Fisher1[1] and Fisher2 < Fisher2[1] and Fisher4 < Fisher4[1] and Fisher8 < Fisher8[1] and rsiVal < ReversalFilterDown


// Buy and Sell conditions
if buySignal and time>timestamp(2022, 06, 01, 09, 30) and barstate.isconfirmed
    strategy.close("Sell", comment = "Close Short")
    strategy.entry("Buy", strategy.long, comment = "Long")

if sellSignal and time>timestamp(2022, 06, 01, 09, 30) and barstate.isconfirmed
    strategy.close("Buy", comment = "Close Long")
    strategy.entry("Sell", strategy.short, comment = "Short")

if ReversalDown
    strategy.close("Buy", comment = "Close Long")

if ReversalUp
    strategy.close("Sell", comment = "Close Short")

//Plotting
//Fisher
plot(Fisher1, color=Fisher1 > nz(Fisher1[1]) ? color.green : color.rgb(255, 0, 0), title='Fisher TF:1')
plot(Fisher2, color=Fisher2 > nz(Fisher2[1]) ? color.green : color.rgb(255, 0, 0), title='Fisher TF:1', linewidth=2)
plot(Fisher4, color=Fisher4 > nz(Fisher4[1]) ? #008000 : #b60000, title='Fisher TF:1', linewidth=3)
plot(Fisher8, color=Fisher8 > nz(Fisher8[1]) ? #004f00 : #b60000, title='Fisher TF:1', linewidth=3)
//RSI
plot(rsiVal, color=rsiVal < 0 ? color.purple : color.yellow, linewidth=2, title='RSI')

//WMA
plot(isWmaBullish ? -2 : na, color=color.rgb(76, 175, 79, 20), linewidth=3, style=plot.style_linebr, title="WMA Bullish")
plot(isWmaBearish ? -2 : na, color=color.rgb(255, 82, 82, 20), linewidth=3, style=plot.style_linebr, title="WMA Bearish")

//Buy/Sell Signals
plotshape(buySignal, title='Buy Signal', location=location.bottom, color=color.new(color.lime, 0), style=shape.triangleup, size=size.small)
plotshape(sellSignal, title='Sell Signal', location=location.top, color=color.new(color.red, 0), style=shape.triangledown, size=size.small)

//Orientation
hline(RSILevelBuyFilter, color=color.rgb(25, 36, 99, 20), linestyle=hline.style_dotted, linewidth=2)
hline(RSILevelSellFilter, color=color.rgb(111, 27, 27, 20), linestyle=hline.style_dotted, linewidth=2)
hline(0, color=color.rgb(181, 166, 144, 39), linestyle=hline.style_dashed, linewidth=2, title = "Zero Line")
hline(1.5, color=color.rgb(217, 219, 220, 50), linestyle=hline.style_dotted, linewidth=2, title = "1.5 // 65 Line")
hline(-1.5, color=color.rgb(217, 219, 220, 50), linestyle=hline.style_dotted, linewidth=2, title = "-1.5 // 35 Line")

Thêm nữa