Analisis strategi RSI dan pita OTT


Tanggal Pembuatan: 2023-10-09 16:21:20 Akhirnya memodifikasi: 2023-10-09 16:21:20
menyalin: 0 Jumlah klik: 714
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini disebut RSI_OTT-TP/SL. Strategi ini menggabungkan indikator RSI dan penilaian sinyal OTT yang dibawa untuk melakukan perdagangan, termasuk strategi pelacakan tren. Strategi ini menentukan arah tren pasar melalui indikator RSI, dan menggunakan gelombang OTT untuk menentukan titik masuk tertentu. Strategi ini juga memungkinkan pengguna untuk mengatur rasio stop loss yang dapat secara otomatis menghentikan stop loss untuk mengunci keuntungan atau menghindari kerugian.

Prinsip Strategi

  1. Strategi ini menggunakan indikator RSI dan OTT untuk menilai tren dan titik masuk.

  2. RSI digunakan untuk menentukan arah tren secara keseluruhan. RSI dapat menunjukkan apakah pasar sedang overbought atau oversold. Area oversold yang diatur di atas RSI adalah sinyal overbought, dan area oversold yang diatur di bawah RSI adalah area oversold.

  3. Band OTT digunakan untuk menemukan titik masuk. Ini adalah band yang terbentuk berdasarkan indikator volatilitas VAR. Untuk sinyal plus ketika harga dari bawah ke atas menembus OTT downtrend; untuk sinyal gap ketika harga dari atas ke bawah menembus OTT uptrend.

  4. Setelah menilai tren dan mengkonfirmasi titik masuk, strategi ini akan melakukan over atau short position saat breakout band OTT.

  5. Stop Loss memiliki kotak input yang memungkinkan pengguna untuk mengaturnya sendiri. Strategi akan secara otomatis melangsungkan posisi ketika harga stop loss atau stop loss dipicu.

  6. Strategi ini juga memungkinkan hanya melakukan over, hanya melakukan short, atau perdagangan dua arah.

Keunggulan Strategis

  1. Kombinasi RSI dan pita OTT memungkinkan untuk menemukan titik masuk dengan probabilitas tinggi dengan asumsi keakuratan penilaian tren.

  2. Band OTT menggunakan indikator momentum dan sangat sensitif terhadap fluktuasi harga, sehingga dapat menemukan titik balik lebih awal.

  3. Strategi ini menawarkan fitur stop loss yang dapat mengunci keuntungan, atau stop loss sebelum kerugian meluas, yang membantu dalam pengendalian risiko.

  4. Struktur kodenya jelas, lengkap dengan komentar, mudah dipahami dan dimodifikasi.

  5. Parameter strategi dapat disesuaikan secara fleksibel melalui antarmuka untuk menyesuaikan dengan lingkungan pasar yang berbeda.

Risiko Strategis

  1. Indeks RSI memiliki masalah lag, yang dapat melewatkan titik perubahan tren, sehingga menyebabkan kerugian yang tidak perlu.

  2. Band OTT juga dapat menghasilkan sinyal misinformasi, disarankan untuk digabungkan dengan bentuk K-line untuk memverifikasi.

  3. Penetapan stop loss yang tidak tepat juga dapat mempengaruhi kinerja strategi dan perlu menyesuaikan parameter untuk varietas yang berbeda.

  4. Strategi ini hanya didasarkan pada pengembalian varietas tunggal, dan parameter varietas yang berbeda di disk harus dioptimalkan secara terpisah.

  5. Jendela waktu pengembalian yang singkat mungkin tidak sepenuhnya memverifikasi efektivitas strategi, dan disarankan untuk memperluas periode pengembalian.

Arah optimasi

  1. Filter dapat dipertimbangkan untuk memasukkan indikator lain, seperti MACD, KD, dan lain-lain, untuk mengurangi kesalahan masuk.

  2. Stop loss dapat disesuaikan secara dinamis berdasarkan metode volatilitas.

  3. Optimasi parameter dari varietas yang berbeda dapat dipelajari, dan kriteria pilihan parameter dapat dibuat.

  4. Metode pembelajaran mesin dapat dicoba untuk mengoptimalkan parameter strategi secara dinamis.

  5. Anda dapat menambahkan konfirmasi kuantitatif untuk menghindari terobosan palsu. Anda juga dapat menggunakan indikator rata-rata untuk menilai tren.

  6. Anda dapat mempertimbangkan untuk melakukan stop loss melalui MA, bukan stop loss proporsional sederhana.

Meringkaskan

Strategi ini secara keseluruhan adalah strategi pelacakan tren yang khas. Ini pertama-tama menilai arah tren melalui RSI, kemudian menggunakan bantuan pita gelombang OTT untuk menentukan titik masuk tertentu, dan akhirnya mengatur stop loss untuk mengunci keuntungan dan mengendalikan risiko. Keuntungan dari strategi ini adalah bahwa portofolio indikator sederhana dan efektif, dan kinerja pengukuran kembali juga lebih baik.

Kode Sumber Strategi
/*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")