Strategi ini disebut RSI_OTT-TP/SL. Ini menggabungkan indikator RSI dan band OTT untuk menentukan sinyal perdagangan, yang termasuk dalam strategi trend berikut. Strategi ini menilai arah tren pasar melalui indikator RSI dan menggunakan band OTT untuk menemukan titik masuk tertentu.
Strategi ini menggunakan indikator RSI dan OTT untuk menentukan tren dan titik masuk.
RSI digunakan untuk menilai arah tren secara keseluruhan. RSI dapat menunjukkan apakah pasar terlalu banyak dibeli atau terlalu banyak dijual. RSI yang melintasi di atas level overbought adalah sinyal beli, sementara melintasi di bawah level oversold adalah sinyal jual.
Band OTT digunakan untuk menemukan titik masuk. Mereka adalah band yang dibentuk berdasarkan indikator Volatility Rate of Change (VAR). Ketika harga menembus band bawah ke atas, itu adalah sinyal beli. Ketika harga menembus band atas ke bawah, itu adalah sinyal jual.
Setelah menentukan tren dan mengkonfirmasi titik masuk, strategi ini akan membuka posisi panjang atau pendek ketika harga melanggar band OTT.
Strategi ini akan menutup posisi secara otomatis ketika mengambil keuntungan atau harga stop loss disentuh.
Strategi ini juga memungkinkan perdagangan hanya panjang, hanya pendek atau kedua arah.
Menggabungkan band RSI dan OTT dapat menemukan titik masuk dengan probabilitas tinggi dalam penilaian tren yang akurat.
Band OTT menggunakan indikator momentum dan sangat sensitif terhadap fluktuasi harga, yang dapat mendeteksi titik balik lebih awal.
Fungsi take profit dan stop loss membantu mengunci keuntungan dan membatasi kerugian sebelum mereka berkembang, yang menguntungkan pengendalian risiko.
Struktur kode jelas dengan komentar yang cukup, mudah dimengerti dan dimodifikasi.
Parameter strategi dapat disesuaikan secara fleksibel melalui antarmuka untuk beradaptasi dengan lingkungan pasar yang berbeda.
RSI memiliki emisi yang tertinggal dan mungkin melewatkan titik pembalikan tren, yang menyebabkan kerugian yang tidak perlu.
Band OTT juga dapat menghasilkan sinyal palsu. Lebih baik untuk mengkonfirmasi dengan pola lilin.
Pengaturan take profit dan stop loss yang tidak tepat akan mempengaruhi kinerja strategi. Parameter perlu disesuaikan untuk produk yang berbeda.
Strategi hanya backtested pada satu produk. Parameter harus dioptimalkan secara terpisah untuk produk yang berbeda dalam perdagangan langsung.
Jendela waktu backtest pendek dan mungkin tidak sepenuhnya memvalidasi efektivitas strategi.
Pertimbangkan untuk menambahkan indikator lain untuk penyaringan, seperti MACD, KD dll untuk mengurangi entri palsu.
Jangkauan mengambil keuntungan dan stop loss dapat disesuaikan secara dinamis berdasarkan volatilitas.
Optimasi parameter penelitian untuk produk yang berbeda untuk menetapkan kriteria pemilihan parameter.
Coba metode pembelajaran mesin untuk secara dinamis mengoptimalkan parameter strategi.
Tambahkan konfirmasi volume untuk menghindari pecah palsu.
Pertimbangkan untuk menggunakan penetrasi MA sebagai stop loss alih-alih stop loss persentase sederhana.
Singkatnya, ini adalah strategi trend berikut yang khas. Pertama menilai arah tren melalui RSI, kemudian menggunakan band OTT untuk membantu menentukan titik masuk tertentu, dan akhirnya mengatur mengambil keuntungan dan stop loss untuk mengunci keuntungan dan mengendalikan risiko. Keuntungan dari strategi ini adalah kombinasi indikator yang sederhana dan efektif dan hasil backtest yang baik. Tetapi ada juga beberapa risiko seperti lag RSI dan sinyal palsu band OTT. Ini mengharuskan kita mengoptimalkan parameter dengan hati-hati dalam perdagangan langsung, dan menambahkan indikator teknis lainnya untuk konfirmasi untuk meningkatkan stabilitas strategi. Dengan optimasi dan verifikasi terus-menerus, strategi ini dapat menjadi template strategi trend berikut yang sangat praktis.
/*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")