Analisis strategi jalur RSI dan OTT


Tarikh penciptaan: 2023-10-09 16:21:20 Akhirnya diubah suai: 2023-10-09 16:21:20
Salin: 0 Bilangan klik: 714
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini dinamakan RSI_OTT-TP/SL. Strategi ini menggabungkan penilaian RSI dan isyarat perdagangan yang dibawa oleh gelombang OTT. Strategi ini termasuk dalam strategi pengesanan trend. Strategi ini menentukan arah trend pasaran melalui indikator RSI dan menggunakan gelombang OTT untuk menentukan titik masuk tertentu.

Prinsip Strategi

  1. Strategi ini menggunakan kedua-dua RSI dan OTT untuk menilai trend dan titik masuk.

  2. RSI digunakan untuk menentukan arah trend keseluruhan. Indikator RSI boleh menunjukkan pasaran adalah overbought atau oversold, kawasan overbought yang ditetapkan di atas RSI adalah isyarat overbought, dan kawasan overbought yang ditetapkan di bawah RSI adalah kawasan oversold. Panjang RSI lalai untuk strategi ini adalah 6, garis overbought adalah 50, dan kawasan oversold adalah 50.

  3. Garis gelombang OTT digunakan untuk mencari titik masuk. Ia adalah garis gelombang yang terbentuk berdasarkan VAR, indikator kadar lonjakan. Ia berfungsi sebagai isyarat ganda apabila harga menembusi OTT dari bawah ke atas; sebagai isyarat kosong apabila harga menembusi OTT dari atas ke bawah.

  4. Setelah menilai trend dan mengesahkan titik masuk, strategi ini akan membuka posisi lebih atau kurang apabila gelombang OTT pecah.

  5. Stop Stop Loss mempunyai kotak input yang boleh digunakan oleh pengguna untuk menetapkan sendiri. Apabila harga Stop Stop atau Stop Loss dicetuskan, strategi akan secara automatik melonggarkan kedudukan.

  6. Strategi ini juga membenarkan hanya melakukan over, hanya melakukan short atau berdagang dua hala.

Kelebihan Strategik

  1. Gabungan RSI dan OTT band, anda boleh mencari titik masuk dengan kebarangkalian tinggi dengan menganggarkan trend dengan tepat.

  2. Band OTT menggunakan indikator kuantiti yang sangat sensitif terhadap turun naik harga, yang dapat mengesan titik peralihan lebih awal.

  3. Strategi ini menawarkan fungsi hentian dan hentian yang boleh mengunci keuntungan atau berhenti sebelum kerugian meningkat, yang membantu mengawal risiko.

  4. Kodnya jelas, penuh dengan komen, mudah difahami dan diubah suai.

  5. Parameter strategi boleh disesuaikan secara fleksibel melalui antara muka untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

Risiko Strategik

  1. RSI mempunyai masalah ketinggalan dan mungkin terlepas titik perubahan trend, yang boleh menyebabkan kerugian yang tidak perlu.

  2. Band OTT juga boleh menghasilkan isyarat kesalahan, disarankan untuk digabungkan dengan bentuk K-line untuk mengesahkan.

  3. Tetapan stop loss yang tidak betul juga boleh menjejaskan prestasi strategi dan perlu menyesuaikan parameter untuk pelbagai jenis.

  4. Strategi ini hanya berdasarkan pengesanan semula varieti tunggal, dan parameter varieti yang berbeza dalam cakera perlu dioptimumkan secara berasingan.

  5. Jendela masa tindak balas yang pendek mungkin tidak dapat mengesahkan sepenuhnya keberkesanan strategi, dan disyorkan untuk mengembangkan kitaran tindak balas.

Arah pengoptimuman

  1. Anda boleh mempertimbangkan penapisan dengan penunjuk lain, seperti MACD, KD, dan lain-lain, untuk mengurangkan kesalahan kemasukan.

  2. Anda boleh secara dinamik menyesuaikan stop loss anda berdasarkan kaedah kadar turun naik.

  3. Anda boleh mengkaji pengoptimuman parameter untuk pelbagai jenis dan membuat kriteria pilihan parameter.

  4. Anda boleh mencuba kaedah pembelajaran mesin untuk mengoptimumkan parameter strategi secara dinamik.

  5. Anda boleh menambah pengesahan kuantitatif untuk mengelakkan penembusan palsu. Anda juga boleh menggunakan indikator purata untuk menilai trend.

  6. Anda boleh mempertimbangkan untuk menggunakan penembusan melalui MA sebagai cara untuk menghentikan, dan bukan sekadar berhenti perkadaran.

ringkaskan

Strategi ini secara keseluruhannya adalah strategi pengesanan trend yang tipikal. Ia mula-mula menilai arah trend melalui RSI, kemudian menggunakan bantuan jalur gelombang OTT untuk menentukan titik masuk tertentu, dan akhirnya menetapkan stop loss untuk mengunci keuntungan dan mengawal risiko. Kelebihan strategi ini adalah bahawa gabungan indikator mudah dan berkesan, prestasi pengukuran kembali juga lebih baik.

Kod 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")