Cette stratégie s'appelle
La stratégie repose principalement sur l'indicateur Bollinger Bands pour déterminer la tendance des prix et les points d'entrée.
Lorsque le prix se déplace vers le haut de la ligne inférieure à travers la ligne supérieure, une tendance haussière est identifiée. Lorsque le prix se déplace vers le bas de la ligne supérieure à travers la ligne inférieure, une tendance baissière a commencé.
Plus précisément, la logique de la stratégie est la suivante:
Pour éviter de fausses ruptures, un filtre de moyenne mobile est ajouté.
Ici, la moyenne mobile exponentielle est utilisée comme indicateur.
En résumé, les critères de détermination de la rupture de tendance sont les suivants:
Après l'entrée, le stop-loss suit la ligne médiane et sort quand le prix touche à nouveau la ligne médiane.
Les principaux points forts de cette stratégie sont les suivants:
Malgré les avantages, la stratégie comporte également les risques suivants:
Pour contrôler les risques susmentionnés, l'optimisation suivante peut être effectuée:
Sur la base de l'analyse des risques, d'autres optimisations peuvent être effectuées dans les domaines suivants:
Optimisation des paramètres: Utiliser des méthodes plus systématiques comme les algorithmes génétiques pour trouver des combinaisons optimales de paramètres pour les bandes et les moyennes mobiles, afin de rendre la stratégie plus stable et rentable.
Optimisation des pertes par arrêt: Tester différentes techniques de stop loss comme les stops ATR, les stops trailing, etc., afin de déterminer le meilleur mécanisme d'arrêt.
Optimisation des filtres: Essayez d'ajouter d'autres indicateurs tels que RSI, KD, etc. comme filtres supplémentaires, pour réduire les probabilités de faux signaux et augmenter le taux de rentabilité.
Optimisation des critères d'entrée: Ajoutez d'autres considérations comme les conditions de tendance, le VOLUME anormal, etc. pour sélectionner strictement le moment de l'entrée, éviter les entrées inutiles.
Apprentissage automatique: recueillir plus de données historiques pour construire des modèles LSTM, RNN et autres modèles d'apprentissage en profondeur, afin de permettre le meilleur timing d'entrée et de sortie basé sur l'IA.
Gestion dynamique du risque et de la récompense: Incorporer des arrêts de ratio fixe, une augmentation de l'objectif de profit après atteinte de certains niveaux de profit, etc. pour contrôler dynamiquement le risque-rendement.
Grâce à des optimisations dans les domaines ci-dessus, les indicateurs clés tels que la stabilité, la rentabilité, les capacités d'ajustement aux risques peuvent être améliorés de manière globale, transformant la stratégie en un algorithme de qualité de production adapté au trading en direct.
En conclusion, la
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //VERSION ================================================================================================================= //@version=5 // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // This strategy is intended to study. // It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen. // As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter. //Autor Credsonb (M4TR1X_BR) //▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //STRATEGY ================================================================================================================ strategy(title = 'BT-Bollinger Bands - Trend Following', shorttitle = 'BBTF', overlay = true ) //▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // CONFIG ================================================================================================================= // TIME INPUTS usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters") initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ") usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters") finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange") // TIME LOGIC inTradeWindow = true // ENABLE LONG SHORT OPTIONS string entrygroup ='Long/Short Options ===================================' checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup) checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup) // BOLLINGER BANDS INPUTS ================================================================================================== string bbgroup ='Bollinger Bands ======================================' bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup) bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup) //BOLLINGER BANDS LOGIC [bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev) // MOVING AVERAGES INPUTS ================================================================================================ string magroup = 'Moving Average =======================================' useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy') emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup) emaSource = input.source(defval=close,title=" Source",inline="", group= magroup) emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup) // MOVING AVERAGE LOGIC float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength) // BOT MESSAGES string msgroup='Alert Message For Bot ================================' messageEntry = input.string("", title="Strategy Entry Message",group=msgroup) messageExit =input.string("",title="Strategy Exit Message",group=msgroup) messageClose = input.string("", title="Strategy Close Message",group=msgroup) // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // POSITIONS ============================================================================================================= //VERIFY IF THE BUY FILTERS ARE ON OR OFF bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema) //LONG / SHORT POSITIONS LOGIC bool openLongPosition = (close[1] < bbUpper) and (close > bbUpper) and (emaFilterBuy) bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy) //bool closeLongPosition = (close > bbMiddle) //bool closeShortPosition= (close < bbLower) // CHEK OPEN POSITONS ===================================================================================================== // open signal when not already into a position bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0 bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0 bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0 bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0 longEntryPoint = high if (openLongPosition) and (inTradeWindow) and (checkboxLong) strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry) if not (openLongPosition) strategy.cancel('Long Entry') //submit exit orders for trailing take profit price if (longIsActive) and (inTradeWindow) strategy.exit(id = 'Long Exit', stop=bbMiddle, alert_message=messageExit) //if (closeLongPosition) // strategy.close(id = 'Long Entry', alert_message=messageClose) shortEntryPoint = low if (openShortPosition) and (inTradeWindow) and (checkboxShort) strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry) if not(openShortPosition) strategy.cancel('Short Entry') if (shortIsActive) strategy.exit(id = 'Short Exit', stop = bbMiddle, alert_message=messageExit) //if (closeShortPosition) //strategy.close(id = 'Short Close', alert_message=messageClose) // ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ // PLOTS =============================================================================================================== // TRADE WINDOW ======================================================================================================== bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window') // EMA/SMA var emafilterColor = color.new(color.white, 0) plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line) // BOLLINGER BANDS plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none) plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none) plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none) // PAINT BARS COLORS bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper) bool bears = (close[1] > bbLower [1]) and (close < bbLower) neutral_color = color.new(color.black, 100) barcolors = bulls ? color.green : bears ? color.red : neutral_color barcolor(barcolors) // ======================================================================================================================