Strategi Hibrida Kura-kura Median Penutupan MACD


Tanggal Pembuatan: 2023-10-30 12:16:20 Akhirnya memodifikasi: 2023-10-30 12:16:20
menyalin: 1 Jumlah klik: 630
1
fokus pada
1617
Pengikut

Strategi Hibrida Kura-kura Median Penutupan MACD

Ringkasan

Strategi ini menggabungkan sinyal Forex MACD, hubungan harga K-line dengan garis tengah, dan karakteristik harga yang bergoyang untuk menentukan kapan masuk dan keluar, serta mengatur mekanisme masuk kembali dan koreksi untuk mendapatkan lebih banyak peluang perdagangan, serta mengendalikan risiko dan mencapai keuntungan yang stabil.

Prinsip Strategi

Strategi ini didasarkan pada prinsip-prinsip berikut:

  1. Analisis MACD dari garis cepat dan garis lambat digunakan untuk menilai pasar multihead dan kosong, serta titik masuk tertentu.

  2. Gunakan hubungan antara harga K-line dan garis tengah untuk menentukan apakah tren bullish berakhir, dan titik awal.

  3. Menetapkan mekanisme re-entry untuk meningkatkan peluang keuntungan dengan re-entry setelah MACD berakhir, jika terus sesuai dengan tren.

  4. Menetapkan mekanisme koreksi masuk, jika harga mengalami koreksi sebagian tetapi belum terbalik, maka akan ditambahkan posisi, yang merupakan koreksi dalam tren.

  5. Menggabungkan poin-poin di atas, secara dinamis menyesuaikan posisi, mendapatkan keuntungan sebanyak mungkin dalam tren, dan keluar dari tren dengan cepat ketika tren berakhir.

Secara khusus, strategi pertama-tama menilai apakah garis cepat dan lambat MACD mengalami forks emas atau forks mati, jika forks emas lebih banyak, jika forks mati kosong; kemudian menilai apakah garis K mendekati garis tengah, dan jika disentuh, itu dianggap sebagai akhir tren dan posisi kosong.

Selain itu, strategi juga menyiapkan mekanisme re-entry, yaitu setelah berakhirnya tren di arah asli, jika MACD terus menunjukkan sinyal ke arah yang sama, strategi akan membuka posisi untuk mengikuti tren lagi; juga menyiapkan mekanisme koreksi masuk, jika harga mengalami penyesuaian kecil tetapi belum sepenuhnya berbalik, strategi akan meningkatkan posisi dengan tepat, yang merupakan tindakan normal dalam penyesuaian tren.

Dengan pengaturan ini, strategi dapat secara dinamis menyesuaikan posisi dalam tren, masuk dan keluar lebih banyak, dan mendapatkan keuntungan yang lebih tinggi dengan asumsi pengendalian risiko.

Keunggulan Strategis

Strategi ini menggabungkan beberapa indikator dan memiliki beberapa keuntungan utama:

  1. MACD dapat mengidentifikasi tren dan titik balik, menentukan titik masuk tertentu.

  2. Perbandingan antara harga close out dan garis tengah memberikan penilaian yang akurat tentang akhir tren.

  3. Mekanisme re-entry meningkatkan jumlah pembukaan posisi dan meningkatkan efisiensi penggunaan dana.

  4. Adapun beberapa hal yang perlu diperhatikan adalah:

  5. Operasi strategi ini memiliki frekuensi yang tinggi, tetapi risiko dapat dikontrol, dan faktor keuntungan yang lebih tinggi dapat diperoleh dengan mudah.

  6. Parameter dapat disesuaikan dan dioptimalkan untuk varietas dan situasi yang berbeda.

  7. Strategi yang jelas dan mudah dimengerti, kode yang ditulis sederhana, dan operasi yang mudah.

  8. Data pengamatan cukup, reliabilitas tinggi, dan hasil yang mudah diverifikasi.

Risiko Strategis

Strategi ini juga memiliki risiko utama sebagai berikut:

  1. Probabilitas MACD mengirimkan sinyal palsu, yang perlu digabungkan dengan indikator lain untuk verifikasi.

  2. Stop loss yang terlalu kecil pada level besar dapat menyebabkan terjadinya kebocoran besar.

  3. Re-entry dan Re-correct entry meningkatkan frekuensi operasi, perlu mengontrol pemanfaatan dana.

  4. “Kembali ke pasar, kita bisa mendapatkan keuntungan lebih banyak dari yang kita dapatkan”, kata dia.

  5. Varietas perdagangan dan parameter pengaturan perlu dioptimalkan, tidak berlaku untuk semua varietas.

  6. Perlu pengukuran dan optimalisasi terus menerus, dengan penyesuaian parameter berdasarkan pasar.

  7. Efek dari biaya slippage harus dipertimbangkan dalam real-time.

Langkah-langkah manajemen risiko yang sesuai meliputi: pengaturan stop loss untuk memastikan kerugian tunggal terbatas; mengevaluasi pemanfaatan dana, menjaga cadangan uang tunai yang wajar; melakukan pengembalian terhadap kombinasi parameter yang sesuai untuk memilih varietas; terus memperhatikan perubahan karakteristik pasar untuk mengoptimalkan parameter; mempertimbangkan dampak biaya slip dalam pengembalian dan simulasi.

Arah optimasi strategi

Strategi ini dapat dioptimalkan lebih lanjut dalam beberapa hal:

  1. Kombinasi dengan indikator lain untuk verifikasi sinyal, meningkatkan akurasi sinyal. Seperti indikator KDJ.

  2. Tetapkan standar stop loss adaptif dinamis.

  3. Optimalkan masuk kembali dan modifikasi logika persyaratan masuk.

  4. Optimalisasi parameter subspesies, pengaturan kombinasi parameter optimal.

  5. Mengoptimalkan rasio pemanfaatan dana, menetapkan batas dana untuk masuk kembali dan koreksi masuk.

  6. Indikator kuantitatif gabungan untuk menghindari kerugian berlanjut dalam situasi rebound.

  7. Menambahkan mekanisme penarikan diri, seperti pengaturan mobile stop loss dan sebagainya.

  8. Pertimbangkan untuk menggunakan paket strategi sebagai robot perdagangan untuk melakukan perdagangan otomatis.

  9. Menambahkan pertimbangan disk seperti biaya slippoint.

Dengan optimasi ini, stabilitas, adaptasi, tingkat otomatisasi, dan efektivitas strategi dapat ditingkatkan lebih lanjut.

Meringkaskan

Strategi ini mengintegrasikan sinyal perdagangan dengan menggunakan indikator MACD, analisis harga K-line dan mekanisme masuk beberapa kali, dan mengendalikan risiko sambil menangkap tren, merupakan ide strategi perdagangan kuantitatif yang lebih efisien. Strategi ini memiliki frekuensi operasi yang tinggi, pemanfaatan modal yang baik, kesulitan yang rendah untuk mencapai, tetapi juga memerlukan perhatian pada pengendalian risiko dan pengoptimalan strategi, dengan nilai praktis yang kuat dan ruang untuk pengembangan.

Kode Sumber Strategi
/*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", "")