Chiến lược giao dịch đột phá động lượng


Ngày tạo: 2023-12-19 15:46:38 sửa đổi lần cuối: 2023-12-19 15:46:38
sao chép: 2 Số nhấp chuột: 573
1
tập trung vào
1621
Người theo dõi

Chiến lược giao dịch đột phá động lượng

Tổng quan

Chiến lược giao dịch phá vỡ động lực (Momentum Breakout Trading Strategy) là một chiến lược theo dõi xu hướng tạo ra tín hiệu giao dịch bằng cách phát hiện giá phá vỡ ngưỡng kháng cự hỗ trợ quan trọng. Chiến lược này sử dụng động lực của chỉ số kênh Donchian để xác định ngưỡng kháng cự hỗ trợ quan trọng và kết hợp với chỉ số trung bình di chuyển để lọc thêm tín hiệu để tránh giao dịch sai.

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

Chỉ số cốt lõi của chiến lược này là Kênh Donchian. Kênh Donchian bao gồm giá cao nhất, giá thấp nhất và giá đường giữa. Kênh trên và dưới đường liên kết giá cao nhất và thấp nhất trong một chu kỳ nhất định.

Đường trung bình di chuyển được sử dụng để xác định xu hướng của giá cả. Chỉ khi giá nằm trên đường trung bình di chuyển, tín hiệu mua vượt qua đường dẫn trên đường sẽ được áp dụng để tránh mua vào khu vực cân bằng.

Cụ thể, điều kiện đưa vào chiến lược này là: giá phá vỡ đường dẫn lên của kênh Donchian và giá đóng cửa cao hơn trung bình di chuyển. Điều kiện ra thị trường là: giá rơi xuống đường dẫn xuống của kênh Donchian.

Phương pháp dừng lỗ là theo dõi Donchian Channel. Điều này đảm bảo điểm dừng lỗ sẽ di chuyển lên theo xu hướng.

Phân tích lợi thế

Chiến lược này kết hợp hai chỉ số để xác định hướng và cường độ của xu hướng, có thể xác định hiệu quả các tín hiệu phá vỡ và tránh giao dịch sai. Đồng thời, cách dừng lỗ hợp lý, làm cho chiến lược có thể theo dõi xu hướng để kiếm lợi nhuận.

Cụ thể, chiến lược này có những lợi thế sau:

  1. Chỉ số Donchian Channel có thể động xác định các mức kháng cự hỗ trợ quan trọng, xác định các điểm chuyển hướng quan trọng.

  2. Chỉ số trung bình di chuyển được sử dụng như một bộ lọc để tránh mua vào khu vực cân bằng và giảm giao dịch không hiệu quả.

  3. Phương pháp dừng lỗ là theo dõi Donchian Channel xuống đường, có thể tối đa hóa lợi nhuận theo xu hướng.

  4. Các tham số chiến lược được thiết lập linh hoạt để có thể điều chỉnh và tối ưu hóa cho các môi trường thị trường khác nhau.

Phân tích rủi ro

Chiến lược này có những rủi ro:

  1. Rủi ro phá vỡ thất bại. Giá có thể sẽ nhanh chóng quay trở lại sau khi phá vỡ kênh và không thể tạo ra một kho hiệu quả.

  2. Rủi ro đảo ngược xu hướng. Thị trường có thể đảo ngược trước điểm dừng lỗ, dẫn đến dừng lỗ.

  3. Rủi ro tối ưu hóa tham số. Thiết lập tham số không đúng có thể dẫn đến giao dịch thường xuyên hoặc tín hiệu kém.

