Strategi dagangan berdasarkan saluran Donqi berskala berperingkat


Tarikh penciptaan: 2024-02-27 14:57:37 Akhirnya diubah suai: 2024-02-27 14:57:37
Salin: 0 Bilangan klik: 657
1
fokus pada
1617
Pengikut

Strategi dagangan berdasarkan saluran Donqi berskala berperingkat

Gambaran keseluruhan

Ini adalah strategi perdagangan yang menggunakan saluran tangki pada skala masa yang banyak untuk menentukan titik masuk dan keluar. Gagasan utama strategi ini adalah: menilai arah trend pada skala masa yang lebih lama untuk mencari masa masuk; menilai pembalikan trend pada skala masa yang lebih pendek untuk mencari masa keluar.

Prinsip Strategi

Strategi ini terutamanya menggunakan konsep saluran tangki. Saluran tangki terdiri daripada saluran atas, saluran bawah dan saluran tengah. Lebar saluran berubah mengikut skala masa. Di sini kita membina saluran tangki dengan skala masa yang berbeza, khususnya:

  1. Menggunakan 52 kitaran untuk membina saluran tangki dengan skala masa yang lebih lama, yang diperoleh di sepanjang saluran, di bawah dan di tengah
  2. Membina saluran tangki dengan skala masa yang lebih pendek menggunakan 12 kitaran, dan mendapat garis atas, bawah dan tengah saluran

Logik kemasukan: Apabila harga menembusi sepanjang saluran skala masa yang lebih lama, ia dianggap sebagai masa masuk berbilang mata. Untuk mengelakkan penembusan palsu, kami memerlukan sekurang-kurangnya 1 daripada 3 K baris terakhir untuk menutup harga lebih tinggi daripada sepanjang saluran K ini, yang dapat mengelakkan penembusan palsu yang disebabkan oleh meluas jangka pendek.

Logik Keluar: Apabila harga jatuh di bawah saluran skala masa yang lebih pendek, maka ia adalah masa untuk keluar dari kedudukan kosong. Kami juga memerlukan sekurang-kurangnya satu daripada 3 K-baris terakhir untuk menutup harga K-baris yang lebih rendah daripada saluran bawah K-baris tersebut, untuk mengesahkan kesahihan penembusan dan mengelakkan pegangan.

Kelebihan Strategik

  1. Strategi ini menggabungkan kelebihan trend tracking dan perdagangan reversal. Skala masa yang lebih lama menentukan arah trend, dan skala masa yang lebih pendek menentukan reversal tempatan. Kedua-duanya digabungkan untuk menangkap turun naik tempatan dalam trend.

  2. Menggunakan analisis skala masa yang lebih banyak, anda dapat menangani masalah penembusan palsu dengan lebih baik, menjadikan masuk dan keluar lebih jelas dan berkesan.

  3. Dengan pengoptimuman parameter, ia boleh disesuaikan dengan pelbagai jenis dan keadaan pasaran.

Risiko dan penyelesaian

  1. Strategi ini sensitif kepada parameter, dan parameter yang berbeza mungkin menghasilkan hasil yang berbeza. Perlu diuji dan dioptimumkan dengan baik untuk mencari kombinasi parameter yang terbaik.

  2. Dalam keadaan yang bergolak, strategi mungkin menghasilkan banyak isyarat perdagangan, yang menyebabkan perdagangan berlebihan. Kerugian tunggal boleh dikawal dengan konfigurasi hentian.

  3. Strategi ini tidak mengambil kira logik penilaian trend peringkat besar, dan mungkin gagal pada titik peralihan lembu dan lembu. Ia boleh digabungkan dengan petunjuk lain untuk menilai pergerakan peringkat besar.

Arah pengoptimuman

  1. Optimumkan parameter untuk mencari kombinasi parameter terbaik. Parameter seperti panjang kitaran pengoptimuman, jenis saluran.

  2. Tambah logik hentian kerugian. Mengkonfigurasi hentian bergerak yang munasabah, mengawal kerugian tunggal.

  3. Menggabungkan dengan petunjuk lain untuk menilai trend peringkat besar. Sebagai contoh, EMA, K Line Channel, Indeks Mac dan sebagainya. Elakkan kegagalan pada titik-titik penting.

ringkaskan

Strategi ini secara keseluruhannya adalah strategi penembusan saluran pelbagai skala masa yang tipikal. Ia menggabungkan keunggulan pengesanan trend dan perdagangan pembalikan dengan baik, dengan penilaian saluran dari pelbagai skala masa untuk mencapai kesan yang menangkap turun naik tempatan dalam trend.

Kod sumber strategi
/*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()