RSI- und OTT-Band-Strategieanalyse


Erstellungsdatum: 2023-10-09 16:21:20 zuletzt geändert: 2023-10-09 16:21:20
Kopie: 0 Klicks: 714
1
konzentrieren Sie sich auf
1617
Anhänger

Überblick

Die Strategie wird als RSI_OTT-TP/SL bezeichnet. Die Strategie kombiniert RSI-Indikatoren und OTT-Wellen, um Handelssignale zu beurteilen. Die Strategie gehört zu den Trend-Tracking-Strategie.

Strategieprinzip

  1. Die Strategie nutzt sowohl den RSI als auch den OTT als Indikatoren für Trends und Einstiegspunkte.

  2. Der RSI wird verwendet, um die Richtung des Gesamttrends zu bestimmen. Der RSI-Indikator kann zeigen, ob der Markt überkauft oder überverkauft ist. Die überverkaufte Zone, die auf dem RSI eingestellt ist, ist ein Überkaufsignal, die überverkaufte Zone ist ein Überverkaufszone. Die Standard-RSI-Länge dieser Strategie ist 6, die Überkauflinie ist 50 und die Überverkaufszone ist 50.

  3. Der OTT-Streifen dient zur Entdeckung von Einstiegspunkten. Er bildet sich auf der Basis des Volatilitätsindikators VAR. Als Mehrsignal wird verwendet, wenn die Preise von unten nach oben durchbrechen.

  4. Die Strategie wird nach Trendbeurteilung und Bestätigung des Einstiegspunktes bei einem OTT-Bereichsbruch über- oder untergeht.

  5. Die Stop-Loss-Strategie enthält einen Eingabebereich, den der Benutzer selbst einstellen kann. Die Strategie wird automatisch gelöscht, wenn der Stop- oder Stop-Loss-Preis ausgelöst wird.

  6. Die Strategie erlaubt außerdem nur Plus-, nur Negativ- oder Zwei-Wege-Trading.

Strategische Vorteile

  1. In Kombination mit dem RSI und den OTT-Bändern können Einstiegspunkte mit hoher Wahrscheinlichkeit gefunden werden, wenn die Trends genau beurteilt werden.

  2. Die OTT-Strecke nutzt Dynamikindikatoren, die sehr empfindlich auf Preisschwankungen reagieren, um die Wendepunkte frühzeitig zu erkennen.

  3. Die Strategie bietet eine Stop-Stop-Loss-Funktion, die Gewinne sperrt, aber auch eine Stop-Loss-Ausfahrt ermöglicht, bevor die Verluste sich ausdehnen, was zur Risikokontrolle beiträgt.

  4. Der Code ist klar strukturiert, kommentiert, leicht zu verstehen und zu ändern.

  5. Die Strategieparameter können flexibel über die Benutzeroberfläche angepasst werden, um sie an unterschiedliche Marktbedingungen anzupassen.

Strategisches Risiko

  1. Der RSI ist nachlässig und kann einen Trendwendepunkt verpassen, was zu unnötigen Verlusten führt.

  2. Auch im OTT-Band kann es zu Falschmeldungen kommen, was in Kombination mit K-Linien-Formaten überprüft werden sollte.

  3. Eine falsche Stop-Loss-Einstellung kann auch die Strategie-Performance beeinträchtigen und erfordert eine Anpassung der Parameter für verschiedene Sorten.

  4. Die Strategie basiert nur auf der Rückführung einer einzigen Sorte, wobei die verschiedenen Sortenparameter auf der Festplatte separat optimiert werden müssen.

  5. Die kurze Zeitfenster für die Rückmeldung kann die Wirksamkeit der Strategie nicht vollständig überprüfen. Es wird empfohlen, die Rückmeldungsdauer zu erweitern.

Optimierungsrichtung

  1. Filterung mit anderen Indikatoren wie MACD, KD usw. kann in Betracht gezogen werden, um Fehlmeldungen bei der Zulassung zu reduzieren.

  2. Die Stop-Loss-Werte können dynamisch anhand der Volatilität angepasst werden.

  3. Die Optimierung der Parameter verschiedener Sorten kann untersucht und Parameter-Selektionskriterien entwickelt werden.

  4. Die Optimierung von Strategieparametern kann mit Hilfe von maschinellen Lernmethoden erprobt werden.

  5. Es kann auch eine Kennzahl verwendet werden, um Trends zu beurteilen.

  6. Es kann in Betracht gezogen werden, die Durchschreitung der MA als Stopp-Methode zu verwenden, anstatt eine einfache proportionale Stopp-Methode.

Zusammenfassen

Diese Strategie ist insgesamt eine typische Trend-Tracking-Strategie. Sie beurteilt zunächst die Richtung des Trends durch den RSI, um dann den spezifischen Einstiegspunkt mit Hilfe der OTT-Band zu bestimmen und schließlich die Stop-Loss-Strategie einzurichten, um die Gewinne zu sichern und das Risiko zu kontrollieren. Die Strategie hat den Vorteil, dass die Indikator-Kombination einfach und effektiv ist, und die Rückmessung ist besser.

Strategiequellcode
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 2h
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/
// © BigCoinHunter

