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.
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 utama ialah:
Bollinger Bands mengukur turun naik pasaran dengan berkesan untuk mengenal pasti anomali.
Titik pecah adalah tahap stop loss yang jelas untuk mengawal risiko.
Band tengah menawarkan sasaran yang munasabah untuk pembalikan purata.
Lilin penuh menyaring pecah palsu dengan kebolehpercayaan isyarat yang lebih besar.
Parameter mudah menjadikan pelaksanaan dan pengoptimuman mudah.
Logik yang bersih dinyatakan secara ringkas dalam kod.
Beberapa risiko termasuk:
Parameter BB yang lemah boleh membatalkan strategi.
Penembusan boleh menandakan permulaan trend, risiko keluar awal.
Sasaran kumpulan tengah mungkin terlalu konservatif, cap keuntungan.
Pecahan lebar mungkin tidak sepenuhnya mengisi, menyebabkan tergelincir.
Whipsaws boleh menyebabkan perdagangan yang berlebihan yang tidak bermakna di pasaran yang berbeza.
Beberapa pertimbangan penambahbaikan:
Mengukur kekuatan trend untuk menyesuaikan tetapan atau kekerapan.
Tambah penunjuk lain untuk menyesuaikan masa kemasukan.
Sesuaikan stop loss berdasarkan turun naik.
Mengoptimumkan sasaran awal untuk keuntungan yang lancar.
Melaksanakan mekanisme kemasukan semula untuk keuntungan kompaun.
Mengkaji keabsahan keluar untuk mengelakkan perdagangan yang buruk.
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)