Strategi Tren Crossover Rata-rata Bergerak Ganda

Penulis:ChaoZhang, Tanggal: 2023-11-22 17:29:04
Tag:

img

Gambaran umum

Dual Moving Average Crossover Trend Strategy adalah strategi mengikuti tren yang menghasilkan sinyal beli dan jual ketika garis rata-rata bergerak cepat dan lambat bersilang.

Logika Strategi

Strategi ini terutama menggunakan indikator berikut untuk penilaian:

  1. Garis rata-rata bergerak cepat dan lambat: salib emas untuk sinyal beli, salib kematian untuk sinyal jual.

  2. MACD: Garis MACD di atas Garis Sinyal dan kenaikan MACD terendah untuk sinyal bullish.

  3. RSI: RSI di atas 50 untuk bullish, di bawah 50 untuk bearish.

  4. Awesome Oscillator (AO): AO melintasi di atas garis 0 untuk membeli, melintasi di bawah untuk menjual.

  5. Tiga rata-rata bergerak harian: periode harian MA yang lebih pendek melintasi di atas periode harian MA yang lebih lama sebagai sinyal beli.

Strategi ini menggabungkan beberapa kerangka waktu dan indikator untuk menghasilkan logika beli dan jual. Ini menghasilkan pesanan beli ketika beberapa indikator menunjukkan sinyal bullish pada saat yang sama, dan penjualan pesanan ketika sinyal bearish muncul, untuk melacak tren.

Analisis Keuntungan

Strategi ini memiliki keuntungan berikut:

  1. Kombinasi multi-indikator mengurangi sinyal palsu dan meningkatkan akurasi.

  2. Menggabungkan beberapa kerangka waktu mengidentifikasi arah tren yang lebih besar.

  3. Pengaturan parameter memberikan profitabilitas yang baik.

  4. Mengadopsi stop loss bergerak untuk mengontrol risiko dan membatasi kerugian.

  5. Pelacakan tren otomatis tanpa intervensi manual, mengurangi biaya.

Analisis Risiko

Ini juga memiliki beberapa risiko:

  1. Lebih banyak whipsaws mungkin terjadi di pasar yang terikat rentang.

  2. Black Swan event bisa menyebabkan penurunan tajam, atur stop loss untuk membatasi kerugian.

  3. Logika pembelian/penjualan yang kompleks bergantung pada data historis yang besar untuk menemukan parameter optimal.

  4. Pengaturan stop loss yang tidak tepat mengarah pada keluar prematur.

Arahan Optimasi

Strategi dapat ditingkatkan dari aspek berikut:

  1. Uji lebih banyak kombinasi indikator untuk sinyal yang lebih stabil dan akurat, seperti indeks volatilitas, OBV dll.

  2. Mengoptimalkan parameter indikator dengan pembelajaran mesin dan algoritma genetik untuk mengurangi overtrading.

  3. Memperkenalkan teknik model ensemble untuk mengintegrasikan sinyal dari beberapa model strategi independen, meningkatkan ketahanan.

  4. Masuk trading pada jangka waktu yang lebih tinggi, keluar pada jangka waktu yang lebih rendah.

  5. Membangun modul pengendalian risiko kuantitatif dengan batas ketat pada persentase stop loss per perdagangan, penarikan maksimum dll.

Ringkasan

Strategi Trend Crossover Dual Moving Average menggunakan persilangan MA yang cepat dan lambat sebagai sinyal perdagangan, bersama dengan MACD, RSI untuk menilai arah tren untuk pelacakan tren otomatis. Ruang pengoptimalan yang signifikan ada dengan menggabungkan lebih banyak indikator, penyesuaian parameter, ensemble model dll untuk efektivitas strategi yang lebih baik.


/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('SteffVans', shorttitle='SteffVans strategy', overlay=true, process_orders_on_close = true)

// Input settings
macd_fast_length = input(12)
macd_slow_length = input(26)
macd_signal_length = input(9)

