Cette stratégie consiste à négocier des écarts de Bollinger Bands, en prenant des positions contre tendance lorsque le prix traverse complètement la bande supérieure ou inférieure.
La stratégie utilise des bandes de Bollinger pour définir la fourchette de volatilité actuelle.
En particulier, les bandes intermédiaires, supérieures et inférieures sont calculées en utilisant les prix de clôture de 20 périodes. Un signal long est généré lorsque le prix se ferme en dessous de la bande inférieure après avoir ouvert plus haut. Un signal court est déclenché lorsque le prix se ferme au-dessus de la bande supérieure après avoir ouvert plus bas. Le point de rupture sert d'arrêt de perte et la bande intermédiaire est l'objectif de profit initial.
Les principaux avantages sont les suivants:
Les bandes de Bollinger mesurent efficacement la volatilité du marché pour identifier les anomalies.
Le point de rupture est un niveau de stop loss clair pour contrôler le risque.
La bande du milieu offre une cible raisonnable pour la réversion moyenne.
Les chandeliers remplis filtrent les fausses ruptures avec une plus grande fiabilité du signal.
Des paramètres simples facilitent la mise en œuvre et l'optimisation.
Une logique claire exprimée de façon concise dans le code.
Certains risques sont les suivants:
Les mauvais paramètres de BB peuvent invalider la stratégie.
Les écarts pourraient signaler le début de la tendance, risquant une sortie prématurée.
Les cibles de la bande moyenne peuvent être trop conservatrices, limitant les gains.
Les brèches larges peuvent ne pas se remplir complètement, ce qui provoque un glissement.
Les scellés peuvent entraîner des transactions inutiles excessives sur des marchés variés.
Quelques considérations d'amélioration:
Mesurer la force de la tendance pour ajuster les réglages ou la fréquence.
Ajoutez d'autres indicateurs pour affiner le timing de l'entrée.
Régler le stop-loss en fonction de la volatilité.
Optimiser les objectifs initiaux pour des profits fluides.
Mettre en œuvre des mécanismes de réintégration des gains composés.
Évaluer la validité de la rupture pour éviter les mauvaises transactions.
La stratégie consiste à échanger des écarts BB pour des bénéfices à court terme adaptés aux traders actifs. Les avantages sont un contrôle de risque clair tandis que les inconvénients sont des sorties précoces et un plafonnement des bénéfices.
/*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)