Chiến lược giao dịch đột phá đà là một chiến lược theo xu hướng tạo ra tín hiệu giao dịch bằng cách phát hiện sự đột phá giá vượt quá mức hỗ trợ / kháng cự chính. Chiến lược này sử dụng chỉ số kênh Donchian để xác định động các mức hỗ trợ / kháng cự chính và lọc các tín hiệu với đường trung bình động để tránh các giao dịch sai.
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 trong một khoảng thời gian nhất định. Dải trên và dưới của kênh kết nối giá cao nhất và giá thấp nhất tương ứng trong khoảng thời gian xem lại.
Đường trung bình động được sử dụng để đánh giá hướng xu hướng. Chỉ có tín hiệu mua với giá trên đường trung bình động được lấy để tránh hợp nhất.
Cụ thể, điều kiện vào bao gồm: Giá phá vỡ trên dải trên của kênh Donchian và đóng trên đường trung bình động. Điều kiện thoát là: Giá phá vỡ dưới dải dưới kênh Donchian.
Stop loss đi theo dải dưới của kênh Donchian, đảm bảo stop điều chỉnh cao hơn cùng với xu hướng.
Chiến lược này kết hợp hiệu quả hai chỉ số để đánh giá xu hướng và động lực, tránh giao dịch sai từ các tín hiệu đột phá sai.
Cụ thể, những lợi thế là:
Kênh Donchian xác định động các mức hỗ trợ / kháng cự chính, xác định các điểm chuyển hướng xu hướng.
Mức trung bình động lọc ra sự củng cố, tránh những sự cố không cần thiết.
Theo dõi dải dưới kênh Donchian cho phép lợi nhuận được tối đa hóa.
Các tham số hợp lý cung cấp tính linh hoạt trong các môi trường thị trường khác nhau.
Các rủi ro chính phải đối mặt:
Nguy cơ phá vỡ thất bại - Giá không thể duy trì động lực sau khi phá vỡ trên dải trên.
Rủi ro đảo ngược xu hướng - Giá đảo ngược trước khi đạt mức dừng lỗ.
Rủi ro tối ưu hóa tham số - Các tham số không hiệu quả dẫn đến giao dịch quá mức hoặc tín hiệu không đủ.
Để giảm thiểu, các yếu tố như xác nhận âm lượng, điều chỉnh trung bình động, khoảng cách dừng hợp lý nên được kết hợp.
Các tối ưu hóa tiếp theo:
Thêm bộ lọc âm lượng để đảm bảo tốc độ tăng cao.
Tối ưu hóa thời gian trung bình động cho các đặc điểm của thiết bị.
Cơ chế dừng lỗ thích nghi dựa trên động lực biến động giá.
Cơ chế nhập lại sau khi dừng ban đầu để nắm bắt các động thái tiếp tục xu hướng bổ sung.
Kiểm tra đa thị trường mạnh mẽ để xác định các thông số theo sắc thái sản phẩm.
Chiến lược giao dịch Breakout Momentum kết hợp các chỉ số để đánh giá hiệu quả xu hướng và sức mạnh đà tăng, tránh các vấn đề phổ biến mà các hệ thống xu hướng phải đối mặt liên quan đến các mục nhập mù. Các thông số tối ưu hợp lý, cơ chế thích nghi và thử nghiệm mạnh mẽ trên các môi trường và sản phẩm khác nhau làm cho đây là một hệ thống breakout linh hoạt và thực tế.
/*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])