MACD Menutup Strategi Hybrid Turtle

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

img

Gambaran umum

Strategi ini menggabungkan sinyal golden cross dan dead cross indikator MACD, hubungan harga penutupan dengan garis median, dan karakteristik volatilitas harga untuk menentukan titik masuk dan keluar.

Prinsip Strategi

Strategi ini didasarkan pada prinsip-prinsip berikut:

  1. Gunakan garis cepat MACD dan garis lambat golden cross dan dead cross untuk menentukan pasar bull dan bear dan titik masuk tertentu.

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

  3. Menetapkan mekanisme re-entry untuk kembali memasuki pasar ke arah yang sama setelah akhir tren MACD saat ini untuk meningkatkan keuntungan.

  4. Menetapkan mekanisme entri koreksi untuk menambahkan posisi selama koreksi harga parsial dalam tren.

  5. Secara dinamis menyesuaikan posisi berdasarkan hal di atas untuk memaksimalkan keuntungan dalam tren sambil keluar dengan cepat ketika tren berakhir.

Secara khusus, strategi ini terlebih dahulu memeriksa apakah ada golden cross atau dead cross yang terjadi antara garis cepat dan lambat MACD untuk pergi panjang atau pendek.

Selain itu, strategi ini memiliki mekanisme re-entry untuk membuka kembali posisi ke arah awal jika MACD terus menunjukkan sinyal ke arah yang sama setelah tren awal berakhir.

Melalui pengaturan ini, strategi dapat secara dinamis menyesuaikan posisi, meningkatkan frekuensi masuk dan keluar, dan memaksimalkan pengembalian sambil mengendalikan risiko dalam tren.

Keuntungan

Keuntungan utama dari strategi multi-indikator ini adalah:

  1. MACD mengidentifikasi tren dan titik pembalikan untuk masuk.

  2. Hubungan harga penutupan dan garis median secara akurat menentukan akhir tren.

  3. Re-entry meningkatkan efisiensi pemanfaatan modal.

  4. Koreksi entri tepat waktu menambahkan posisi untuk menangkap tren.

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

  6. Parameter yang dapat disesuaikan untuk optimasi di berbagai produk dan pasar.

  7. Logika yang jelas dan kode yang ringkas untuk perdagangan langsung yang mudah.

  8. Data backtest yang cukup memastikan keandalan.

Risiko

Risiko utama adalah:

  1. Kemungkinan sinyal MACD yang salah perlu diverifikasi dengan indikator lain.

  2. Stop yang terlalu ketat bisa dihentikan oleh gerakan yang tidak stabil.

  3. Peningkatan frekuensi perdagangan membutuhkan pengendalian pemanfaatan modal.

  4. Entri koreksi dapat menyebabkan kerugian selama penarikan.

  5. Optimasi yang diperlukan untuk produk dan pasar yang berbeda.

  6. Membutuhkan backtesting dan optimasi yang berkelanjutan.

  7. Biaya slippage perlu dipertimbangkan untuk perdagangan langsung.

Langkah-langkah manajemen risiko termasuk menggunakan stop untuk membatasi kerugian, mengevaluasi pemanfaatan modal, mengoptimalkan parameter per produk melalui backtesting, memantau dinamika pasar untuk memperbaiki parameter, dan memperhitungkan slippage dalam tes.

Peluang Peningkatan

Peluang peningkatan:

  1. Tambahkan indikator lain untuk memverifikasi sinyal, misalnya KDJ.

  2. Mengimplementasikan adaptif berhenti dinamis.

  3. Mengoptimalkan masuk kembali dan koreksi masuk logika.

  4. Optimasi parameter per produk.

  5. Mengoptimalkan pemanfaatan modal untuk entri.

  6. Masukkan indikator volume untuk menghindari kerugian dari entri mundur.

  7. Tambahkan mekanisme keluar seperti berhenti bergerak.

  8. Bangun robot perdagangan otomatis.

  9. Perhitungkan faktor dunia nyata seperti slippage.

Ini dapat lebih meningkatkan stabilitas, kemampuan beradaptasi, otomatisasi, dan kinerja langsung.

Kesimpulan

Strategi ini mengintegrasikan sinyal MACD, analisis harga penutupan, dan beberapa mekanisme entri untuk memaksimalkan tren sambil mengendalikan risiko.


/*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 banyak