Эта стратегия торгует прорывами полос Боллинджера, занимая позиции против тренда, когда цена полностью пробивает верхнюю или нижнюю полосу.
Стратегия использует полосы Боллинджера для определения текущего диапазона волатильности.
В частности, средние, верхние и нижние диапазоны рассчитываются с использованием цен закрытия 20 периодов. Долгий сигнал генерируется, когда цена закрывается ниже нижней полосы после открытия выше. Короткий сигнал запускается, когда цена закрывается выше верхней полосы после открытия ниже. Точка прорыва служит стоп-лосом, а средняя полоса является первоначальной целью прибыли.
Основными преимуществами являются:
Боллингерские полосы эффективно измеряют волатильность рынка для выявления аномалий.
Точка прорыва - это четкий уровень стоп-лосса для контроля риска.
Средняя полоса предлагает разумную цель для средней реверсии.
Полные свечи фильтруют ложные перерывы с большей надежностью сигнала.
Простые параметры облегчают реализацию и оптимизацию.
Чистая логика, изложенная в коде.
Некоторые риски включают:
Плохие параметры BB могут отменить стратегию.
Прорыв может сигнализировать о начале тренда, рискуя преждевременным выходом.
Цели среднего диапазона могут быть слишком консервативными, ограничивая прибыль.
Широкие переломы могут не заполняться полностью, вызывая скольжение.
Ушибки могут привести к чрезмерным бесполезным сделкам на различных рынках.
Некоторые соображения по улучшению:
Измерить силу тренда для регулировки настроек или частоты.
Добавьте другие показатели для тонкой настройки времени входа.
Корректировка стоп-лосса на основе волатильности.
Оптимизируйте первоначальные цели для плавной прибыли.
Реализовать механизмы реинтрота в совокупные прибыли.
Оценить действенность выхода, чтобы избежать плохих сделок.
Стратегия торгует прорывами BB для краткосрочной прибыли, подходящей для активных трейдеров.
/*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)