//@version=5
strategy(title="RSI_OTT-TP/SL", overlay=true, 
     pyramiding=0, default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, initial_capital=1000, 
     currency=currency.USD, commission_value=0.05, 
     commission_type=strategy.commission.percent, 
     process_orders_on_close=true)

//----------- get the user inputs --------------

//---------- RSI -------------
price = input(close, title="Source")

RSIlength = input.int(defval=6,title="RSI Length") 
RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1)
RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1)

//------- OTT Bands ----------------
src = close
length=input.int(defval=1, title="OTT Period", minval=1)
percent=input.float(defval=5, title="OTT Percent", step=0.1, minval=0.001)

mav = input.string(title="OTT MA Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])

ottUpperPercent = input.float(title="OTT Upper Line Coeff", defval=0.01, minval = 0.001, step=0.001)
ottLowerPercent = input.float(title="OTT Lower Line Coeff", defval=0.01, minval = 0.001, step=0.001)

Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=math.sum(vud1,9)
    vDD=math.sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*math.abs(vCMO)*src)+(1-valpha*math.abs(vCMO))*nz(VAR[1])
    
VAR=Var_Func(src,length)

Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
    
WWMA=Wwma_Func(src,length)

Zlema_Func(src,length)=>
    zxLag = length/2==math.round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ta.ema(zxEMAData, length)
    
ZLEMA=Zlema_Func(src,length)

Tsf_Func(src,length)=>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = ta.linreg(src, length, 0)+lrs
    
TSF=Tsf_Func(src,length)

getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := ta.sma(src, length)
        ma

    if mav == "EMA"
        ma := ta.ema(src, length)
        ma

    if mav == "WMA"
        ma := ta.wma(src, length)
        ma

    if mav == "TMA"
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma
    ma
    
MAvg=getMA(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop =  MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop

OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200

light_green=#08ff12
light_red=#fe0808

OTTupper = nz(OTT[2])*(1+ottUpperPercent)
OTTlower = nz(OTT[2])*(1-ottLowerPercent)

p1 = plot(OTTupper, color=light_green, linewidth=1, title="OTT UPPER")
p2 = plot(nz(OTT[2]), color=color.new(color.yellow,0), linewidth=1, title="OTT MIDDLE")
p3 = plot(OTTlower, color=light_red, linewidth=1, title="OTT LOWER")

fill(plot1=p1, plot2=p3, title="OTT Background", color=color.new(color.aqua,90), fillgaps=false, editable=true)

buyEntry = ta.crossover(src, OTTlower)
sellEntry = ta.crossunder(src, OTTupper)

//---------- input TP/SL ---------------
tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss:  ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01

isEntryLong = input.bool(defval=true, title= 'Long Entry', inline="11")
isEntryShort = input.bool(defval=true, title='Short Entry', inline="11")

//---------- backtest range setup ------------
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay     = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth   = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear    = input.int(defval = 2022, title = "To Year", minval = 2010)

//------------ time interval setup -----------
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)  // backtest start window
finish    = timestamp(toYear, toMonth, toDay, 23, 59)        // backtest finish window
window()  => true // create function "within window of time"

//------- define the global variables ------
var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false

//--------- Colors ---------------
//TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na
//bgcolor(switch2?(color.new(TrendColor,50)):na)


//--------- calculate the input/output points -----------
longProfitPrice  = strategy.position_avg_price * (1 + tp)     // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl)        // sl -> stop loss percentage

shortProfitPrice  = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)


//---------- RSI + Bollinger Bands Strategy -------------
vrsi = ta.rsi(price, RSIlength)

rsiCrossOver = ta.crossover(vrsi, RSIoverSold)
rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought)

OTTCrossOver = ta.crossover(src, OTTlower)
OTTCrossUnder = ta.crossunder(src, OTTupper)

if (not na(vrsi))

    if rsiCrossOver and OTTCrossOver
        long := true
        
    if rsiCrossUnder and OTTCrossUnder
        long := false

//------- define the global variables ------
buySignall = false
sellSignall = false

//------------------- determine buy and sell points ---------------------
buySignall := window() and long  and (not stoppedOutLong)
sellSignall := window() and (not long)  and (not stoppedOutShort)


//---------- execute the strategy -----------------
if(isEntryLong and isEntryShort)
    if long 
        strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG")
        stoppedOutLong := true
        stoppedOutShort := false
    else 
        strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT")
        stoppedOutLong  := false
        stoppedOutShort := true

else if(isEntryLong)
    strategy.entry("LONG", strategy.long,  when = buySignall)
    strategy.close("LONG", when = sellSignall)
    if long 
        stoppedOutLong := true
    else
        stoppedOutLong  := false

else if(isEntryShort)
    strategy.entry("SHORT", strategy.short, when = sellSignall)
    strategy.close("SHORT", when = buySignall)
    if not long
        stoppedOutShort := true
    else
        stoppedOutShort := false
    

//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger")

else if(tp>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger")
        
else if(sl>0.0)
    if ( strategy.position_size > 0 )
        strategy.exit(id="LONG",  stop=longStopPrice, comment="Long SL Trigger")

    else if ( strategy.position_size < 0 )
        strategy.exit(id="SHORT",  stop=shortStopPrice, comment="Short SL Trigger")