B-Xtrender Eksponensial Moving Average Crossover Strategi

Penulis:ChaoZhang, Tarikh: 2024-02-20 14:45:17
Tag:

img

Ringkasan

Ini adalah strategi dagangan berdasarkan prinsip persilangan purata bergerak eksponensial (EMA). Ia juga menggabungkan penunjuk RSI dan penapis purata bergerak untuk membentuk sistem perdagangan trend berikut dan pembalikan yang agak lengkap.

Logika Strategi

  1. Menghasilkan isyarat dagangan melalui silang EMA yang cepat dan perlahan. Garis cepat menggunakan silang EMA 5 dan 20 hari manakala garis perlahan menggunakan silang EMA 20 dan 15 hari.
  2. Pergi panjang apabila garis pantas melintasi di atas garis perlahan, dan pergi pendek apabila garis pantas melintasi di bawah.
  3. Tambah penapis purata bergerak 200 hari untuk mengelakkan isyarat semasa tempoh yang bergolak. Perdagangan hanya diambil apabila harga memecahkan MA asas ini terlebih dahulu.

Kelebihan

  1. Pengesahan RSI meningkatkan kebolehpercayaan isyarat dengan ketara dan mengurangkan isyarat palsu.
  2. Pilihan parameter EMA menyeimbangkan kepekaan dan kestabilan.
  3. Penapis MA menghilangkan bunyi bising untuk mengelakkan perdagangan yang tidak perlu.

Risiko

  1. EMA mempunyai isu kelewatan pada turun naik harga tajam, peningkatan kerugian atau isyarat yang hilang.
  2. Tetapan RSI yang lemah juga boleh membawa kelewatan isyarat.
  3. Penapis MA boleh menapis isyarat trend awal.

Peluang Peningkatan

  1. Mengoptimumkan parameter EMA secara dinamik merentasi kitaran.
  2. Bereksperimen dengan penunjuk lain seperti MACD untuk digabungkan dengan RSI.
  3. Parameter penapis MA tune halus untuk pengurangan bunyi bising yang optimum dan menangkap peluang.

Kesimpulan

Ini adalah strategi yang kukuh dalam membina sistem perdagangan EMA yang lengkap, dengan pengesahan RSI tambahan untuk meningkatkan kualiti isyarat. Ia bernilai dikaji dan dioptimumkan.


/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 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/
// © QuantTherapy
//@version=4
strategy("B-Xtrender [Backtest Edition] @QuantTherapy")

i_short_l1  = input(5 , title="[Short] L1")
i_short_l2  = input(20, title="[Short] L2")
i_short_l3  = input(15, title="[Short] L3")

i_long_l1   = input(20, title="[Long] L1")
i_long_l2   = input(15, title="[Long] L2")

i_ma_use    = input(true , title="[MA Filter] Yes/No" )
i_ma_len    = input(200  , title="[MA Filter] length" )
i_ma_type   = input("EMA", title="[MA Filter] type", options = ["SMA", "EMA"])

shortTermXtrender = rsi( ema(close, i_short_l1) - ema(close, i_short_l2), i_short_l3 ) - 50
longTermXtrender  = rsi( ema(close, i_long_l1), i_long_l2 ) - 50

shortXtrenderCol = shortTermXtrender > 0 ? shortTermXtrender > shortTermXtrender[1] ? color.lime : #228B22 : shortTermXtrender > shortTermXtrender[1] ? color.red : #8B0000
plot(shortTermXtrender, color=shortXtrenderCol, style=plot.style_columns, linewidth=1, title="B-Xtrender Osc. - Histogram", transp = 40)

longXtrenderCol   = longTermXtrender> 0 ? longTermXtrender > longTermXtrender[1] ? color.lime : #228B22 : longTermXtrender > longTermXtrender[1] ? color.red : #8B0000
macollongXtrenderCol =  longTermXtrender > longTermXtrender[1] ? color.lime : color.red
plot(longTermXtrender , color=longXtrenderCol, style=plot.style_columns, linewidth=2, title="B-Xtrender Trend - Histogram", transp = 90)

plot(longTermXtrender , color=#000000             , style=plot.style_line, linewidth=5, title="B-Xtrender Trend - Line", transp = 100)
plot(longTermXtrender , color=macollongXtrenderCol, style=plot.style_line, linewidth=3, title="B-Xtrender Trend - Line", transp = 100)

// --- Initialize MA Filter
ma = i_ma_type == "EMA" ? ema(close, i_ma_len) : sma(close, i_ma_len)
maFilterLong = true
maFilterShort = true
if i_ma_use
    maFilterLong  := close > ma ? true : false
    maFilterShort := close < ma ? true : false

long  = shortTermXtrender > 0 and longTermXtrender > 0 and maFilterLong
closeLong = shortTermXtrender < 0 or longTermXtrender < 0 
short = shortTermXtrender < 0 and longTermXtrender < 0 and maFilterShort
closeShort = shortTermXtrender > 0 or longTermXtrender > 0 

plotshape(long[1]==true  and long[2]==false  ? 0 : na , location=location.absolute, style=shape.labelup  , color=color.lime, size=size.small, transp=10)
plotshape(short[1]==true and short[2]==false ? 0 : na, location=location.absolute, style=shape.labeldown, color=color.red , size=size.small, transp=10)
plotshape(closeLong[1]==true and closeLong[2]==false
 or closeShort[1]==true and closeShort[2]==false ? 0 : na, location=location.absolute, style=shape.circle, color=color.orange , size=size.small)

i_perc     = input(defval = 20.0, title = "[TSL-%] Percent"  , minval = 0.1 )
i_src = close // constant for calculation
sl_val = i_src * i_perc / 100

strategy.entry("Long", strategy.long, when = long ) 
strategy.close("Long", when = closeLong)

strategy.entry("Short", strategy.short, when = short) 
strategy.close("Short", when = closeShort)

// Calculate SL
longStopPrice = 0.0, shortStopPrice = 0.0
longStopPrice := if (strategy.position_size > 0)
    stopValue = close - sl_val
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if (strategy.position_size < 0)
    stopValue = close + sl_val
    min(stopValue, shortStopPrice[1])
else
    syminfo.mintick*1000000

// For TSL Visualisation on Chart    
// plot(series=(strategy.position_size > 0) ? longStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Long Trail Stop")
     
// plot(series=(strategy.position_size < 0) ? shortStopPrice : na,
//      color=color.fuchsia, style = plot.style_circles,
//      linewidth=1, title="Short Trail Stop")

if (strategy.position_size > 0)
    strategy.exit(id="TSL Long", stop=longStopPrice)

if (strategy.position_size < 0)
    strategy.exit(id="TSL Short", stop=shortStopPrice)    

Lebih lanjut