
Die Ruhe-Range-Umkehr-Strategie nutzt die Zeit, in der die Preisschwankungen niedriger sind, als Positionssignal, um bei erneuter Preisschwankungen eine Gewinnposition zu erlangen. Sie erfasst den bevorstehenden Preistrend durch die Identifizierung von Situationen, in denen die Preise in einer engen Ruhe-Range von Schwankungen eingeschränkt sind. Diese Strategie ist in der Regel bei derzeit niedrigen Schwankungen anwendbar, wenn jedoch in Zukunft ein Ausbruch möglich ist.
Die Strategie identifiziert zunächst den Ruhebereich, in dem der Preis innerhalb des Preises des vorangegangenen Handelstages eingeschränkt ist. Dies bedeutet, dass die aktuelle Volatilität in den letzten Tagen gesunken ist. Wir beurteilen, ob die Ruhebereichsbedingungen erfüllt sind, indem wir den höchsten Preis des aktuellen Handelstages mit dem höchsten Preis vor n Tagen (in der Regel 4 Tage) vergleichen und den niedrigsten Preis des aktuellen Handelstages mit dem niedrigsten Preis vor n Tagen vergleichen.
Sobald die Ruhe-Bereich bestätigt wird, wird die Strategie gleichzeitig zwei Aufträge zu öffnen: eine Kauf-Anlage in der Nähe der Spannweite der Spannweite, eine Verkauf-Anlage in der Nähe der Spannweite der Spannweite. Dann warten, bis der Preis brechen die Ruhe-Bereich weiter nach oben oder nach unten zu laufen.
Nach dem Aufbau einer Position setzt die Strategie eine Stop-Loss- und eine Stop-Out-Beschreibung ein. Die Stop-Loss-Beschreibung begrenzt das Abwärtsrisiko, die Stop-Off-Beschreibung wird verwendet, um nach dem Gewinn eine Position zu platzieren. Die Stop-Loss-Beschreibung ist eine proportionale Entfernung vom Einstiegspreis, die von den Risikomanagementparametern festgelegt wird.
Schließlich enthält die Strategie auch ein Modul für die Vermögensverwaltung. Durch die Anpassung der Geldmenge an den Auftragshandel durch die Methode des festen Multiplikators erhöht sich die Kapitalnutzung bei Gewinn und verringert sich das Risiko bei Verlust.
Diese Strategie hat folgende Vorteile:
Die Zeit, in der die Volatilität sinkt, kann als Signal für den Aufbau von Positionen genutzt werden, um Chancen zu ergreifen, bevor eine Preisentwicklung stattfindet.
Es gibt auch mehrere freie Zwei-Wege-Trading-Orders, um einen Auf- oder Abwärtstrend zu erfassen.
Ein Stop-Loss-Stopp-Strategie kann das Risiko eines einzelnen Handels effektiv kontrollieren.
Die Verwendung von Fixed-Rate-Finanzmanagement-Systemen kann die Effizienz der Verwendung von Geldern verbessern.
Die Strategie ist einfach, klar und einfach umzusetzen.
Die Strategie birgt auch einige Risiken, die beachtet werden müssen:
Risiko für Fehleinschätzungen in Richtung eines Bruchs in der Ruhezone. Der Preis kann nicht deutlich nach oben oder unten brechen, was zu einer Fehleinschätzung in Richtung des Einstiegs führt.
Die Gefahr, dass der Durchbruch nur eine kurzfristige Umkehrung ist.
Das Risiko, dass die Stop-Loss-Linie durchbrochen wird.
Das Risiko einer Vergrößerung der Verlustrisiken durch die Fixed-Rate-Multiplier-Methode. Die Fixed-Rate-Multiplier-Werte können reduziert werden, um das Risiko zu verringern.
Die falsche Einstellung der Parameter kann dazu führen, dass die Strategie nicht wirkt.
Die Strategie kann auch in folgenden Bereichen optimiert werden:
Erhöhung der Durchbruch- und Abweichungs-Filtersignale zur Vermeidung von Fehldurchbrüchen.
Verbesserte Stop-Loss-Strategien, z. B. bewegliche Stop-Loss-Strategien, Stop-Loss-Strategien für die Aufstellung von Aufschlägen usw.
Es ist wichtig, die Trends zu beurteilen und die Rückkehr zu vermeiden.
Optimierung der festen Multiplikatorwerte und Ausgleich der Gewinn- und Verlustquote.
In Kombination mit mehreren Zeitzyklus-Analysen erhöht sich die Gewinnwahrscheinlichkeit.
Automatische Optimierung der Parameter mittels maschineller Lernmethoden.
Die Gesamtkonzeption der Ruhezone-Umkehrstrategie ist klar und hat ein gewisses Gewinnpotenzial. Die Strategie-Stabilität kann durch Parameteroptimierung, Risikomanagement und Signalfilterung weiter verbessert werden. Jede Trendumkehrstrategie birgt jedoch ein gewisses Risiko.
/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
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/
// © gsanson66
//This code is based on the Narrow Range strategy
//Interactive Broker fees are applied on this strategy
//@version=5
strategy("NARROW RANGE BACKTESTING", shorttitle="NR BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, commission_type=strategy.commission.percent, commission_value=0.18)
//--------------------------------FUNCTIONS------------------------------------//
//@function to print label
debugLabel(txt, color) =>
label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)
//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)
//--------------------------------USER INPUTS------------------------------------//
//Narrow Range Length
nrLength = input.int(4, minval=2, title="Narrow Range Length", group="Strategy parameters")
//Risk Management
stopLossInput = input.float(0.5, title="Stop Loss (in percentage of reference range)", group="Strategy parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Janv 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")
//--------------------------------VARIABLES INITIALISATION--------------------------//
strategy.initial_capital = 50000
bool nr = na
var bool long = na
var bool short = na
var float stopPriceLong = na
var float stopLossLong = na
var float takeProfitLong = na
var float stopPriceShort = na
var float stopLossShort = na
var float takeProfitShort = na
var float takeProfit = na
var float stopLoss = na
bool inRange = na
int closedtrades = strategy.closedtrades
equity = math.abs(strategy.equity - strategy.openprofit)
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//
//Checking if the date belong to the range
inRange := true
//Checking performances of the strategy
if equity > capital_ref + fixedRatio
spread = (equity - capital_ref)/fixedRatio
nb_level = int(spread)
increasingOrder = nb_level * increasingOrderAmount
cashOrder := cashOrder + increasingOrder
capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
spread = (capital_ref - equity)/fixedRatio
nb_level = int(spread)
decreasingOrder = nb_level * increasingOrderAmount
cashOrder := cashOrder - decreasingOrder
capital_ref := capital_ref - nb_level*fixedRatio
//We check if a trade has been closed to cancel all previous orders
if closedtrades > closedtrades[1]
strategy.cancel("Long")
strategy.cancel("Short")
stopPriceLong := na
stopPriceShort := na
//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))
strategy.close_all()
long := na
short := na
stopPriceLong := na
stopLossLong := na
takeProfitLong := na
stopPriceShort := na
stopLossShort := na
takeProfitShort := na
takeProfit := na
stopLoss := na
//----------------------------------FINDING NARROW RANGE DAY------------------------------------------//
// We find the Narrow Range Day
if low > low[nrLength] and high < high[nrLength]
nr := true
//------------------------------------STOP ORDERS--------------------------------------------//
// We handle plotting of stop orders and cancellation of other side order if one order is triggered
if strategy.position_size > 0 and not na(stopPriceLong) and not na(stopPriceShort)
long := true
strategy.cancel("Short")
stopPriceLong := na
stopPriceShort := na
takeProfit := takeProfitLong
stopLoss := stopLossLong
if strategy.position_size < 0 and not na(stopPriceLong) and not na(stopPriceShort)
short := true
strategy.cancel("Long")
stopPriceLong := na
stopPriceShort := na
takeProfit := takeProfitShort
stopLoss := stopLossShort
//------------------------------------STOP LOSS & TAKE PROFIT--------------------------------//
// If an order is triggered we plot TP and SL
if not na(takeProfit) and not na(stopLoss) and long
if high >= takeProfit and closedtrades == closedtrades[1] + 1
takeProfit := na
stopLoss := na
long := na
if low <= stopLoss and closedtrades == closedtrades[1] + 1
takeProfit := na
stopLoss := na
long := na
if not na(takeProfit) and not na(stopLoss) and short
if high >= stopLoss and closedtrades == closedtrades[1] + 1
takeProfit := na
stopLoss := na
short := na
if low <= takeProfit and closedtrades == closedtrades[1] + 1
takeProfit := na
stopLoss := na
short := na
//-----------------------------LONG/SHORT CONDITION-------------------------//
// Conditions to create two stop orders (one for Long and one for Short) and SL & TP calculation
if nr and inRange and strategy.position_size == 0
stopPriceLong := high[4]
takeProfitLong := high[4] + (high[4] - low[4])
stopLossLong := high[4] - (high[4] - low[4])*stopLossInput
qtyLong = cashOrder/stopPriceLong
strategy.entry("Long", strategy.long, qtyLong, stop=stopPriceLong)
strategy.exit("Exit Long", "Long", limit=takeProfitLong ,stop=stopLossLong)
stopPriceShort := low[4]
takeProfitShort := low[4] - (high[4] - low[4])
stopLossShort := low[4] + (high[4] - low[4])*stopLossInput
qtyShort = cashOrder/stopPriceShort
strategy.entry("Short", strategy.short, qtyShort, stop=stopPriceShort)
strategy.exit("Exit Short", "Short", limit=takeProfitShort ,stop=stopLossShort)
//--------------------------PLOTTING ELEMENT----------------------------//
plotshape(nr, "NR", shape.arrowdown, location.abovebar, color.rgb(255, 132, 0), text= "NR4", size=size.huge)
plot(stopPriceLong, "Stop Order", color.blue, 3, plot.style_linebr)
plot(stopPriceShort, "Stop Order", color.blue, 3, plot.style_linebr)
plot(takeProfit, "Take Profit", color.green, 3, plot.style_linebr)
plot(stopLoss, "Stop Loss", color.red, 3, plot.style_linebr)