Chiến lược theo dõi xu hướng định lượng

Tác giả:ChaoZhang, Ngày: 2024-02-01 11:42:22
Tags:

img

Tổng quan

Chiến lược này sử dụng nhiều chỉ số như Bollinger Bands, RSI, ADX, MACD để đánh giá xu hướng thị trường và có khả năng xác định xu hướng mạnh mẽ. Nó thực hiện chiến lược theo xu hướng khi tín hiệu chỉ số tăng đồng thời. Nó đóng các vị trí để dừng lỗ khi tín hiệu chỉ số giảm đồng thời.

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

  • Sử dụng Bollinger Bands để đánh giá liệu giá có gần đường ray trên hoặc dưới để xác định liệu xu hướng có hình thành hay không
  • Kết hợp với chỉ số RSI để tránh các khu vực mua quá mức và bán quá mức để ngăn chặn sự phá vỡ sai
  • Sử dụng ADX để xác định sức mạnh xu hướng và chỉ báo hiệu khi sức mạnh xu hướng là mạnh mẽ
  • Sử dụng MACD để đánh giá sự nhất quán của xu hướng ngắn hạn và dài hạn
  • Giới hạn các phiên giao dịch để tránh rủi ro qua đêm

Thông qua sự đánh giá kết hợp của nhiều chỉ số, nó có thể xác định chính xác xu hướng giá và theo dõi kịp thời khi xu hướng xảy ra để đạt được lợi nhuận vượt quá.

Phân tích lợi thế

Ưu điểm lớn nhất của chiến lược này là đánh giá kết hợp các chỉ số là toàn diện và chính xác hơn, có thể xác định hiệu quả xu hướng giá và tránh các tín hiệu sai do các chỉ số duy nhất gây ra.

Cụ thể, những lợi thế là:

  1. Bollinger Bands có thể xác định phạm vi biến động giá và sức mạnh
  2. RSI tránh mua ở các khu vực mua quá mức và bán ở các khu vực bán quá mức
  3. ADX xác định sức mạnh xu hướng, chỉ theo xu hướng mạnh
  4. MACD đánh giá sự nhất quán của ngắn hạn và dài hạn
  5. Giới hạn các phiên giao dịch để tránh rủi ro qua đêm

Thông qua đánh giá kết hợp chỉ số, nó có thể tối đa hóa giảm tín hiệu sai và tăng tính ổn định của chiến lược.

Phân tích rủi ro

Những rủi ro chính của chiến lược này xuất phát từ:

  1. Các sự kiện thị trường gây ra sự cố của chỉ số
  2. Các tín hiệu sai thường xuyên trên các thị trường giới hạn phạm vi

Đối với rủi ro 1, việc dựa vào nhiều chỉ số có thể giảm thiểu vấn đề thất bại của chỉ số duy nhất ở một mức độ nào đó, nhưng các cơ chế quản lý rủi ro vẫn cần được cải thiện.

Đối với rủi ro 2, các tham số có thể được điều chỉnh thích hợp để giới hạn phạm vi giao dịch và giảm tần suất giao dịch để giảm thiểu rủi ro.

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

Các khía cạnh tối ưu hóa chính của chiến lược này bao gồm:

  1. Thêm các cơ chế dừng lỗ như dừng lỗ kéo theo, dừng lỗ thời gian, dừng lỗ đột phá, vv để tránh rút lại quá sâu
  2. Tối ưu hóa các tham số, điều chỉnh các tham số chỉ số kết hợp để tìm ra tối ưu
  3. Thêm các bộ lọc như bộ lọc khối lượng để tránh đột phá sai ở khối lượng thấp
  4. Kết hợp nhiều chỉ số như KDJ, OBV để cải thiện độ chính xác tín hiệu
  5. Sử dụng các phương pháp học máy để tự động tối ưu hóa các thông số

Bằng cách tối ưu hóa liên tục, liên tục cải thiện độ chắc chắn của tham số và giảm xác suất tín hiệu sai.

Tóm lại

Nhìn chung, chiến lược này có khả năng tương đối mạnh để xác định tín hiệu xu hướng thông qua các đánh giá kết hợp các chỉ số có thể xác định hiệu quả xu hướng giá.

Nhưng nó cũng có những rủi ro nhất định, quản lý rủi ro và tối ưu hóa tham số cần được cải thiện liên tục để hoạt động lâu dài ổn định.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
basePeriod: 15m
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)


Thêm nữa