Đây là một chiến lược giao dịch sử dụng các kênh Donchain trong nhiều khung thời gian để xác định các điểm vào và ra. Ý tưởng cốt lõi là đánh giá hướng xu hướng trên một khung thời gian dài hơn cho các tín hiệu vào và tìm kiếm sự đảo ngược xu hướng trong một khung thời gian ngắn hơn cho các tín hiệu ra.
Chiến lược này chủ yếu sử dụng khái niệm kênh Donchain, bao gồm các kênh trên, dưới và giữa.
Sử dụng 52 giai đoạn để xây dựng một kênh Donchain dài hạn và có được đường trên, dưới và đường trung.
Sử dụng 12 giai đoạn để xây dựng một kênh Donchain ngắn hạn và có được đường trên, dưới và đường trung.
Logic Entry: Khi giá phá vỡ trên đỉnh kênh dài hạn, chúng tôi xác định nó là tín hiệu đầu vào dài. Để tránh phá vỡ sai, chúng tôi yêu cầu ít nhất 1 nến trong số 3 nến gần đây đóng trên đỉnh kênh của nó.
Logic Exit: Khi giá phá vỡ dưới đáy kênh ngắn hạn, chúng tôi xác định nó như một tín hiệu thoát để đóng các vị trí dài. Tương tự, chúng tôi yêu cầu ít nhất 1 nến trong 3 nến gần đây đóng dưới đáy kênh của nó để xác nhận tính hợp lệ của sự phá vỡ.
Chiến lược kết hợp các ưu điểm của cả hai xu hướng theo dõi và trung bình đảo ngược giao dịch. khung thời gian dài đánh giá xu hướng trong khi khung thời gian ngắn hơn nắm bắt sự đảo ngược địa phương trong xu hướng.
Sử dụng phân tích nhiều khung thời gian giúp giải quyết các vấn đề với sự đột phá sai và làm cho các mục nhập / xuất hợp lệ hơn.
Các thông số có thể được tối ưu hóa cho các sản phẩm và chế độ thị trường khác nhau.
Chiến lược này nhạy cảm với các thông số. Các thông số khác nhau có thể dẫn đến kết quả khác nhau đáng kể. Kiểm tra và tối ưu hóa đầy đủ là cần thiết để tìm ra bộ thông số tối ưu.
Nó có thể kích hoạt giao dịch quá mức trên các thị trường khác nhau.
Nó không xem xét chế độ thị trường tổng thể. Có thể thất bại tại các điểm đảo ngược xu hướng lớn. Các chỉ số khác nên được sử dụng để đánh giá xu hướng lớn.
Thực hiện tối ưu hóa tham số để tìm các tham số tốt nhất, bao gồm thời gian kênh, loại kênh v.v.
Tích hợp logic dừng lỗ với các điểm dừng hợp lý để kiểm soát lỗ.
Kết hợp các chỉ số khác để xác định xu hướng chính, chẳng hạn như EMA, Keltner Channels, MACD vv, tránh thất bại tại các điểm chuyển đổi chính.
Tóm lại, đây là một chiến lược đột phá kênh Donchain đa khung thời gian điển hình. Nó tích hợp cả theo xu hướng và đảo ngược trung bình tốt để nắm bắt sự đảo ngược địa phương trong xu hướng. Với các thông số tối ưu, nó có thể hoạt động rất tốt trong các thị trường xu hướng. Tuy nhiên, chính chiến lược này rất mong manh, nhạy cảm với các thông số và chế độ thị trường tổng thể.
/*backtest start: 2023-02-20 00:00:00 end: 2024-02-26 00:00:00 period: 1d basePeriod: 1h 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/ // © venkyrocker7777 //@version=5 strategy('Donchain channel based investment strategy', shorttitle='Donchain channel strategy', overlay=true) Length = input.int(21, minval=1) xPrice = close xvnoise = math.abs(xPrice - xPrice[1]) nAMA = 0.0 nfastend = 0.666 nslowend = 0.0645 nsignal = math.abs(xPrice - xPrice[Length]) nnoise = math.sum(xvnoise, Length) nefratio = nnoise != 0 ? nsignal / nnoise : 0 nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2) nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1])) plot(nAMA, color=color.new(color.blue, 0), title='KAMA') // Function to get Lower Channel, Upper Channel, Middle Channel for a period length getLCUCMC(PeriodLength) => lowestValueInThePeriod = ta.lowest(PeriodLength) // LC highestValueInThePeriod = ta.highest(PeriodLength) // UC middleChannelInTheperiod = math.avg(highestValueInThePeriod, lowestValueInThePeriod) // MC // Returns Lower Channel, Upper Channel, Middle Channel for a period length [lowestValueInThePeriod, highestValueInThePeriod, middleChannelInTheperiod] // Longer time frame for entry longerPeriod = 52 // Shorter time frame for exit shorterPeriod = 12 if timeframe.period == 'D' // Longer time frame for entry longerPeriod := 52 * 5 // Shorter time frame for exit shorterPeriod := 12 * 5 shorterPeriod if timeframe.period == 'M' // Longer time frame for entry longerPeriod := 12 // Shorter time frame for exit shorterPeriod := 3 shorterPeriod // Get Lower Channel, Upper Channel, Middle Channel for longerPeriod, shorterPeriod [lowestValueInTheLongerPeriodLength, highestValueInTheLongerPeriodLength, middleChannelInLongerperiod] = getLCUCMC(longerPeriod) [lowestValueInTheShorterPeriodLength, highestValueInTheShorterPeriodLength, middleChannelInShorterperiod] = getLCUCMC(shorterPeriod) // Plot Upper Channel of longerPeriod in dark green plot(highestValueInTheLongerPeriodLength, 'highestValueInTheLongerPeriodLength', color=color.new(color.green, 0)) // Plot Lower Channel of shorterPeriod in dark red plot(lowestValueInTheShorterPeriodLength, 'lowestValueInTheShorterPeriodLength', color=color.new(color.red, 0)) // Entry Plan // Will start to see if we can enter when high crosses up longer period high (high >= highestValueInTheLongerPeriodLength) // Check if any of the three past candles and enter when any of the 3 past candles satisfy // 1) high of that candle >= highestValueInTheLongerPeriodLength of that candle (high[i] >= highestValueInTheLongerPeriodLength[i]) // 2) close of entry point consideration candle is above close of that candle (close > close[i]) isThisPointAnEntry() => // Check last 3 bars isThisPointAnEntry = false offset = 0 for i = 1 to 3 by 1 isCurrentCandleALongerPeriodHigh = high >= highestValueInTheLongerPeriodLength isCurrentCandleCloseGreaterThanPreiousIthOne = close > close[i] isPreviousIthCandleAlsoALongerPeriodHigh = high[i] >= highestValueInTheLongerPeriodLength[i] isThisPointAnEntry := isCurrentCandleALongerPeriodHigh and isCurrentCandleCloseGreaterThanPreiousIthOne and isPreviousIthCandleAlsoALongerPeriodHigh if isThisPointAnEntry offset := -i break [isThisPointAnEntry, offset] // Exit Plan - same as entry plan, with things reversed and also on a shorter time frame // Will start to see if we should exit when low crosses down longer period low (low <= lowestValueInTheShorterPeriodLength) // Check if any of the three past candles and exit when any of the 3 past candles satisfy // 1) low of that candle <= highestValueInTheLongerPeriodLength of that candle (low[i] <= lowestValueInTheShorterPeriodLength[i]) // 2) close of exit point consideration candle is below close of that candle (close < close[i]) isThisPointAnExit() => // Check last 3 bars isThisPointAnExit = false for i = 1 to 3 by 1 isCurrentCandleAShorterPeriodLow = low <= lowestValueInTheShorterPeriodLength isCurrentCandleCloseLesserThanPreiousIthOne = close < close[i] isPreviousIthCandleAlsoAShorterPeriodLow = low[i] <= lowestValueInTheShorterPeriodLength[i] isThisPointAnExit := isCurrentCandleAShorterPeriodLow and isCurrentCandleCloseLesserThanPreiousIthOne and isPreviousIthCandleAlsoAShorterPeriodLow break isThisPointAnExit [isEntry, offset] = isThisPointAnEntry() if isEntry strategy.entry('Buy', strategy.long) strategy.close_all(when=isThisPointAnExit() == true) if year(timenow) == year(time) and month(timenow) == month(time) and dayofmonth(timenow) - 2 == dayofmonth(time) strategy.close_all()