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.
Strategi ini menggunakan indikator RSI dan OTT untuk menilai tren dan titik masuk.
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.
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.
Setelah menilai tren dan mengkonfirmasi titik masuk, strategi ini akan melakukan over atau short position saat breakout band OTT.
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.
Strategi ini juga memungkinkan hanya melakukan over, hanya melakukan short, atau perdagangan dua arah.
Kombinasi RSI dan pita OTT memungkinkan untuk menemukan titik masuk dengan probabilitas tinggi dengan asumsi keakuratan penilaian tren.
Band OTT menggunakan indikator momentum dan sangat sensitif terhadap fluktuasi harga, sehingga dapat menemukan titik balik lebih awal.
Strategi ini menawarkan fitur stop loss yang dapat mengunci keuntungan, atau stop loss sebelum kerugian meluas, yang membantu dalam pengendalian risiko.
Struktur kodenya jelas, lengkap dengan komentar, mudah dipahami dan dimodifikasi.
Parameter strategi dapat disesuaikan secara fleksibel melalui antarmuka untuk menyesuaikan dengan lingkungan pasar yang berbeda.
Indeks RSI memiliki masalah lag, yang dapat melewatkan titik perubahan tren, sehingga menyebabkan kerugian yang tidak perlu.
Band OTT juga dapat menghasilkan sinyal misinformasi, disarankan untuk digabungkan dengan bentuk K-line untuk memverifikasi.
Penetapan stop loss yang tidak tepat juga dapat mempengaruhi kinerja strategi dan perlu menyesuaikan parameter untuk varietas yang berbeda.
Strategi ini hanya didasarkan pada pengembalian varietas tunggal, dan parameter varietas yang berbeda di disk harus dioptimalkan secara terpisah.
Jendela waktu pengembalian yang singkat mungkin tidak sepenuhnya memverifikasi efektivitas strategi, dan disarankan untuk memperluas periode pengembalian.
Filter dapat dipertimbangkan untuk memasukkan indikator lain, seperti MACD, KD, dan lain-lain, untuk mengurangi kesalahan masuk.
Stop loss dapat disesuaikan secara dinamis berdasarkan metode volatilitas.
Optimasi parameter dari varietas yang berbeda dapat dipelajari, dan kriteria pilihan parameter dapat dibuat.
Metode pembelajaran mesin dapat dicoba untuk mengoptimalkan parameter strategi secara dinamis.
Anda dapat menambahkan konfirmasi kuantitatif untuk menghindari terobosan palsu. Anda juga dapat menggunakan indikator rata-rata untuk menilai tren.
Anda dapat mempertimbangkan untuk melakukan stop loss melalui MA, bukan stop loss proporsional sederhana.
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.
/*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")