Strategi Perdagangan Penembusan Saluran Donchian

Penulis:ChaoZhang, Tarikh: 2023-11-08 12:31:56
Tag:

img

Ringkasan

Strategi perdagangan penembusan saluran Donchian menilai trend harga semasa dengan mengira saluran harga tertinggi dan terendah dalam tempoh tertentu dan berdagang panjang dan pendek berdasarkan penembusan saluran.

Logika Strategi

Strategi ini membina saluran dengan mengira harga tertinggi pcmax dan harga terendah pcmin dalam tempoh sejarah terakhir.

Rel atas yh = pcmax - (pcmax - pcmin) * (100 - peratusDev)/100

Rel bawah yl = pcmin + (pcmax - pcmin) * peratusDev/100

di mana peratusan Dev lalai kepada 13.

Isyarat panjang dihasilkan apabila harga menembusi rel atas. Isyarat pendek dihasilkan apabila harga menembusi rel bawah.

Logik khusus untuk menjana isyarat perdagangan adalah:

  1. boundup = tinggi > yh untuk menentukan sama ada rel atas rosak

  2. bounddn = rendah < yl untuk menentukan sama ada rel bawah rosak

  3. upsign = sma(bounddn, 2) == 1 menggunakan sma daripada bounddn untuk menentukan pecah berterusan rel bawah

  4. dnsign = sma(boundup, 2) == 1 menggunakan sma daripada boundup untuk menentukan pecah berterusan rel atas

  5. exitup = dnsign breakout rel atas menghasilkan isyarat keluar

  6. exitdn = upsign breakout rel bawah menghasilkan isyarat keluar

  7. jika tanda upbreakout rel bawah menghasilkan isyarat panjang

  8. jika gangguan tanda rel atas menghasilkan isyarat pendek

Strategi ini juga menetapkan waktu permulaan dan akhir dagangan untuk mengelakkan kedudukan semalam yang tidak perlu.

Kelebihan Strategi

  1. Menggunakan saluran Donchian untuk menentukan trend, hasil backtest yang baik

  2. Mempunyai kedua-dua isyarat panjang dan pendek, membolehkan perdagangan dua hala

  3. Menggunakan SMA untuk menapis isyarat dan mengelakkan perdagangan buruk

  4. Pendapatan yang diperolehi daripada pelaburan

  5. Tetapkan waktu permulaan dan akhir dagangan untuk mengelakkan risiko semalam

Risiko Strategi

  1. Sensitif kepada parameter sejarah dan peratusan Dev, memerlukan pengoptimuman untuk produk yang berbeza

  2. Boleh menghasilkan isyarat palsu di pasaran terhad julat

  3. Tidak mempertimbangkan pengurusan pesanan, mungkin memberi kesan kepada keuntungan dalam perdagangan langsung

  4. Tidak mengambil kira saiz kedudukan, risiko kedudukan yang terlalu besar

  5. Tidak mempertimbangkan pengurusan wang, memerlukan modal dagangan yang munasabah

Idea Peningkatan

  1. Mengoptimumkan parameter sejarah dan peratusanDev untuk produk yang berbeza

  2. Tambah penapis untuk mengelakkan isyarat palsu di pasaran pelbagai

  3. Tambah modul saiz kedudukan untuk mengawal saiz kedudukan tunggal

  4. Tambah modul pengurusan wang untuk mengehadkan saiz kedudukan keseluruhan

  5. Tambah pengurusan pesanan untuk pelaksanaan pesanan yang optimum

Kesimpulan

Strategi penembusan saluran Donchian menggunakan penembusan saluran untuk menentukan trend dan isyarat perdagangan, dengan hasil backtest yang baik dan keupayaan untuk berdagang baik panjang dan pendek. Walau bagaimanapun, terdapat risiko mengenai pengoptimuman parameter, penapis, saiz kedudukan, pengurusan wang, pengurusan pesanan dll. Peningkatan yang betul dalam bidang ini diperlukan sebelum perdagangan langsung yang stabil. Secara keseluruhan, ini adalah strategi trend tradisional, dan dengan pengoptimuman boleh menjadi strategi perdagangan kuantitatif yang boleh dipercayai.


/*backtest
start: 2023-10-31 00:00:00
end: 2023-11-07 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

////////////////////////////////////////////////////////////
//  Copyright by AlexInc v1.0 02/07/2018  @aav_1980
// PriceChannel strategy
// If you find this script helpful, you can also help me by sending donation to 
// BTC 16d9vgFvCmXpLf8FiKY6zsy6pauaCyFnzS
// LTC LQ5emyqNRjdRMqHPHEqREgryUJqmvYhffM
////////////////////////////////////////////////////////////
//@version=3
strategy("AlexInc PriceChannel Str", overlay=false)
history = input(20)
percentDev = input(13)
capital = input(100)

needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usestoploss = input(true, defval = true, title = "Stop Loss")
stoplossmult = input(3.8, defval = 3.8, minval = 1, maxval = 10, title = "Stop loss multiplicator")


fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

bodymin = min( open, close)
bodymax = max(open, close)

pcmax = highest(bodymax, history)
pcmin = lowest(bodymin, history)

yh = ((pcmax - pcmin) / 100 * (100 - percentDev)) + pcmin
yl = ((pcmax - pcmin) / 100 * percentDev) + pcmin

plot(pcmax)
plot(pcmin)
plot(yh)
plot(yl)

//1
bounddn = low < yl ? 1 : 0
boundup = high > yh ? 1 : 0
upsign = sma(bounddn, 2) == 1
dnsign = sma(boundup, 2) == 1
//2
//upsign = crossover(bodymin, yl)
//dnsign = crossunder(bodymax , yh)


exitup = dnsign
exitdn = upsign

lot = strategy.equity / close * capital / 100


xATR = atr(history)
nLoss = usestoploss ? stoplossmult * xATR : na

stop_level_long = 0.0
stop_level_long := nz(stop_level_long[1])

stop_level_short = 0.0
stop_level_short := nz(stop_level_short[1])

pos = strategy.position_size
if pos >0 and pos[1] <= 0 //crossover(pos, 0.5)
    stop_level_long = strategy.position_avg_price - nLoss
if pos < 0 and pos[1] >= 0 //crossunder(pos, -0.5)
    stop_level_short = strategy.position_avg_price + nLoss
if pos == 0    
    stop_level_long = bodymin - nLoss
    stop_level_short = bodymax + nLoss

//plot(bodymax + nLoss, color=red)
//plot(bodymin - nLoss, color=red)
plot(stop_level_long, color=red)
plot(stop_level_short, color=red)

if upsign
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dnsign
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)

if true
    strategy.close_all()


//if strategy.position_size != 0
//    strategy.exit("Exit Long", from_entry = "Long", stop = stop_level_long)
//    strategy.exit("Exit Short", from_entry = "Short", stop = stop_level_short)

Lebih lanjut