
Strategi ini menggunakan gabungan purata bergerak ganda dan petunjuk StochRSI untuk mengenal pasti arah trend dan titik masuk. Ciri utamanya adalah dapat memasuki pasaran pada peringkat permulaan trend, sambil menggunakan ciri overbought dan oversold indikator StochRSI untuk menyaring penembusan palsu.
Strategi ini menggunakan purata bergerak cepat EMA ((12) dan purata bergerak perlahan EMA ((25) untuk membina sistem purata bergerak berganda, yang menghasilkan isyarat beli apabila melintasi garis perlahan pada garis cepat, dan menghasilkan isyarat menjual apabila melintasi garis perlahan di bawah garis cepat, untuk menentukan arah trend besar.
Pada masa yang sama, strategi ini menggabungkan persilangan indikator StochRSI untuk lebih mengenal pasti masa masuk. Indikator StochRSI menggabungkan indikator KDJ dan RSI secara rawak, menghasilkan isyarat beli apabila garis K melintasi garis D dari kawasan overbought, menghasilkan isyarat jual apabila garis K melintasi garis D dari kawasan overbought.
Strategi ini hanya akan membuka kedudukan apabila terdapat isyarat dari rata-rata bergerak ganda dan isyarat yang sesuai dari StochRSI. Dengan itu, ia dapat menyaring dengan berkesan sebahagian daripada penembusan palsu dan mengelakkan perdagangan yang tidak sah.
Kelebihan utama strategi ini adalah keupayaan untuk menentukan arah trend dan titik masuk yang berpotensi lebih awal. Sistem purata bergerak dapat menghasilkan isyarat pada permulaan trend, dan penambahan indikator StochRSI dapat menyaring penembusan palsu dengan berkesan dan mengelakkan perdagangan yang salah.
Selain itu, strategi ini menggabungkan analisis trend dan penilaian overbought dan oversold, dan mempunyai kelebihan untuk mengikuti trend dan membalikkan perdagangan. Strategi ini dapat menangkap peluang secara menyeluruh, sama ada mengikuti trend atau membeli di bawah dan menjual di atas.
Risiko utama strategi ini adalah keterbelakangan sistem purata bergerak itu sendiri. Apabila keadaan pasaran berubah secara mendadak, sistem purata bergerak berganda sering kali agak lewat untuk menghasilkan isyarat, mudah untuk strategi kehilangan masa masuk yang terbaik.
Selain itu, indikator StochRSI juga boleh menghasilkan isyarat yang salah dan mencetuskan perdagangan yang tidak perlu. Terutama semasa kejutan pasaran, garis K dan D mungkin sering bersalin, membawa risiko terlalu banyak operasi tidak berkesan kepada strategi.
Strategi ini telah dioptimumkan dengan memfokuskan kepada beberapa aspek:
Menyesuaikan parameter untuk purata bergerak berganda dengan menggunakan kitaran purata yang lebih baik untuk menangkap trend;
Mengoptimumkan parameter StochRSI untuk membuat kriteria penilaian yang lebih munasabah untuk overbought dan oversold;
Meningkatkan jumlah pesanan atau menyesuaikan tahap penangguhan kerugian untuk mendapatkan kadar pulangan yang lebih tinggi;
Gabungan dengan penanda lain sebagai syarat penapisan untuk mengurangkan isyarat tidak sah.
Strategi ini secara keseluruhan sangat sesuai untuk menangkap trend garis tengah dan panjang, dan mempunyai potensi keuntungan yang besar pada awal trend. Di samping itu, dengan menggunakan indikator StochRSI sebagai penilaian tambahan, ia dapat menyaring isyarat yang menyesatkan dengan berkesan dan mengelakkan kerugian yang tidak perlu. Dengan pengoptimuman parameter dan peningkatan pengurusan risiko, strategi ini boleh menjadi alat yang kuat untuk mendapatkan keuntungan yang stabil.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-24 00:00:00
period: 1h
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/
// © btc_charlie / @TheParagonGrp
//@version=5
strategy('BlackBit Trader XO Macro Trend Scanner', overlay=true)
// Variables
var ok = 0
var countBuy = 0
var countSell = 0
src = input(close, title='OHLC Type')
i_fastEMA = input(12, title='Fast EMA')
i_slowEMA = input(25, title='Slow EMA')
i_defEMA = input(25, title='Consolidated EMA')
// Allow the option to show single or double EMA
i_bothEMAs = input(title='Show Both EMAs', defval=true)
// Define EMAs
v_fastEMA = ta.ema(src, i_fastEMA)
v_slowEMA = ta.ema(src, i_slowEMA)
v_biasEMA = ta.ema(src, i_defEMA)
// Color the EMAs
emaColor = v_fastEMA > v_slowEMA ? color.green : v_fastEMA < v_slowEMA ? color.red : #FF530D
// Plot EMAs
plot(i_bothEMAs ? na : v_biasEMA, color=emaColor, linewidth=3, title='Consolidated EMA')
plot(i_bothEMAs ? v_fastEMA : na, title='Fast EMA', color=emaColor)
plot(i_bothEMAs ? v_slowEMA : na, title='Slow EMA', color=emaColor)
// Colour the bars
buy = v_fastEMA > v_slowEMA
sell = v_fastEMA < v_slowEMA
if buy
countBuy += 1
countBuy
if buy
countSell := 0
countSell
if sell
countSell += 1
countSell
if sell
countBuy := 0
countBuy
buysignal = countBuy < 2 and countBuy > 0 and countSell < 1 and buy and not buy[1]
sellsignal = countSell > 0 and countSell < 2 and countBuy < 1 and sell and not sell[1]
barcolor(buysignal ? color.green : na)
barcolor(sellsignal ? color.red : na)
bull = countBuy > 1
bear = countSell > 1
barcolor(bull ? color.green : na)
barcolor(bear ? color.red : na)
// Set Alerts
// alertcondition(ta.crossover(v_fastEMA, v_slowEMA), title='Bullish EMA Cross', message='Bullish EMA crossover')
// alertcondition(ta.crossunder(v_fastEMA, v_slowEMA), title='Bearish EMA Cross', message='Bearish EMA Crossover')
// Stoch RSI code
smoothK = input.int(3, 'K', minval=1)
smoothD = input.int(3, 'D', minval=1)
lengthRSI = input.int(14, 'RSI Length', minval=1)
lengthStoch = input.int(14, 'Stochastic Length', minval=1)
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)
bandno0 = input.int(80, minval=1, title='Upper Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno2 = input.int(50, minval=1, title='Middle Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
bandno1 = input.int(20, minval=1, title='Lower Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)')
// Alerts
crossoverAlertBgColourMidOnOff = input.bool(title='Crossover Alert Background Colour (Middle Level) [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourOBOSOnOff = input.bool(title='Crossover Alert Background Colour (OB/OS Level) [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourGreaterThanOnOff = input.bool(title='Crossover Alert >input [ON/OFF]', group='Crossover Alerts', defval=false)
crossoverAlertBgColourLessThanOnOff = input.bool(title='Crossover Alert <input [ON/OFF]', group='Crossover Alerts', defval=false)
maTypeChoice = input.string('EMA', title='MA Type', group='Moving Average', options=['EMA', 'WMA', 'SMA', 'None'])
maSrc = input.source(close, title='MA Source', group='Moving Average')
maLen = input.int(200, minval=1, title='MA Length', group='Moving Average')
maValue = if maTypeChoice == 'EMA'
ta.ema(maSrc, maLen)
else if maTypeChoice == 'WMA'
ta.wma(maSrc, maLen)
else if maTypeChoice == 'SMA'
ta.sma(maSrc, maLen)
else
0
crossupCHECK = maTypeChoice == 'None' or open > maValue and maTypeChoice != 'None'
crossdownCHECK = maTypeChoice == 'None' or open < maValue and maTypeChoice != 'None'
crossupalert = crossupCHECK and ta.crossover(k, d) and (k < bandno2 or d < bandno2)
crossdownalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno2 or d > bandno2)
crossupOSalert = crossupCHECK and ta.crossover(k, d) and (k < bandno1 or d < bandno1)
crossdownOBalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno0 or d > bandno0)
aboveBandalert = ta.crossunder(k, bandno0)
belowBandalert = ta.crossover(k, bandno1)
bgcolor(color=crossupalert and crossoverAlertBgColourMidOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert Background Colour (Middle Level)', transp=70)
bgcolor(color=crossupOSalert and crossoverAlertBgColourOBOSOnOff ? #fbc02d : crossdownOBalert and crossoverAlertBgColourOBOSOnOff ? #000000 : na, title='Crossover Alert Background Colour (OB/OS Level)', transp=70)
bgcolor(color=aboveBandalert and crossoverAlertBgColourGreaterThanOnOff ? #ff0014 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K > Upper level', transp=70)
bgcolor(color=belowBandalert and crossoverAlertBgColourLessThanOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K < Lower level', transp=70)
// alertcondition(crossupalert or crossdownalert, title='Stoch RSI Crossover', message='STOCH RSI CROSSOVER')
// Calculate start/end date and time condition
startDate = input(timestamp('2000-12-24T00:00:00'),group = "---------TIME RANGE SETTINGS---------")
finishDate = input(timestamp('2029-02-26T00:00:00'),group = "---------TIME RANGE SETTINGS---------")
time_cond = true
//ema filter
emalen = input(200,"EMA Filter Length",group = "EMA FILTER SETTINGS")
emasource = input(close,"EMA Filter Source",group = "EMA FILTER SETTINGS")
ema_fil = ta.ema(emasource,emalen)
plot(ema_fil,"EMA Filter")
//macd
fast_length = input(title="Fast Length", defval=26,group = "MACD FILTER SETTINGS")
slow_length = input(title="Slow Length", defval=100,group = "MACD FILTER SETTINGS")
src_macd = input(title="Source", defval=close,group = "MACD FILTER SETTINGS")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9,group = "MACD FILTER SETTINGS")
sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"],group = "MACD FILTER SETTINGS")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"],group = "MACD FILTER SETTINGS")
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src_macd, fast_length) : ta.ema(src_macd, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src_macd, slow_length) : ta.ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//tpsl
takeprofit=input.float(defval=0.3,title="Enter The Take Profit %",group="TP/SL CONDITION INPUTS HERE")/100
stoploss=input.float(defval=0.16,title="Enter The Stop %",group="TP/SL CONDITION INPUTS HERE")/100
tp = strategy.opentrades.entry_price(0)*takeprofit/syminfo.mintick
sl = strategy.opentrades.entry_price(0)*stoploss/syminfo.mintick
lg_rule = buysignal and hist > 0 and close > ema_fil
sh_rule = sellsignal and hist < 0 and close < ema_fil
// Plot Bull/Bear
plotshape(lg_rule, title='Bull', text='Bull', style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.black, 0), size=size.tiny)
plotshape(sh_rule, title='Bear', text='Bear', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.black, 0), size=size.tiny)
//alert
lg_entryal = input("Long entry","Long entry alert",group = "ALERT MESSAGE SETTINGS")
sh_entryal = input("Short entry","Short entry alert",group = "ALERT MESSAGE SETTINGS")
if lg_rule and time_cond and barstate.isconfirmed
strategy.entry("LONG",strategy.long)
alert(lg_entryal,alert.freq_once_per_bar_close)
if strategy.position_size > 0
strategy.exit("LONG EX","LONG",loss = sl,profit = tp,comment_loss = "LONG SL",comment_profit = "LONG TP")
if sh_rule and time_cond and barstate.isconfirmed
strategy.entry("SHORT",strategy.short)
alert(sh_entryal,alert.freq_once_per_bar_close)
if strategy.position_size < 0
strategy.exit("SHORT EX","SHORT",loss = sl,profit = tp,comment_loss = "SHORT SL",comment_profit = "SHORT TP")
//end