Strategi Dagangan Bollinger Band Breakout

Penulis:ChaoZhang, Tarikh: 2023-10-07 09:59:11
Tag:

Ringkasan

Strategi ini memperdagangkan breakout Bollinger Bands, mengambil kedudukan kontra trend apabila harga sepenuhnya menembusi jalur atas atau bawah. Ia bertujuan untuk menangkap pembalikan purata selepas turun naik yang tidak normal. Ia sesuai dengan peniaga aktif yang mencari keuntungan cepat.

Prinsip

Strategi ini menggunakan Bollinger Bands untuk menentukan julat turun naik semasa. Apabila harga membentuk lilin penuh di atas band atas atau di bawah band bawah, ia menunjukkan keadaan yang sangat turun naik dan potensi pembalikan ke arah purata.

Secara khusus, jalur tengah, atas dan bawah dikira menggunakan harga penutupan 20 tempoh. Isyarat panjang dihasilkan apabila harga ditutup di bawah jalur bawah selepas membuka lebih tinggi. Isyarat pendek dicetuskan apabila harga ditutup di atas jalur atas selepas membuka lebih rendah. Titik pecah berfungsi sebagai stop loss dan jalur tengah adalah sasaran keuntungan awal.

Kelebihan

Kelebihan utama ialah:

  1. Bollinger Bands mengukur turun naik pasaran dengan berkesan untuk mengenal pasti anomali.

  2. Titik pecah adalah tahap stop loss yang jelas untuk mengawal risiko.

  3. Band tengah menawarkan sasaran yang munasabah untuk pembalikan purata.

  4. Lilin penuh menyaring pecah palsu dengan kebolehpercayaan isyarat yang lebih besar.

  5. Parameter mudah menjadikan pelaksanaan dan pengoptimuman mudah.

  6. Logik yang bersih dinyatakan secara ringkas dalam kod.

Risiko

Beberapa risiko termasuk:

  1. Parameter BB yang lemah boleh membatalkan strategi.

  2. Penembusan boleh menandakan permulaan trend, risiko keluar awal.

  3. Sasaran kumpulan tengah mungkin terlalu konservatif, cap keuntungan.

  4. Pecahan lebar mungkin tidak sepenuhnya mengisi, menyebabkan tergelincir.

  5. Whipsaws boleh menyebabkan perdagangan yang berlebihan yang tidak bermakna di pasaran yang berbeza.

Peningkatan

Beberapa pertimbangan penambahbaikan:

  1. Mengukur kekuatan trend untuk menyesuaikan tetapan atau kekerapan.

  2. Tambah penunjuk lain untuk menyesuaikan masa kemasukan.

  3. Sesuaikan stop loss berdasarkan turun naik.

  4. Mengoptimumkan sasaran awal untuk keuntungan yang lancar.

  5. Melaksanakan mekanisme kemasukan semula untuk keuntungan kompaun.

  6. Mengkaji keabsahan keluar untuk mengelakkan perdagangan yang buruk.

Kesimpulan

Strategi ini memperdagangkan penembusan BB untuk keuntungan jangka pendek yang sesuai dengan peniaga aktif. Pro adalah kawalan risiko yang jelas manakala kontra adalah keluar awal dan cap keuntungan. Parameter penyesuaian halus, menambah penapis dan lain-lain boleh meningkatkan prestasi.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 3h
basePeriod: 15m
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/
// © Bishnu103

//@version=4
strategy(title="Full Candle Outside BB [v1.0][Bishnu103]",shorttitle="OUTSIDE BB",overlay=true,calc_on_every_tick=true,backtest_fill_limits_assumption=2)

// ***********************************************************************************************************************
// input variables
buy_session         = input(title="Buy Session", type=input.session, defval="0915-1430")
exit_inraday        = input(title="Exit Intraday?", type=input.bool, defval=true)
entry_distance      = input(title="Entry distance from alert", minval=1, maxval=10, defval=3)
show_bb_switch      = input(title="Show BB", type=input.bool, defval=true)
//
bbLength            = input(title="BB Length", minval=1, defval=20)
bbStdDev            = input(title="BB StdDev", minval=1, defval=2)

// ***********************************************************************************************************************
// global variables
long_entry          = false
short_entry         = false
long_exit           = false
short_exit          = false

// variable values available across candles
var entry_price     = 0.0  
var sl_price        = 0.0
var exit_price      = 0.0
var candle_count    = 0

// ***********************************************************************************************************************
// function to return bollinger band values based on candle poition passed 
getBB(pos) => [mBB, uBB, lBB] = bb(close[pos], bbLength, bbStdDev)

// function returns true if current time is within intraday byuing session set in input
BarInSession(sess) => time(timeframe.period, sess) != 0

// ***********************************************************************************************************************
// strategy
//
// get current bb value
[mBB_0,uBB_0,lBB_0] = getBB(0)

// check if full candle outside upper BB
outside_uBB = low > uBB_0 and close <= open
outside_lBB = high < lBB_0 and close >= open

// ***********************************************************************************************************************
// entry conditions 
long_entry   := outside_lBB
short_entry  := outside_uBB

// keep candle count since the alert generated so that order can be cancelled after N number of candle calling it out as invalid alert
candle_count := candle_count + 1
if long_entry or short_entry
    candle_count    := 0

// ***********************************************************************************************************************
// risk management
//
// decide entry and sl price
if long_entry
    entry_price := high
    
if short_entry
    entry_price := low
    
if long_entry
    sl_price    := low
    
if short_entry
    sl_price    := high

// first exit is when price hits middle BB, gets updated for each candle based on it's middle BB value
exit_price  := mBB_0

// ***********************************************************************************************************************
// position sizing
price = if close[0] > 25000
    25000
else
    price = close[0]

qty = 25000/price

// ***********************************************************************************************************************
// entry
//if long_entry and strategy.position_size == 0
//    strategy.entry("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price)) 
if long_entry and strategy.position_size == 0
    strategy.order("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price))

//if short_entry and strategy.position_size == 0
//    strategy.entry("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))
if short_entry and strategy.position_size == 0
    strategy.order("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))

// cancel an order if N number of candles are completed after alert candle
strategy.cancel_all(candle_count > entry_distance)

// if current time is outside byuing session then do not enter intraday trade
strategy.cancel_all(timeframe.isintraday and not BarInSession(buy_session))

// ***********************************************************************************************************************
// exit
if strategy.position_size > 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.short, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

if strategy.position_size < 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.long, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

// if intraday trade, close the trade at open of 15:15 candle //!!!!!!!!!!!!!!!!!!!!! TO BE CORRECTED !!!!!!!!!!!!!!!!!!!!!!!
if timeframe.isintraday and exit_inraday and hour == 15 and minute == 00
    strategy.close("BUY",  when=strategy.position_size > 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))
    strategy.close("SELL", when=strategy.position_size < 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))

// ***********************************************************************************************************************
// plots    
//
// plot BB
[mBBp,uBBp,lBBp] = getBB(0)
p_mBB = plot(show_bb_switch ? mBBp : na, color=color.teal)
p_uBB = plot(show_bb_switch ? uBBp : na, color=color.teal)
p_lBB = plot(show_bb_switch ? lBBp : na, color=color.teal)
fill(p_uBB,p_lBB,color=color.teal,transp=95)

Lebih lanjut