Cette stratégie utilise principalement les signaux croisés de la moyenne mobile du rapport de corps relatif (RB) des bougies quotidiennes pour déterminer la tendance, ainsi que le stop loss et le profit pour le trading automatisé.
La stratégie est basée sur l'indicateur RBI de Vitelot
La formule calcule le rapport entre le corps réel et la longueur totale du chandelier pour les bougies haussières, en prenant des valeurs positives; et des valeurs négatives pour les bougies baissières.
L'indicateur RBI utilise la moyenne mobile de RB pour filtrer le bruit et capturer l'essence des tendances du marché.
Pour éviter de faux signaux lors de phases haussières incertaines, la stratégie vérifie également si le prix de clôture est supérieur à l'EMA de 13 périodes avant de générer un véritable signal d'achat pour une position longue.
La stratégie implémente également un stop loss et un take profit pour contrôler les risques et verrouiller les bénéfices.
La RBI filtre le bruit significatif et capture les caractéristiques de la tendance du marché, évitant ainsi les faux signaux provenant de marchés variés.
L'utilisation d'un filtre de moyenne mobile permet d'éviter efficacement les faux signaux pendant les phases haussières incertaines, réduisant ainsi les pertes des courts.
L'arrêt des pertes et la prise de profit contribuent à réduire le risque de perte sur les positions individuelles et à verrouiller les bénéfices, améliorant ainsi la rentabilité globale.
La stratégie a peu de paramètres et est facile à comprendre, adaptée au trading automatisé.
La stratégie repose uniquement sur la RBI, tout mauvais signal de l'indicateur pourrait conduire à l'échec.
Un mauvais réglage des paramètres de l'indicateur pourrait également aggraver la qualité des signaux de négociation.
Aucun indicateur technique ne peut éviter complètement les pertes dans certaines conditions de marché.
Un stop-loss trop serré peut entraîner des stop-outs trop fréquents; un stop-out trop large peut entraîner de grosses pertes sur des positions simples.
Un contrôle insuffisant du prélèvement pourrait entraîner des risques d'effacement du compte.
Différentes combinaisons de paramètres peuvent être testées pour optimiser les paramètres RBI.
Des indicateurs supplémentaires pourraient être ajoutés pour le filtrage des signaux et l'amélioration de la qualité.
L'apprentissage automatique peut être utilisé pour former et optimiser les paramètres de stop loss et de profit.
Des stratégies de gestion des risques peuvent être ajoutées pour contrôler la dimension globale des positions et l'exposition au risque.
On pourrait explorer différentes périodes de détention comme les détentions au jour le jour ou le scalping à court terme.
Dans l'ensemble, il s'agit d'une stratégie de suivi des tendances relativement simple et directe. Il utilise le croisement RBI pour déterminer la direction de la tendance, avec des filtres supplémentaires et un stop loss / take profit pour contrôler les risques, évitant efficacement les faux signaux des marchés variés. Mais aucun indicateur technique ne peut éviter complètement les risques. Des améliorations continues telles que l'optimisation des paramètres, la gestion des risques sont toujours nécessaires pour des rendements excédentaires stables à long terme. La logique est claire et facile à comprendre, adaptée au trading automatisé.
/*backtest start: 2022-10-11 00:00:00 end: 2023-10-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("RBI Backtest /w TSSL", shorttitle="RBI Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 10000, slippage = 5) // RBI: // The EMA of the relative body (RB) of Japanese candles is evaluated. // The RB of a candle (my definition) is simply the ratio of the body with respect to its full length // and taken positive for bull candles and negative for bear candles: // e.g. a bull "marubozo" has RB=1 a bear "marubozo" has RB=-1; // a "doji" has RB=0. // This simple indicator grasps the essence of the market by filtering out a great deal of noise. // // A flag can be selected to calculate its very basic binary version, where a bull candle counts as a one // and a bear candle counts as a minus one. // // Enter (or exit) the market when the signal line crosses the base line. // When the market is choppy we have a kind of alternating bear and bull candles so that // RBI is FLAT and usually close to zero. // Therefore avoid entering the market when RBI is FLAT and INSIDE the Exclusion level. // The exclusion level is to be set by hand: go back in history and check when market was choppy; a good // way to set it is to frame the oscillations of RBI whe price was choppy. // // RBI is more effective when an EMA of price is used as filtering. I found EMA(13) to be // a decent filter: go long when base crosses signal upwards AND closing price is above EMA(13); // same concept for going short. // // As any other indicator, use it with responsibility: THERE CAN'T BE A SINGLE MAGIC INDICATOR winning // all trades. // // Above all, have fun. // // Vitelot/Yanez/Vts March 31, 2019 par1 = input(5, title="MA1 Period") par2 = input(5, title="Signal Period") exclusion = input(0.2, title="Exclusion level") useBin = input(false, title="Calculate the binary version") treshold_long = input(0, title="Treshold Long") treshold_short = input(0, title="Treshold Short") fixedSL = input(title="SL Activation", defval=300) trailSL = input(title="SL Trigger", defval=1) fixedTP = input(title="TP Activation", defval=120) trailTP = input(title="TP Trigger", defval=1) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2017) ToMonth = input(defval = 6, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 19, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 2020, title = "To Year", minval = 2017) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window startTimeOk() => true // create function "within window of time" if statement true ynSimple(t) => s = (close>open)? 1: -1 ema(sum(s,t),t) ynRel(t) => s = (close-open)/(high-low) ema(sum(s,t),t) yn = useBin? ynSimple(par1): ynRel(par1) sig = ema(yn,par2) plot(yn, color=aqua, title="RBI", linewidth=3, transp=0) plot(sig, color=orange, title="Signal", linewidth=2, transp=0) hline(0, color=white, title="Zero level", editable=false) hline(exclusion, color=yellow, title="Exclusion level +", editable=true, linestyle=line) hline( 0-exclusion, color=yellow, title="Exclusion level -", editable=true, linestyle=line) long = crossover(yn,sig) and yn < treshold_long short = crossover(sig,yn) and yn > treshold_short // === STRATEGY - LONG POSITION EXECUTION === strategy.entry("Long", strategy.long, when= long and startTimeOk()) strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) strategy.exit("Exit", when= short) // === STRATEGY - SHORT POSITION EXECUTION === strategy.entry("Short", strategy.short, when= short and startTimeOk()) strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) strategy.exit("Exit", when= long)