Strategi penembusan saluran Donchian adalah strategi trend yang berdasarkan saluran Donchian. Ia menggunakan tertinggi tertinggi dan terendah terendah dalam tempoh tertentu untuk menentukan titik kemasukan dan hentian kerugian untuk kedudukan panjang dan pendek.
Peraturan kemasukan adalah: pergi lama apabila harga memecahkan di atas tertinggi tertinggi dalam tempoh melihat kembali (contohnya 20 hari), dan pergi pendek apabila harga memecahkan di bawah terendah rendah dalam tempoh melihat kembali lain (contohnya 10 hari).
Peraturan EXIT adalah: Posisi panjang dihentikan di jalur tengah atau bawah saluran; Posisi pendek dihentikan di jalur tengah atau atas.
Sebagai contoh, perdagangan BTCUSDT dengan parameter berikut:
Peraturan masuk dan berhenti adalah:
Dengan menyesuaikan tempoh melihat semula secara dinamik, strategi boleh dioptimumkan merentasi kitaran pasaran untuk menangkap trend dengan ganjaran / risiko yang lebih baik.
Penembusan saluran Donchian menggunakan penembusan untuk mengenal pasti trend, dengan titik tengah saluran / pita sebagai berhenti untuk mengawal risiko. Mengoptimumkan tempoh melihat kembali boleh meningkatkan penangkapan trend dalam pergerakan yang kuat. Walau bagaimanapun, berhati-hati diperlukan mengenai kesahihan dan goncangan. Secara keseluruhan strategi ini sesuai untuk perdagangan trend jangka menengah hingga panjang, tetapi mungkin berjuang dalam pasaran yang bergolak.
/*backtest start: 2023-08-14 00:00:00 end: 2023-09-13 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Donchian Channel Strategy", overlay=true, default_qty_type= strategy.percent_of_equity, initial_capital = 1000, default_qty_value = 20, commission_type=strategy.commission.percent, commission_value=0.036) //Long optopns buyPeriodEnter = input(10, "Channel Period for Long enter position") buyPeriodExit = input(10, "Channel Period for Long exit position") isMiddleBuy = input(true, "Is exit on Base Line? If 'no' - exit on bottom line") takeProfitBuy = input(2.5, "Take Profit (%) for Long position") isBuy = input(true, "Allow Long?") //Short Options sellPeriodEnter = input(20, "Channel Period for Short enter position") sellPeriodExit = input(20, "Channel Period for Short exit position") isMiddleSell = input(true, "Is exit on Base Line? If 'no' - exit on upper line") takeProfitSell = input(2.5, "Take Profit (%) for Short position") isSell = input(true, "Allow Short?") // Test Start startYear = input(2005, "Test Start Year") startMonth = input(1, "Test Start Month") startDay = input(1, "Test Start Day") startTest = timestamp(startYear,startMonth,startDay,0,0) //Test End endYear = input(2050, "Test End Year") endMonth = input(12, "Test End Month") endDay = input(30, "Test End Day") endTest = timestamp(endYear,endMonth,endDay,23,59) timeRange = time > startTest and time < endTest ? true : false // Long&Short Levels BuyEnter = highest(buyPeriodEnter) BuyExit = isMiddleBuy ? ((highest(buyPeriodExit) + lowest(buyPeriodExit)) / 2): lowest(buyPeriodExit) SellEnter = lowest(sellPeriodEnter) SellExit = isMiddleSell ? ((highest(sellPeriodExit) + lowest(sellPeriodExit)) / 2): highest(sellPeriodExit) // Plot Data plot(BuyEnter, style=plot.style_line, linewidth=2, color=color.blue, title="Buy Enter") plot(BuyExit, style=plot.style_line, linewidth=1, color=color.blue, title="Buy Exit", transp=50) plot(SellEnter, style=plot.style_line, linewidth=2, color=color.red, title="Sell Enter") plot(SellExit, style=plot.style_line, linewidth=1, color=color.red, title="Sell Exit", transp=50) // Calc Take Profits TakeProfitBuy = 0.0 TakeProfitSell = 0.0 if strategy.position_size > 0 TakeProfitBuy := strategy.position_avg_price*(1 + takeProfitBuy/100) if strategy.position_size < 0 TakeProfitSell := strategy.position_avg_price*(1 - takeProfitSell/100) // Long Position if isBuy and timeRange strategy.entry("Long", strategy.long, stop = BuyEnter, when = strategy.position_size == 0) strategy.exit("Long Exit", "Long", stop=BuyExit, limit = TakeProfitBuy, when = strategy.position_size > 0) // Short Position if isSell and timeRange strategy.entry("Short", strategy.short, stop = SellEnter, when = strategy.position_size == 0) strategy.exit("Short Exit", "Short", stop=SellExit, limit = TakeProfitSell, when = strategy.position_size < 0) // Close & Cancel when over End of the Test if time > endTest strategy.close_all() strategy.cancel_all()