Chiến lược phá vỡ động lực

Tác giả:ChaoZhang, Ngày: 2024-01-17 13:58:19
Tags:

img

Tổng quan

Chiến lược này là một chiến lược theo xu hướng sử dụng chỉ số động lực giá. Nó đánh giá xu hướng thị trường bằng cách tính toán sự thay đổi giá đóng trong một khoảng thời gian nhất định và thực hiện các mục dài hoặc ngắn tương ứng khi có xu hướng giá tăng hoặc giảm liên tục.

Chiến lược logic

Chỉ số cốt lõi của chiến lược này là động lực giá.

momentum = close - close[n] 

nơi n đại diện cho độ dài của thời gian động lực. Khi động lực > 0, điều đó có nghĩa là giá đã tăng trong thời gian hiện tại. Khi động lực < 0, điều đó có nghĩa là giá đã giảm trong thời gian hiện tại.

Chiến lược đầu tiên thiết lập một tham số confirmBars, đại diện cho số lượng nến cần thiết để đánh giá xu hướng trước khi thực hiện giao dịch. Trong phạm vi backtest, nếu đà > 0 tồn tại cho nến confirmBars, một mục dài được thực hiện. Nếu đà < 0 tồn tại cho nến confirmBars, một mục ngắn được thực hiện.

Chìa khóa để đánh giá xu hướng của chiến lược nằm trong việc đếm số lượng nến liên tiếp mà động lực lớn hơn hoặc nhỏ hơn 0, được thực hiện thông qua các biến bcount và scount. Chúng được tăng thêm 1 khi điều kiện tương ứng được đáp ứng và đặt lại 0 khi điều kiện không được đáp ứng. Khi đếm đạt confirmBars, giao dịch dài hoặc ngắn tương ứng được thực hiện.

Ưu điểm chiến lược

Đây là một xu hướng tương đối đơn giản theo chiến lược với những lợi thế sau:

  1. Logic đơn giản dễ hiểu và thực hiện
  2. Chỉ số động lực nhạy cảm với sự thay đổi giá và có thể nhanh chóng nắm bắt xu hướng
  3. Các tham số có thể tùy chỉnh để điều chỉnh độ nhạy của phán đoán
  4. Có thể được sử dụng trong nhiều môi trường thị trường khác nhau

Rủi ro chiến lược

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

  1. Có xu hướng giao dịch dao động nhiều lần và giao dịch quá mức
  2. Cần cấu hình tham số hợp lý, đặc biệt là xác nhậnBars để lọc dao động
  3. Không thể đối phó hiệu quả với tác động của các sự kiện thị trường đột ngột
  4. Sự khác biệt giữa backtest và giao dịch trực tiếp, dữ liệu và tối ưu hóa tham số cần thiết

Tối ưu hóa chiến lược

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

  1. Thêm logic dừng lỗ vào kiểm soát theo rủi ro giao dịch
  2. Thêm bộ lọc đột phá để tránh tín hiệu sai từ dao động giá
  3. Điều chỉnh confirmBars vv tham số dựa trên các sản phẩm khác nhau và môi trường thị trường
  4. Bao gồm các chỉ số khác để xác nhận các mục
  5. Sử dụng các phương pháp học máy để điều chỉnh các thông số và bộ lọc

Tóm lại

Tóm lại, chiến lược phá vỡ đà này là một chiến lược theo xu hướng đơn giản và thực tế phù hợp như một chiến lược giao dịch định lượng giới thiệu. Trong ứng dụng, cần chú ý đến việc kiểm soát tần suất giao dịch và ngăn chặn giao dịch quá mức. Trong khi đó, các tham số và bộ lọc cần được điều chỉnh và tối ưu hóa dựa trên các sản phẩm thực tế và môi trường thị trường để chiến lược đạt được hiệu suất tối đa.


/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Momentum Strategy [TS Trader]", overlay=true)

confirmBars = input(1)
momentumLength = input(14, title="Momentum Length")

price = close
momentum = close - close[momentumLength]

// === INPUT BACKTEST RANGE ===
fromYear = input.int(2019, title="Backtest Start Year")
fromMonth = input.int(1, title="Backtest Start Month", minval=1, maxval=12)
fromDay = input.int(1, title="Backtest Start Day", minval=1, maxval=31)
toYear = input.int(2023, title="Backtest End Year")
toMonth = input.int(12, title="Backtest End Month", minval=1, maxval=12)
toDay = input.int(31, title="Backtest End Day", minval=1, maxval=31)

startTimestamp = timestamp(fromYear, fromMonth, fromDay, 00, 00)
endTimestamp = timestamp(toYear, toMonth, toDay, 23, 59)

inBacktestRange = true

// === STRATEGY LOGIC ===
bcond = momentum > 0
bcount = 0
bcount := bcond ? nz(bcount[1]) + 1 : 0
if (bcount == confirmBars and inBacktestRange)
    strategy.entry("Buy", strategy.long, comment="Long")

scond = momentum < 0
scount = 0
scount := scond ? nz(scount[1]) + 1 : 0
if (scount == confirmBars and inBacktestRange)
    strategy.entry("Sell", strategy.short, comment="Short")

// Plotting Momentum
plot(momentum, title="Momentum", color=color.purple)


Thêm nữa