RSI-Mittel-Reversionspreisschwankungen Strategie

Schriftsteller:ChaoZhang, Datum: 2023-09-26 19:55:03
Tags:

Übersicht

Diese Strategie identifiziert Überverkaufsmöglichkeiten mithilfe des RSI-Indikators und nimmt bei Preisrückgängen in Chargen Positionen ein, um die Kostenbasis schrittweise zu senken und langfristige Gewinne zu erzielen.

Strategie Logik

Die Strategie berechnet zunächst den RSI-Indikator, um festzustellen, ob der Markt überverkauft ist. Wenn der RSI unter 30 liegt, signalisiert er eine Überverkaufsmöglichkeit. In diesem Fall wird eine Long-Position eröffnet, wenn der Preis unter dem gleitenden Durchschnitt der 100-Perioden liegt.

Nach der Eröffnung der Position setzt die Strategie 6 mittlere Reversionspreisniveaus auf 98%, 97%, 95%, 90%, 84% und 70% des aktuellen Preises fest. Wenn der Preis diese Niveaus erreicht, werden weitere Positionen hinzugefügt. Durch ständiges Durchschnittsverhalten kann die Kostenbasis der Position gesenkt werden.

Darüber hinaus wird der durchschnittliche Kurs der Position berechnet. Profit Taking beginnt, wenn der Preis mehr als 5% über dem Durchschnittspreis steigt. Auch wenn der Preis weiterhin über den 5% Take Profit Preis des Durchschnittspreises steigt, werden alle Positionen geschlossen.

Schließlich wird ein DCA-Mechanismus in die Strategie integriert.Jeden Montag, wenn offene Positionen vorhanden sind und der Preis unter dem Durchschnittspreis liegt, wird der Position ein fester Betrag hinzugefügt, wodurch die Kostenbasis weiter reduziert wird.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht in der Nutzung von Abwärtsdurchschnitten und DCA-Mechanismen zur Risikokontrolle.

  1. Die Einnahme von Positionen in Chargen diversifiziert das Eröffnungsrisiko und verhindert, dass der Tiefpunkt verfehlt wird.

  2. Durch die Festlegung mehrerer mittlerer Reversionspreisniveaus wird die Kostenbasis stetig gesenkt und das Abwärtsrisiko gemanagt.

  3. Die Berechnung des durchschnittlichen Positionspreises ermöglicht eine rechtzeitige Gewinnentnahme und Gewinnbindung, wenn die Position im Green steht.

  4. Die Anwendung von DCA reduziert die Kostenbasis weiter und kontrolliert das Risiko.

  5. Die Verwendung des RSI-Indikators verhindert die Eröffnung von Positionen an den Spitzen.

  6. Der gleitende Durchschnittsfilter vermeidet Umkehrgeschäfte.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Die Strategie kann keine Wendepunkte für den Markt bestimmen.

  2. Es gibt keinen Stop-Loss-Mechanismus zur wirksamen Kontrolle von Einzelhandelsverlusten.

  3. Es gibt keine Begrenzung für die Anzahl der Positionen, was zu ungewollten Zusätzen führen kann, wenn der Markt heftig zusammenbricht.

  4. DCA birgt ein Zeitrisiko und garantiert keine Eröffnung von Positionen am Tiefpunkt.

Mögliche Lösungen:

  1. Verwenden Sie andere Indikatoren, um die Marktstruktur zu beurteilen, anstatt sich ausschließlich auf den RSI zu verlassen.

  2. Hinzufügen von beweglichen oder gestaffelten Stop-Loss.

  3. Begrenzen Sie die Anzahl der Positionszusätze.

  4. Optimieren Sie die DCA-Eingangslogik zu einem stabileren Mechanismus.

Optimierungsrichtlinien

Die Strategie kann wie folgt verbessert werden:

  1. Optimieren Sie den Algorithmus der mittleren Reversion zu einem wissenschaftlicheren Ansatz.

  2. Verbessern Sie die Profit-taking-Mechanismen, wie z. B. Trailing-Stop oder Schichten-Profit-taking.

  3. Hinzufügen von Stop-Loss für eine bessere Kontrolle des Einzelhandelsrisikos.

  4. Einbeziehung anderer Indikatoren für die Analyse der Marktstruktur anstelle des reinen RSI.

  5. Optimieren Sie die DCA-Logik, um Festzeit-Eintrittsrisiken zu vermeiden.

  6. Zusätzliche Positionsgröße zur Optimierung der Gesamtgröße.

  7. Optimierung der Parameter für die statistischen Merkmale des Marktes.

  8. Hinzufügen einer Logik zur Anpassung an verschiedene Marktregime.

