Diese Strategie verwendet hauptsächlich die gleitenden Durchschnitts-Crossover-Signale des relativen Körperverhältnisses (RB) der täglichen Kerzen, um den Trend zusammen mit Stop-Loss und Take-Profit für den automatisierten Handel zu bestimmen.
Die Strategie basiert auf dem RBI-Indikator von Vitelot
Die Formel berechnet das Verhältnis des realen Körpers zur gesamten Länge des Leuchters für bullische Kerzen, wobei positive Werte und negative Werte für bärische Kerzen berücksichtigt werden.
Der RBI-Indikator verwendet den gleitenden Durchschnitt von RB, um Lärm auszufiltern und die Essenz der Markttrends zu erfassen.
Um falsche Signale in unsicheren Aufwärtsphasen zu vermeiden, wird auch geprüft, ob der Schlusskurs über der 13-Perioden-EMA liegt, bevor ein echtes Kaufsignal für eine Long-Position erzeugt wird.
Die Strategie implementiert auch Stop-Loss und Take-Profit, um Risiken zu kontrollieren und Gewinne zu erzielen.
Die RBI filtert signifikantes Rauschen aus und erfasst Markttrendmerkmale und vermeidet falsche Signale von unterschiedlichen Märkten.
Die Verwendung eines gleitenden Durchschnittsfilters verhindert während unsicherer Aufwärtstrends erfolgreich falsche Signale und reduziert damit Verluste durch Shorts.
Stop-Loss und Take-Profit helfen, das Verlustrisiko einzelner Positionen zu reduzieren und die Gewinne zu sichern, wodurch die Gesamtrentabilität verbessert wird.
Die Strategie hat nur wenige Parameter und ist leicht verständlich und für den automatisierten Handel geeignet.
Die Strategie beruht ausschließlich auf der RBI, alle falschen Signale aus dem Indikator könnten zum Scheitern führen.
Eine schlechte Einstellung der Indikatoren könnte auch die Qualität der Handelssignale verschlechtern.
Bei bestimmten Marktbedingungen können keine technischen Indikatoren Verluste vollständig vermeiden.
Eine zu enge Stop-Loss-Einstellung kann zu zu häufigen Stop-Outs führen; eine zu breite Stop-Loss-Einstellung kann zu großen Verlusten bei einzelnen Positionen führen.
Eine unzureichende Kontrolle der Auslastung könnte zu einem Risiko der Auslöschung des Kontos führen.
Zur Optimierung der RBI-Parameter können verschiedene Parameterkombinationen getestet werden.
Zusätzliche Indikatoren für die Signalfilterung und Qualitätsverbesserungen könnten hinzugefügt werden.
Maschinelles Lernen kann verwendet werden, um die Stop-Loss- und Take-Profit-Parameter zu trainieren und zu optimieren.
Risikomanagementstrategien können hinzugefügt werden, um die Gesamtposition und das Risikopositionsniveau zu kontrollieren.
Es könnten verschiedene Haltungszeiten wie Overnight-Holdings oder kurzfristige Scalping untersucht werden.
Insgesamt handelt es sich um eine relativ einfache und unkomplizierte Trendfolging-Strategie. Sie verwendet RBI-Crossover, um die Trendrichtung zu bestimmen, mit zusätzlichen Filtern und Stop-Loss/Take-Profit, um Risiken zu kontrollieren und damit falsche Signale aus verschiedenen Märkten effektiv zu vermeiden. Aber keine technischen Indikatoren können Risiken vollständig vermeiden. Kontinuierliche Verbesserungen wie Parameteroptimierung, Risikomanagement sind immer noch für langfristige stabile Überzugsrenditen erforderlich. Die Logik ist klar und leicht zu verstehen, geeignet für den automatisierten Handel. Es ist eine sehr praktische Trendfolging-Strategie.
/*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)