Chiến lược theo dõi xu hướng trung bình chuyển động tự điều chỉnh

Tác giả:ChaoZhang, Ngày: 2024-02-26 16:36:30
Tags:

img

Tổng quan

Chiến lược này được thiết kế dựa trên trung bình chuyển động thích nghi Kaufman (KAMA) để điều chỉnh động các vị trí giao dịch và theo dõi tự động xu hướng thị trường.

  1. Tính năng tính toán kích thước bước giao dịch (trong pips) và thích nghi với biến động thị trường
  2. Tạo tín hiệu mua và bán dựa trên hướng của KAMA
  3. Thiết lập một khoảng cách dừng lỗ sau khi tín hiệu được kích hoạt, và điều chỉnh nó phù hợp như giá di chuyển
  4. Xác nhận tùy chọn của thanh gần để lọc tín hiệu giả

Thông qua việc áp dụng các chức năng này, chiến lược cố gắng thu được lợi nhuận bổ sung từ xu hướng trong khi kiểm soát rủi ro.

Chiến lược logic

Chiến lược này hoạt động dựa trên chỉ số Đường trung bình động thích nghi Kaufman. KAMA tính toán tỷ lệ đà tăng giá và biến động để điều chỉnh động trọng lượng và độ mượt mà của đường trung bình động, cho phép nó phản ứng nhanh hơn với những thay đổi giá.

Khi KAMA vượt qua trên đường dừng lỗ giảm, nó chỉ ra sự đảo ngược xu hướng và kích hoạt tín hiệu mua. Khi KAMA vượt qua dưới đường dừng lỗ tăng, nó gợi ý sự đảo ngược xu hướng và kích hoạt tín hiệu bán. Sau khi nhập vào vị trí, chiến lược tính toán khoảng cách dừng lỗ động dựa trên ATR và thiết lập đường dừng lỗ thuận lợi. Khi KAMA di chuyển theo hướng thuận lợi, đường dừng lỗ cũng điều chỉnh phù hợp, di chuyển đến vị trí thuận lợi hơn để khóa nhiều lợi nhuận hơn.

Bằng cách này, chiến lược có thể theo dõi xu hướng, dần dần di chuyển đường dừng lỗ cho đến khi nó được kích hoạt hoặc một tín hiệu ngược được kích hoạt để đóng vị trí.

Ưu điểm

So với các chiến lược trung bình động truyền thống, chiến lược này có những lợi thế sau:

  1. KAMA có độ nhạy cao và có thể nắm bắt xu hướng giá nhanh hơn;
  2. Khoảng cách dừng lỗ động khóa nhiều lợi nhuận hơn khi điều chỉnh theo xu hướng;
  3. Lưu ý: Lưu ý: Lưu ý:

Nói chung, chiến lược là đáp ứng, có thể kiểm soát, và một hệ thống theo dõi xu hướng điển hình.

Rủi ro

Chiến lược này cũng mang một số rủi ro:

  1. Rủi ro đảo ngược xu hướng: KAMA có thể thích nghi linh hoạt với biến động giá nhưng có thể không phản ứng kịp thời với sự đảo ngược xu hướng đột ngột.
  2. Nếu khoảng cách dừng lỗ động được đặt quá rộng, nó có thể quá mạnh và không thể khóa lợi nhuận kịp thời.
  3. Rủi ro tín hiệu giả: Sử dụng xác nhận gần thanh giúp giảm tín hiệu giả nhưng không thể loại bỏ chúng hoàn toàn.

Để quản lý những rủi ro này, có thể sử dụng các phương pháp như tối ưu hóa khoảng cách dừng lỗ và thiết lập tỷ lệ stoploss tối đa.

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

Các hướng có thể tối ưu hóa chiến lược bao gồm:

  1. Tối ưu hóa các thông số KAMA: điều chỉnh độ dài trung bình động, tinh chỉnh độ mịn;
  2. Tối ưu hóa mất mát dừng động: kiểm tra khoảng cách mất mát dừng tối ưu và kích thước bước dựa trên các sản phẩm khác nhau;
  3. Thêm các chỉ số lọc: kết hợp các chỉ số xu hướng khác để xác nhận tín hiệu giao dịch và cải thiện độ tin cậy.

Ví dụ, MACD có thể được thêm vào như một chỉ số xác nhận phụ trợ, yêu cầu MACD Dif là dương tính và mở rộng cùng với thập giá vàng KAMA. Điều này có thể lọc ra một số tín hiệu giả và tránh các mục lặp lại không cần thiết.

Kết luận

Hoạt động tổng thể của chiến lược này là trơn tru. Bằng cách sử dụng một stop loss năng động để theo dõi xu hướng và tối đa hóa lợi nhuận xu hướng, cùng với khả năng thích nghi của chỉ số KAMA để nhanh chóng phản ứng với những thay đổi thị trường nhanh chóng, chiến lược này có thể trở thành một hệ thống theo dõi xu hướng hiệu quả sau khi tối ưu hóa một số, phù hợp với giao dịch trung và dài hạn.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


Thêm nữa