Schlussfolgerung

Zusammenfassend ist dies eine langfristige Anlagestrategie, die RSI für das Timing und die Durchschnittswerte mit mehreren Einträgen auf niedrigerer Kostenbasis nutzt. Es eignet sich gut für den aktuellen volatilen Kryptowährungsmarkt, um Positionskosten während unterschiedlicher Perioden zu verwalten. Es gibt auch Raum für die Verbesserung der Mechanismen, um mehr Indikatoren für die Marktanalyse und das Risikomanagement zu integrieren, damit die Strategie in komplexeren Umgebungen gedeihen kann.


/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
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/
//@version=4
// © A3Sh

// RSI Strategy that buys the dips, works with Price Averaging and has a Dollar Cost Average option.
// When the price drops below specified percentages of the price (6 PA layers), new entries are openend to average the price of the assets.
// Open entries are closed by a specified take profit.
// Entries can be reopened, after closing and consequently crossing a PA layer again.
// The idea is to lower the average position price to a point that when the market rises, the current price crosses over the average position price.
// When the current price crosses the average position size and reaches the specified take profit, all entries are closed at once.
// In case the market drops significantly, there is an option to activate DCA to lower the average price further.

// RSI code adapted from the Optimized RSI Buy the Dips strategy, by Coinrule
// https://www.tradingview.com/script/Pm1WAtyI-Optimized-RSI-Strategy-Buy-The-Dips-by-Coinrule/
// Pyramiding entries code adapted from Pyramiding Entries on Early Trends startegy, by Coinrule
// https://www.tradingview.com/script/7NNJ0sXB-Pyramiding-Entries-On-Early-Trends-by-Coinrule/
// Plot entry layers code adapted from HOWTO Plot Entry Price by vitvlkv
// https://www.tradingview.com/script/bHTnipgY-HOWTO-Plot-Entry-Price/
// Buy every week code based on the following question in Stack Overflow
// https://stackoverflow.com/questions/59870411/in-pine-script-how-can-you-do-something-once-per-day-or-keep-track-if-somethin


strategy(title = "RSI+PA+DCA", pyramiding = 16, overlay = true, initial_capital = 400, default_qty_type = strategy.percent_of_equity, default_qty_value = 15, commission_type = strategy.commission.percent, commission_value = 0.075)

