Chiến lược giao dịch dựa trên kênh Donchain

Tác giả:ChaoZhang, Ngày: 2024-02-27 14:57:37
Tags:

img

Tổng quan

Đâ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 logic

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.

  1. 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.

  2. 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ỡ.

Ưu điểm

  1. 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.

  2. 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.

  3. 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.

Rủi ro và giải pháp

  1. 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.

  2. Nó có thể kích hoạt giao dịch quá mức trên các thị trường khác nhau.

  3. 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.

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

  1. 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.

  2. Tích hợp logic dừng lỗ với các điểm dừng hợp lý để kiểm soát lỗ.

  3. 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.

Kết luận

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()



Thêm nữa