Strategi Trend Crossover Purata Bergerak Berganda

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

img

Ringkasan

Dual Moving Average Crossover Trend Strategy adalah strategi trend yang menghasilkan isyarat beli dan jual apabila garis purata bergerak pantas dan perlahan bersilang.

Logika Strategi

Strategi ini terutamanya menggunakan penunjuk berikut untuk penilaian:

  1. Garis purata bergerak pantas dan perlahan: salib emas untuk isyarat beli, salib kematian untuk isyarat jual.

  2. MACD: Garis MACD di atas Garis Isyarat dan kenaikan MACD terendah untuk isyarat kenaikan.

  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 purata bergerak harian: tempoh MA harian yang lebih pendek melintasi di atas MA harian tempoh yang lebih lama sebagai isyarat beli.

Strategi ini menggabungkan pelbagai jangka masa dan penunjuk untuk menjana logik beli dan jual. Ia menghasilkan pesanan beli apabila beberapa penunjuk menunjukkan isyarat kenaikan pada masa yang sama, dan pesanan jual apabila isyarat penurunan muncul, untuk mengesan trend.

Analisis Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Kombo multi-penunjuk mengurangkan isyarat palsu dan meningkatkan ketepatan.

  2. Menggabungkan beberapa bingkai masa mengenal pasti arah trend yang lebih besar.

  3. Penyesuaian parameter memberikan keuntungan yang baik.

  4. Mengambil alih stop loss untuk mengawal risiko dan had kerugian.

  5. Pengesanan trend automatik tanpa campur tangan manual, mengurangkan kos.

Analisis Risiko

Ia juga mempunyai beberapa risiko:

  1. Lebih banyak whipsaws mungkin berlaku di pasaran yang terhad.

  2. Peristiwa Black Swan boleh menyebabkan penurunan tajam.

  3. Logik beli / jual yang kompleks bergantung pada data sejarah yang besar untuk mencari parameter yang optimum.

  4. Tetapan stop loss yang tidak sesuai membawa kepada keluar awal. berulang kali backtest untuk mencari parameter terbaik.

Arahan pengoptimuman

Strategi ini boleh ditingkatkan dari aspek berikut:

  1. Uji lebih banyak kombinasi penunjuk untuk isyarat yang lebih stabil dan tepat, seperti indeks turun naik, OBV dll.

  2. Mengoptimumkan parameter penunjuk dengan pembelajaran mesin dan algoritma genetik untuk mengurangkan overtrading.

  3. Memperkenalkan teknik ensemble model untuk mengintegrasikan isyarat dari pelbagai model strategi bebas, meningkatkan ketahanan.

  4. Memasuki perdagangan pada jangka masa yang lebih tinggi, keluar pada jangka masa yang lebih rendah.

  5. Membina modul kawalan risiko kuantitatif dengan had yang ketat pada peratusan stop loss setiap perdagangan, pengeluaran maksimum dll.

Ringkasan

Strategi Trend Crossover Dual Moving Average menggunakan persilangan MA yang cepat dan perlahan sebagai isyarat perdagangan, bersama dengan MACD, RSI untuk menilai arah trend untuk penjejakan trend automatik. ruang pengoptimuman yang signifikan wujud dengan menggabungkan lebih banyak penunjuk, penyesuaian parameter, ensemble model dll untuk keberkesanan 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 lanjut