Chiến lược lọc trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2023-11-27
Tags:

img

Tổng quan

Đây là một chiến lược sử dụng các đường trung bình động và Bollinger Bands để đánh giá xu hướng, kết hợp với các nguyên tắc lọc đột phá và dừng lỗ. Nó có thể nắm bắt tín hiệu kịp thời khi xu hướng thay đổi, giảm các tín hiệu sai thông qua lọc đường trung bình động kép và kiểm soát rủi ro bằng cách đặt dừng lỗ.

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

Chiến lược bao gồm các phần chính sau:

  1. Phán quyết xu hướng: Sử dụng MACD để đánh giá xu hướng giá và phân biệt xu hướng tăng và giảm.

  2. Bộ lọc phạm vi: Sử dụng Bollinger Bands để đánh giá phạm vi biến động giá và lọc ra các tín hiệu không vượt qua phạm vi.

  3. Chứng nhận đường trung bình động kép: EMA nhanh và EMA chậm tạo thành đường trung bình động kép để xác nhận tín hiệu xu hướng.

  4. Cơ chế dừng lỗ: Thiết lập điểm dừng lỗ. Đóng các vị trí khi giá vượt qua điểm dừng lỗ theo hướng không thuận lợi.

Logic cho tín hiệu nhập là:

  1. MACD đánh giá xu hướng tăng
  2. Giá vượt qua đường ray trên của Bollinger Bands
  3. EMA nhanh cao hơn EMA chậm

Khi cả ba điều kiện được đáp ứng cùng một lúc, một tín hiệu mua được tạo ra.

Có hai loại vị trí đóng cửa, lấy lợi nhuận và dừng lỗ. Điểm lấy lợi nhuận là giá vào nhân với một tỷ lệ phần trăm nhất định, và điểm dừng lỗ là giá vào nhân với một tỷ lệ phần trăm nhất định. Khi giá vượt qua bất kỳ điểm nào, đóng các vị trí.

Phân tích lợi thế

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

  1. Có thể nắm bắt sự thay đổi xu hướng một cách kịp thời với ít traceback.
  2. Giảm tín hiệu sai bằng cách lọc với trung bình di chuyển kép, cải thiện chất lượng tín hiệu.
  3. Cơ chế dừng lỗ kiểm soát hiệu quả lỗ đơn.
  4. Không gian tối ưu hóa tham số lớn có thể được điều chỉnh theo trạng thái tối ưu.

Phân tích rủi ro

Có một số rủi ro trong chiến lược này:

  1. Các tín hiệu sai được tạo ra trong thị trường bên có thể dẫn đến tổn thất.
  2. Các thiết lập stop loss không chính xác có thể dẫn đến các lỗ không cần thiết.
  3. Các thông số không phù hợp có thể dẫn đến hiệu suất chiến lược kém.

Để giải quyết những rủi ro này, chiến lược có thể được tối ưu hóa bằng cách điều chỉnh các tham số, thiết lập các vị trí dừng lỗ, v.v.

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

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

  1. Điều chỉnh chiều dài trung bình động kép để tìm ra sự kết hợp các tham số tối ưu.
  2. Kiểm tra các phương pháp dừng lỗ khác nhau, chẳng hạn như dừng lỗ theo dõi, dừng lỗ dao động, v.v.
  3. Kiểm tra các thông số MACD để tìm các cài đặt tối ưu.
  4. Sử dụng máy học để tối ưu hóa tham số tự động.
  5. Thêm các điều kiện bổ sung vào các tín hiệu lọc.

Bằng cách kiểm tra các thiết lập tham số khác nhau và đánh giá lợi nhuận và tỷ lệ Sharpe, tình trạng tối ưu của chiến lược có thể được tìm thấy.

Kết luận

Đây là một chiến lược định lượng sử dụng đánh giá xu hướng, lọc phạm vi, xác nhận trung bình động kép và các ý tưởng dừng lỗ. Nó có thể xác định hiệu quả hướng xu hướng và cân bằng giữa tối đa hóa lợi nhuận và kiểm soát rủi ro. Thông qua tối ưu hóa tham số, học máy và các phương tiện khác, chiến lược có nhiều chỗ để cải thiện để đạt được kết quả tốt hơn.


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

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.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

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > 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



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)


Thêm nữa