Strategi Perdagangan Penembusan Saluran Donchian

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

img

Gambaran umum

Strategi perdagangan penembusan saluran Donchian menilai tren harga saat ini dengan menghitung saluran harga tertinggi dan terendah selama periode tertentu dan perdagangan panjang dan pendek berdasarkan penembusan saluran.

Logika Strategi

Strategi ini membangun saluran dengan menghitung harga tertinggi pcmax dan harga terendah pcmin selama periode sejarah terakhir.

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

Jalur bawah yl = pcmin + (pcmax - pcmin) * persenDev/100

dimana %Dev default ke 13.

Sinyal panjang dihasilkan ketika harga menembus rel atas. Sinyal pendek dihasilkan ketika harga menembus rel bawah.

Logika khusus untuk menghasilkan sinyal perdagangan adalah:

  1. boundup = tinggi > yh untuk menentukan apakah rel atas rusak

  2. bounddn = low < yl untuk menentukan apakah rel bawah rusak

  3. upsign = sma(bounddn, 2) == 1 menggunakan sma dari bounddn untuk menentukan persisten pecahnya rel bawah

  4. dnsign = sma(boundup, 2) == 1 menggunakan sma dari boundup untuk menentukan persisten pecahnya rel atas

  5. exitup = dnsign breakout dari rel atas menghasilkan sinyal keluar

  6. exitdn = upsign breakout dari rel bawah menghasilkan sinyal keluar

  7. jika tanda atas dari rel bawah menghasilkan sinyal panjang

  8. jika tanda pecah dari rel atas menghasilkan sinyal pendek

Strategi ini juga menetapkan waktu awal dan akhir perdagangan untuk menghindari posisi overnight yang tidak perlu.

Keuntungan dari Strategi

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

  2. Memiliki baik sinyal panjang dan pendek, memungkinkan perdagangan dua arah

  3. Menggunakan SMA untuk menyaring sinyal dan menghindari perdagangan buruk

  4. Pengecualian stop loss untuk mengontrol risiko

  5. Menetapkan waktu awal dan akhir perdagangan untuk menghindari risiko overnight

Risiko dari Strategi

  1. Sensitif terhadap parameter sejarah dan %Dev, perlu dioptimalkan untuk produk yang berbeda

  2. Dapat menghasilkan sinyal palsu di pasar yang terikat rentang

  3. Tidak mempertimbangkan manajemen pesanan, dapat mempengaruhi profitabilitas dalam perdagangan langsung

  4. Tidak mempertimbangkan ukuran posisi, risiko posisi yang terlalu besar

  5. Tidak mempertimbangkan pengelolaan uang, membutuhkan modal perdagangan yang wajar

Gagasan Peningkatan

  1. Mengoptimalkan parameter riwayat dan percentDev untuk produk yang berbeda

  2. Tambahkan filter untuk menghindari sinyal palsu di pasar yang berbeda

  3. Tambahkan modul ukuran posisi untuk mengontrol ukuran posisi tunggal

  4. Tambahkan modul manajemen uang untuk membatasi ukuran total posisi

  5. Tambahkan manajemen order untuk eksekusi order yang optimal

Kesimpulan

Donchian channel breakout strategy menggunakan channel breakout untuk menentukan tren dan sinyal trading, dengan hasil backtest yang baik dan kemampuan untuk trading baik long maupun short. Namun, ada risiko mengenai optimasi parameter, filter, ukuran posisi, pengelolaan uang, manajemen order dll. Peningkatan yang tepat di bidang ini diperlukan sebelum perdagangan live stabil. Secara keseluruhan, ini adalah strategi trend tradisional, dan dengan optimasi dapat menjadi strategi trading kuantitatif yang dapat diandalkan.


/*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 banyak