// Calculate MACD values
[macd_line, signal_line, _] = ta.macd(close, macd_fast_length, macd_slow_length, macd_signal_length)
mg = ta.lowest(signal_line, 30) >= -0

// RSI
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1)
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
RSI = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))


//  AO
AO = ta.sma((high + low) / 2, 5) - ta.sma((high + low) / 2, 34)
crossaosell = AO < AO[1] and AO[1] < AO[2] and AO[2] > AO[3]  and ta.lowest(low,3)

// Uptrend sma
len1 = input.int(5, minval=1)
len2 = input.int(10, minval=1)
len3 = input.int(20, minval=1)
src = input(close)

out1 = ta.sma(src, len1)
out2 = ta.sma(src, len2)
out3 = ta.sma(src, len3)



// Timeframe 
macdl60 = request.security(syminfo.tickerid, "60", signal_line,lookahead = barmerge.lookahead_on)
ao = request.security(syminfo.tickerid, "60", AO,lookahead = barmerge.lookahead_on)
rsi = request.security(syminfo.tickerid, "60", RSI,lookahead = barmerge.lookahead_on)
good = request.security(syminfo.tickerid, "60", mg,lookahead = barmerge.lookahead_on)
bad = request.security(syminfo.tickerid, "60", crossaosell,lookahead = barmerge.lookahead_on)

ma1 = request.security(syminfo.tickerid, "D", out1,lookahead = barmerge.lookahead_on)
ma2 = request.security(syminfo.tickerid, "D", out2, lookahead = barmerge.lookahead_on)
ma3 = request.security(syminfo.tickerid, "D", out3, lookahead = barmerge.lookahead_on)






// Kriteria BUY and SELL
uptrend1 =  request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) > ma1 and ma1 > ma3 and ma2 > ma3
uptrend2 = ta.lowest(ma1,12) > ta.lowest(ma3,12) and ta.lowest(ma2,12) > ta.lowest(ma3,12) 


 

// Triger BUY and SELL 
cross1 = ao > ao[1] and ao[1] < ao[2] and ao > 0 and good and rsi >= 60 and uptrend1
cross2 = ao > 0 and ao[1] < 0 and good and rsi >=50 and uptrend1
cross3 =  ao > 0 and ao[1] < 0 and not good and uptrend2 and uptrend1
cross4 =  ao > ao[1] and ao[1] > ao[2] and ao[2] < ao[3] and ao[3] < ao[4]  and not good and uptrend2 and uptrend1

s1 = ao < ao[1] and ao[1] < ao[2] and ao[2] < ao[3] and ao > 0 and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1
s2 =  ao < 0 and ao < ao[2] and rsi < 50 and request.security(syminfo.tickerid, "D", close,lookahead = barmerge.lookahead_on) < ma1 

// Variabel Buy dan Sell
buySignal = false
sellSignal = false

// Syarat masuk Buy
buyCondition =  cross1 or cross2 or cross3 or cross4
if buyCondition
    buySignal := true

// Syarat masuk Sell
sellCondition = s1 or s2
if sellCondition
    sellSignal := true

// Reset sinyal jika ada sinyal berulang
if buySignal and sellSignal
    sellSignal := false
if sellSignal and buySignal
    buySignal := false

// Logika perdagangan
if buySignal
    strategy.entry("Buy", strategy.long, comment = "BUY")
if sellSignal
    strategy.close("Buy")


plotshape(cross1,title = "Stefkuy1", style = shape.labelup, location = location.belowbar, color = color.green,text = "1", textcolor = color.white,size = size.small)
plotshape(cross2,title = "Stefkuy2", style = shape.labelup, location = location.belowbar, color = color.green, text = "2", textcolor= color.white, size = size.small)
plotshape(cross3,title = "StefVan1", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "3", textcolor= color.white,size = size.small)
plotshape(cross4,title = "StefVan2", style = shape.labelup, location = location.belowbar, color = color.rgb(0, 153, 255), text = "4", textcolor= color.white,size = size.small)


Lebih banyak