port = input(15, title = "Portfolio %", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
q = (strategy.equity / 100 * port) / open

// Long position entry layers. Percentage from the entry price of the the first long
PositionInputs = input("++++", title = "+++++ Long Positions VA Layers +++++")

ps2 = input(2,  title = "2nd Long Entry %", step = 0.1)
ps3 = input(3,  title = "3rd Long Entry %", step = 0.1)
ps4 = input(5,  title = "4th Long Entry %", step = 0.1)
ps5 = input(10, title = "5th Long Entry %", step = 0.1)
ps6 = input(16, title = "6th Long Entry %", step = 0.1)


// Calculate Moving Averages
maInput = input("++++", title = "+++++ Moving Average Filter +++++")

plotMA = input(title = "Plot Moving Average", defval = false)
movingaverage_signal = sma(close, input(100))
plot (plotMA ? movingaverage_signal : na, color = color.white)

// RSI inputs and calculations
rsiInput = input( "++++", title = "+++++ RSI Inputs +++++" )

length =     input( 14 )
overSold =   input( 30, title = "oversold, entry trigger long position" )
overBought = input( 70, title = "overbought, has no specific function")
price = close
vrsi = rsi(price, length)

// Long trigger (co)
co = crossover(vrsi, overSold) and close < movingaverage_signal

// Take profit
takeprofit = input("++++", title = "+++++ Take Profit +++++")

ProfitTarget_Percent = input(5)


// Store values to create and plot the different DCA layers
long1 = valuewhen(co, close, 0)
long2 = valuewhen(co, close - (close / 100 * ps2), 0)
long3 = valuewhen(co, close - (close / 100 * ps3), 0)
long4 = valuewhen(co, close - (close / 100 * ps4), 0)
long5 = valuewhen(co, close - (close / 100 * ps5), 0)
long6 = valuewhen(co, close - (close / 100 * ps6), 0)

eps1 = 0.00
eps1 := na(eps1[1]) ? na : eps1[1]

eps2 = 0.00
eps2 := na(eps2[1]) ? na : eps2[1]

eps3 = 0.00
eps3 := na(eps3[1]) ? na : eps3[1]

eps4 = 0.00
eps4 := na(eps4[1]) ? na : eps4[1]

eps5 = 0.00
eps5 := na(eps5[1]) ? na : eps5[1]

eps6 = 0.00
eps6 := na(eps6[1]) ? na : eps6[1]

plot (strategy.position_size > 0 ? eps1 : na, title = "Long entry 1", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps2 : na, title = "Long entry 2", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps3 : na, title = "Long entry 3", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps4 : na, title = "Long entry 4", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps5 : na, title = "Long entry 5", style = plot.style_linebr)
plot (strategy.position_size > 0 ? eps6 : na, title = "Long entry 6", style = plot.style_linebr)


// Plot position average price
plot (strategy.position_avg_price, title = "Average price", style = plot.style_linebr, color = color.red, linewidth = 2)


// Take profit and exit all on take profit above position average price
tpv = strategy.position_avg_price + (strategy.position_avg_price / 100 * ProfitTarget_Percent)

tpl1 = close < tpv ? eps1 + close * (ProfitTarget_Percent / 100) : tpv
tpl2 = close < tpv ? eps2 + close * (ProfitTarget_Percent / 100) : tpv
tpl3 = close < tpv ? eps3 + close * (ProfitTarget_Percent / 100) : tpv
tpl4 = close < tpv ? eps4 + close * (ProfitTarget_Percent / 100) : tpv
tpl5 = close < tpv ? eps5 + close * (ProfitTarget_Percent / 100) : tpv
tpl6 = close < tpv ? eps6 + close * (ProfitTarget_Percent / 100) : tpv


// Open DCA order once at the start of the week
dcaWeek = input("++++", title = "+++++ Open DCA order once every week +++++")

newWeek = change(time("W"))
dcatime = input(title = "Buy a fixed amount every Monday", defval = false)
fixedAmount = input(40, title = "Fixed amount currency for DCA orders", step = 0.1)
dcaq = fixedAmount / open
plotchar (dcatime ? newWeek : na, "buy at Week start", "▼", location.top, size = size.tiny, color = color.white)
bgcolor (dcatime and newWeek ? color.white : na, transp = 50)

// Submit entry orders
if (co and strategy.opentrades == 0)
    eps1 := long1
    eps2 := long2
    eps3 := long3
    eps4 := long4
    eps5 := long5
    eps6 := long6

    strategy.entry("Long1", strategy.long, q)

if (strategy.opentrades == 1)
    strategy.entry("Long2", strategy.long, q, limit = eps2)

    
if (strategy.opentrades == 2)
    strategy.entry("Long3", strategy.long, q, limit = eps3)


if (strategy.opentrades == 3)
    strategy.entry("Long4", strategy.long, q, limit = eps4)


if (strategy.opentrades == 4)
    strategy.entry("Long5", strategy.long, q, limit = eps5)

    
if (strategy.opentrades == 5) 
    strategy.entry("Long6", strategy.long, q, limit = eps6)
    
// Submit Weekly DCA order, only when price is below position average price and when a position is open
if (dcatime and newWeek and strategy.position_size > 0 and close < strategy.position_avg_price) 
    strategy.entry("DCA", strategy.long, dcaq)


// Exit orders
if (strategy.position_size > 0)
    strategy.exit(id = "Exit 1", from_entry = "Long1", limit = tpl1)
    strategy.exit(id = "Exit 2", from_entry = "Long2", limit = tpl2)
    strategy.exit(id = "Exit 3", from_entry = "Long3", limit = tpl3)
    strategy.exit(id = "Exit 4", from_entry = "Long4", limit = tpl4)
    strategy.exit(id = "Exit 5", from_entry = "Long5", limit = tpl5)
    strategy.exit(id = "Exit 6", from_entry = "Long6", limit = tpl6)
    strategy.exit(id = "Exit DCA", from_entry = "DCA", limit = tpv)
 

// Make sure that all open limit orders are canceled after exiting all the positions 
longClose = strategy.position_size[1] > 0 and strategy.position_size == 0 ? 1 : 0   
if longClose
    strategy.cancel_all()





Mehr