Trend Reversal System adalah strategi trend following yang menggunakan moving average, CCI indicator dan Supertrend indicator untuk mengidentifikasi trend dan masuk pada pullbacks.
Strategi ini menggunakan EMA 21 periode sebagai rata-rata bergerak jangka pendek dan EMA 55 periode sebagai rata-rata bergerak jangka panjang.
Indikator CCI menunjukkan ketika harga telah mencapai tingkat ekstrem. Sinyal Level 1 adalah ketika CCI mencapai 100/-100 secara default, level 2 adalah 140/-140 dan level 3 adalah 180/-180. Ini menunjukkan kondisi overbought atau oversold.
Indikator Supertrend menentukan arah tren tertentu. Ini menggabungkan ATR untuk mengidentifikasi stop loss dan level masuk untuk tren naik dan turun.
Ketika 21 EMA berada di atas 55 EMA dan CCI mencapai level rendah (area oversold), dapat menandakan masuk panjang. Ketika 21 EMA berada di bawah 55 EMA dan CCI mencapai level tinggi (area overbought), dapat menandakan masuk pendek. Stop loss ditetapkan pada level stop Supertrend
Strategi ini menggabungkan beberapa indikator untuk mengidentifikasi tren dan situasi overbought/oversold, yang membantu menyaring breakout palsu.
Parameter harus dioptimalkan untuk simbol yang berbeda karena pengaturan saat ini mungkin tidak ideal. Metode stop loss mentah dan tidak dapat beradaptasi dengan kondisi pasar yang berbeda. Fixed take profit gagal menyesuaikan berdasarkan volatilitas pasar. CCI kadang-kadang dapat menghasilkan sinyal palsu. Perlu penilaian lebih lanjut tentang momentum tren untuk menghindari whipsaws.
Uji pengaturan parameter pada simbol yang berbeda, optimalkan periode MA, periode ATR, pengganda ATR dll. Pertimbangkan trailing stop atau ATR stop untuk stop loss adaptif. Uji profit berbasis ATR untuk target profit dinamis. Tambahkan filter untuk memeriksa momentum tren saat mengambil sinyal CCI untuk menghindari pasar bergolak. Tambahkan indikator kekuatan tren yang dapat diukur untuk validasi tren yang lebih baik.
Sistem Pembalikan Tren menggabungkan moving average, CCI dan Supertrend untuk mengidentifikasi tren dan overbought/oversold untuk entri retracement. Sistem ini memiliki stabilitas dan tingkat menang yang relatif tinggi, tetapi mekanisme stop loss, take profit dan validasi tren membutuhkan optimasi lebih lanjut untuk ketahanan di seluruh simbol dan kondisi pasar. Secara keseluruhan, sistem ini menggunakan pendekatan sederhana dan langsung untuk menggabungkan indikator untuk menangkap peluang tren, dan layak untuk meneliti lebih lanjut dan menerapkannya.
/*backtest start: 2022-10-16 00:00:00 end: 2023-01-08 00:00:00 period: 1d basePeriod: 1h 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/ // © greenmask9 //@version=4 strategy("Oath", overlay=true) // 21 EMA emalength = input(21, title="Short EMA") emashort = ema(close, emalength) // 55 EMA emalength2 = input(55, title="Long EMA") ema = ema(close, emalength2) //CCI calculation and inputs lengthcci = input(20, minval=1, title="Overbought/sold detector period") src = input(close, title="Overbought/sold detector source") ma = sma(src, lengthcci) ccivalue = (src - ma) / (0.015 * dev(src, lengthcci)) //CCI plotting ccioverbought = input(defval=100, title="Overbought level 1") ccioverbought2 = input(defval=140, title="Overbought level 2") ccioverbought3 = input(defval=180, title="Overbought level 3") ccioversold = input(defval=-100, title="Oversold level 1") ccioversold2 = input(defval=-140, title="Oversold level 2") ccioversold3 = input(defval=-180, title="Oversold level 3") //cciOB = (ccivalue >= ccioverbought and ccivalue < ccioverbought2) //cciOS = (ccivalue <= ccioversold and ccivalue > ccioversold2) //cciOB2 = (ccivalue >= ccioverbought2 and ccivalue < ccioverbought3) //cciOS2 = (ccivalue <= ccioversold and ccivalue > ccioversold3) //cciOB3 = (ccivalue >= ccioverbought3) //cciOS3 = (ccivalue <= ccioversold3) //Supertrend length = input(title="ATR Period", type=input.integer, defval=55) mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=5.0) wicks = input(title="Take Wicks into Account ?", type=input.bool, defval=true) illuminate = input(title="Illuminate Trend", type=input.bool, defval=false) atr = mult * atr(length) longStop = hl2 - atr longStopPrev = nz(longStop[1], longStop) longStop := (wicks ? low[1] : close[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = hl2 + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := (wicks ? high[1] : close[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and (wicks ? high : close) > shortStopPrev ? 1 : dir == 1 and (wicks ? low : close) < longStopPrev ? -1 : dir //entries uptrend = emashort>ema and dir == 1 upsignal = ccivalue<=ccioversold and ccivalue>ccioversold2 upsignal2 = ccivalue<=ccioversold2 and ccivalue>ccioversold3 upsignal3 = ccivalue<=ccioversold3 downtrend = emashort<ema and dir == -1 downsignal = ccivalue>=ccioverbought and ccivalue<ccioverbought2 downsignal2 = ccivalue>=ccioverbought2 and ccivalue<ccioverbought3 downsignal3 = ccivalue>=ccioverbought3 //adapts to the current bar, I need to save the bars number when the condition for buy was true, static number is spread spread = input (0.00020, title="Spread") upstoploss = longStop - spread downstoploss = shortStop + spread strategy.initial_capital = 50000 ordersize=floor(strategy.initial_capital/close) testlong = input(title="Test longs", type=input.bool, defval=true) testshort = input(title="Test shorts", type=input.bool, defval=true) //new degree = input(title="Test level 1 overbought/sold levels", type=input.bool, defval=true) degree2 = input(title="Test level 2 overbought/sold levels", type=input.bool, defval=false) degree3 = input(title="Test level 3 overbought/sold levels", type=input.bool, defval=false) statictarget = input(title="Use static target", type=input.bool, defval=true) statictargetvalue = input(title="Static target in pips", type=input.integer, defval=400) //timetrade = input(title="Open trades only withing specified time", type=input.bool, defval=true) //timtrade = input() //přidat možnost TP podle ATR a sl podle ATR buy1 = uptrend and upsignal and strategy.opentrades==0 and testlong and degree x1 = barssince (buy1) if (buy1) //bodlo by zakázat atrtarget v tomto případě if (statictarget) strategy.entry("Oath1", strategy.long, ordersize) strategy.exit( "Oath1 Close", from_entry="Oath1" , profit=statictargetvalue,stop=upstoploss[x1]) buy2 = uptrend and upsignal2 and strategy.opentrades==0 and testlong and degree2 x2 = barssince (buy2) if (buy2) //bodlo by zakázat atrtarget v tomto případě if (statictarget) strategy.entry("Oath2", strategy.long, ordersize) strategy.exit( "Oath2 Close", from_entry="Oath2" , profit=statictargetvalue,stop=upstoploss[x2]) buy3 = uptrend and upsignal3 and strategy.opentrades==0 and testlong and degree3 x3 = barssince (buy3) if (buy3) //bodlo by zakázat atrtarget v tomto případě if (statictarget) strategy.entry("Oath3", strategy.long, ordersize) strategy.exit( "Oath3 Close", from_entry="Oath3" , profit=statictargetvalue,stop=upstoploss[x3]) sell1 = downtrend and downsignal and strategy.opentrades==0 and testshort and degree y1 = barssince (sell1) if (sell1) if (statictarget) strategy.entry("Oath1.s", strategy.short, ordersize) strategy.exit( "Oath1 Close", from_entry="Oath1.s" , profit=statictargetvalue,stop=downstoploss[y1]) sell2 = downtrend and downsignal2 and strategy.opentrades==0 and testshort and degree2 y2 = barssince (sell2) if (sell2) if (statictarget) strategy.entry("Oath2.s", strategy.short, ordersize) strategy.exit( "Oath2 Close", from_entry="Oath2.s" , profit=statictargetvalue,stop=downstoploss[y2]) sell3 = downtrend and downsignal3 and strategy.opentrades==0 and testshort and degree3 y3 = barssince (sell3) if (sell3) if (statictarget) strategy.entry("Oath3.s", strategy.short, ordersize) strategy.exit( "Oath3 Close", from_entry="Oath3.s" , profit=statictargetvalue,stop=downstoploss[y3]) plotshape(uptrend and upsignal and degree, location=location.belowbar, color=color.green, transp=0, style=shape.triangleup, size=size.tiny, text="Oath up") plotshape(downtrend and downsignal and degree, location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, size=size.tiny, text="Oath down") plotshape(uptrend and upsignal2 and degree2, location=location.belowbar, color=color.green, transp=0, style=shape.triangleup, size=size.tiny, text="Oath up+") plotshape(downtrend and downsignal2 and degree2, location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, size=size.tiny, text="Oath down+") plotshape(uptrend and upsignal3 and degree3, location=location.belowbar, color=color.green, transp=0, style=shape.triangleup, size=size.tiny, text="Oath up++") plotshape(downtrend and downsignal3 and degree3, location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, size=size.tiny, text="Oath down++")