Những rủi ro này có thể được tối ưu hóa bằng cách điều chỉnh chu kỳ trung bình di chuyển, tăng bộ lọc khối lượng giao dịch, v.v., để đảm bảo tín hiệu được tạo ra là đáng tin cậy hơn. Ngoài ra, một số thiết lập dừng lỗ lỏng lẻo thích hợp cũng được thiết lập để đối phó với rủi ro điều chỉnh ngắn hạn.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:

  1. Sử dụng chỉ số giao thông để lọc tín hiệu, đảm bảo đột phá mạnh mẽ.

  2. Tối ưu hóa các tham số chu kỳ trung bình di chuyển để phù hợp hơn với các đặc tính của các giống khác nhau.

  3. Điều chỉnh cơ chế dừng lỗ để cho khoảng cách dừng lỗ phù hợp với biến động của thị trường.

  4. Thêm một cơ chế nhập lại để nắm bắt cơ hội xu hướng sau khi dừng lỗ.

  5. Thử nghiệm đa giống, kiểm tra tham số sức khỏe. Điều chỉnh tham số theo đặc điểm của các giống khác nhau.

Tóm tắt

Chiến lược giao dịch đột phá động lực tích hợp nhiều chỉ số để xác định hướng và cường độ của xu hướng, giải quyết vấn đề đặt cược mù quáng của hệ thống xu hướng phổ biến. Các tham số của chiến lược được thiết lập linh hoạt, có thể được điều chỉnh tối ưu hóa cho các môi trường giao dịch và các loại giao dịch khác nhau, là một hệ thống đột phá phổ biến và thực tế.

Mã nguồn chiến lược
/*backtest
start: 2022-12-12 00:00:00
end: 2023-12-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  
//      Entry: Buy when Donchian Channel breaks out
//      Exit: Trail a stop with the lower Donchian Channel band
// Conditions/Variables:
//    1. Can add a filter to only take setups that are above a user-defined moving average (helps avoid trading counter trend) 
//    2. Manually configure which dates to back test
//    3. User-Configurable DC Channel length


// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Donchian Breakout", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Donchian Breakout", overlay=true)


// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
trigInput = input(title = "Execute Trades On...", defval = "Wick", options=["Wick","Close"]) // Useful for comparing standing stop orders vs. waiting for candle closes prior to action
stopTrail = input(title = "Trail Stops On...", defval = "ATR", options = ["ATR","Bottom of DC Channel","Midline of DC Channel","Tightest of ATR/Bot DC Channel"])
dcPeriod = input(title="DC period", type=input.integer, defval=20)

// === PLOT THE DONCHIAN CHANNEL ===
// Logic
dcUpper = highest(high, dcPeriod)
dcLower = lowest(low, dcPeriod)
dcMid = avg(dcUpper, dcLower)

// Plotting
dcUplot = plot(dcUpper, color=color.blue, linewidth=1, title="Upper Channel Line")
dcLplot = plot(dcLower, color=color.blue, linewidth=1, title="Lower Channel Line")
dcMidPlot = plot(dcMid, color=color.gray, linewidth=1, title="Mid-Line Average")
fill(dcUplot, dcLplot, color=color.gray, transp=90)

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="SMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 100, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    0

// == ENTRY AND EXIT CRITERIA ==
// Trigger stop based on candle close or High/Low (i.e. Wick) - If doing daily timeframe, can do candle close.  Intraday should use wick.
trigResistance = trigInput == "Close" ? close : trigInput == "Wick" ? high : na
trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na
buySignal = trigResistance >= dcUpper[1] // The [1] looks at the previous bar's value as it didn't seem to be triggering correctly without it (likely) DC moves with each bar
sellSignal = trigSupport <= dcLower[1]

buy = buySignal and dcUpper[1] > maFilterCheck // All these conditions need to be met to buy


// (STRATEGY ONLY) Comment out for Study
// This string of code enters and exits at the close
if (trigInput == "Close")
    strategy.entry("Long", strategy.long, when = buy)
    strategy.close("Long", when = sellSignal)

// This string of code enters and exits at the wick (i.e. with pre-set stops)
if (trigInput == "Wick")
    strategy.entry("Long", strategy.long, stop = dcUpper[1], when = time > Start and time < Finish and dcUpper[1] > maFilterCheck)
    strategy.exit("Exit Long", from_entry = "Long", stop = dcLower[1])