MACD Penutupan Strategy Hybrid Turtle

Penulis:ChaoZhang, Tarikh: 2023-10-30 12:16:20
Tag:

img

Ringkasan

Strategi ini menggabungkan isyarat salib emas dan salib mati penunjuk MACD, hubungan harga penutupan dengan garis median, dan ciri-ciri turun naik harga untuk menentukan titik masuk dan keluar. Ia juga menetapkan mekanisme masuk kembali dan pembetulan untuk mendapatkan lebih banyak peluang perdagangan sambil mengawal risiko dan merealisasikan pulangan yang stabil.

Prinsip Strategi

Strategi ini berdasarkan prinsip-prinsip berikut:

  1. Gunakan garis cepat MACD dan garis perlahan golden cross dan cross mati untuk menentukan pasaran bull dan bear dan titik kemasukan tertentu.

  2. Gunakan hubungan harga penutupan dengan garis median untuk menentukan akhir trend dan titik keluar.

  3. Tetapkan mekanisme kemasukan semula untuk memasuki semula pasaran ke arah yang sama selepas akhir trend MACD semasa untuk meningkatkan keuntungan.

  4. Tetapkan mekanisme kemasukan pembetulan untuk menambah kedudukan semasa pembetulan harga separa dalam trend.

  5. Sesuaikan kedudukan secara dinamik berdasarkan perkara di atas untuk memaksimumkan keuntungan dalam trend sambil keluar dengan cepat apabila trend berakhir.

Secara khusus, strategi ini terlebih dahulu memeriksa sama ada salib emas atau salib mati berlaku antara garis cepat dan perlahan MACD untuk pergi panjang atau pendek. Ia kemudian memeriksa sama ada harga penutupan menyentuh garis median untuk menentukan akhir trend dan menutup kedudukan.

Di samping itu, strategi ini mempunyai mekanisme kemasukan semula untuk membuka semula kedudukan dalam arah asal jika MACD terus menunjukkan isyarat ke arah yang sama selepas trend awal berakhir.

Melalui tetapan ini, strategi dapat menyesuaikan kedudukan secara dinamik, meningkatkan frekuensi masuk dan keluar, dan memaksimumkan pulangan sambil mengawal risiko dalam trend.

Kelebihan

Kelebihan utama strategi pelbagai penunjuk ini ialah:

  1. MACD mengenal pasti trend dan titik pembalikan untuk kemasukan.

  2. Hubungan harga penutupan dan garis median dengan tepat menentukan akhir trend.

  3. Masuk semula meningkatkan kecekapan penggunaan modal.

  4. Pendaftaran pembetulan menambah kedudukan tepat pada masanya untuk menangkap trend.

  5. Frekuensi perdagangan yang tinggi dengan risiko yang terkawal menghasilkan faktor keuntungan yang tinggi.

  6. Parameter yang boleh disesuaikan untuk pengoptimuman di seluruh produk dan pasaran.

  7. Logik yang jelas dan kod ringkas untuk perdagangan langsung yang mudah.

  8. Data backtest yang mencukupi memastikan kebolehpercayaan.

Risiko

Risiko utama ialah:

  1. Kemungkinan isyarat MACD yang salah perlu disahkan dengan penunjuk lain.

  2. Hentian yang terlalu ketat boleh dihentikan oleh pergerakan yang tidak menentu.

  3. Peningkatan kekerapan perdagangan memerlukan kawalan penggunaan modal.

  4. Masukan pembetulan boleh menyebabkan kerugian semasa menarik balik.

  5. Pengoptimuman yang diperlukan untuk produk dan pasaran yang berbeza.

  6. Memerlukan pengujian dan pengoptimuman yang berterusan.

  7. Kos slippage perlu dipertimbangkan untuk perdagangan langsung.

Langkah-langkah pengurusan risiko termasuk menggunakan hentian untuk mengehadkan kerugian, menilai penggunaan modal, mengoptimumkan parameter setiap produk melalui backtesting, memantau dinamik pasaran untuk memperbaiki parameter, dan perakaunan untuk tergelincir dalam ujian.

Peluang Peningkatan

Peluang peningkatan:

  1. Tambah penunjuk lain untuk mengesahkan isyarat, contohnya KDJ.

  2. Melaksanakan hentian dinamik adaptif.

  3. Mengoptimumkan logik kemasukan semula dan pembetulan.

  4. Pengoptimuman parameter untuk setiap produk.

  5. Mengoptimumkan penggunaan modal untuk entri.

  6. Memasukkan penunjuk jumlah untuk mengelakkan kerugian daripada entri menarik balik.

  7. Tambahkan mekanisme keluar seperti berhenti bergerak.

  8. Buat bot perdagangan automatik.

  9. Mengira faktor dunia sebenar seperti tergelincir.

Ini dapat meningkatkan kestabilan, kesesuaian, automasi, dan prestasi langsung.

Kesimpulan

Strategi ini mengintegrasikan isyarat MACD, analisis harga penutupan, dan pelbagai mekanisme kemasukan untuk memaksimumkan trend sambil mengawal risiko. Ia mempunyai kecekapan modal yang tinggi dan kemudahan pelaksanaan tetapi memerlukan kawalan risiko dan pengoptimuman. Automasi boleh menjadikannya sistem perdagangan kuantitatif yang kukuh.


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
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/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")

Lebih lanjut